koffi 2.2.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/ChangeLog.md +6 -0
  2. package/package.json +2 -2
  3. package/src/koffi/build/2.2.1/koffi_darwin_arm64.tar.gz +0 -0
  4. package/src/koffi/build/2.2.1/koffi_darwin_x64.tar.gz +0 -0
  5. package/src/koffi/build/2.2.1/koffi_freebsd_arm64.tar.gz +0 -0
  6. package/src/koffi/build/2.2.1/koffi_freebsd_ia32.tar.gz +0 -0
  7. package/src/koffi/build/2.2.1/koffi_freebsd_x64.tar.gz +0 -0
  8. package/src/koffi/build/2.2.1/koffi_linux_arm32hf.tar.gz +0 -0
  9. package/src/koffi/build/2.2.1/koffi_linux_arm64.tar.gz +0 -0
  10. package/src/koffi/build/2.2.1/koffi_linux_ia32.tar.gz +0 -0
  11. package/src/koffi/build/2.2.1/koffi_linux_riscv64hf64.tar.gz +0 -0
  12. package/src/koffi/build/2.2.1/koffi_linux_x64.tar.gz +0 -0
  13. package/src/koffi/build/2.2.1/koffi_openbsd_ia32.tar.gz +0 -0
  14. package/src/koffi/build/2.2.1/koffi_openbsd_x64.tar.gz +0 -0
  15. package/src/koffi/build/2.2.1/koffi_win32_arm64.tar.gz +0 -0
  16. package/src/koffi/build/2.2.1/koffi_win32_ia32.tar.gz +0 -0
  17. package/src/koffi/build/2.2.1/koffi_win32_x64.tar.gz +0 -0
  18. package/src/koffi/src/abi_arm32.cc +1 -0
  19. package/src/koffi/src/abi_arm64.cc +1 -0
  20. package/src/koffi/src/abi_riscv64.cc +1 -0
  21. package/src/koffi/src/abi_x64_sysv.cc +1 -0
  22. package/src/koffi/src/abi_x64_win.cc +1 -0
  23. package/src/koffi/src/abi_x86.cc +1 -0
  24. package/src/koffi/src/call.cc +2 -0
  25. package/src/koffi/src/ffi.cc +5 -5
  26. package/src/koffi/test/callbacks.js +19 -0
  27. package/src/koffi/test/misc.c +11 -0
  28. package/src/koffi/build/2.2.0/koffi_darwin_arm64.tar.gz +0 -0
  29. package/src/koffi/build/2.2.0/koffi_darwin_x64.tar.gz +0 -0
  30. package/src/koffi/build/2.2.0/koffi_freebsd_arm64.tar.gz +0 -0
  31. package/src/koffi/build/2.2.0/koffi_freebsd_ia32.tar.gz +0 -0
  32. package/src/koffi/build/2.2.0/koffi_freebsd_x64.tar.gz +0 -0
  33. package/src/koffi/build/2.2.0/koffi_linux_arm32hf.tar.gz +0 -0
  34. package/src/koffi/build/2.2.0/koffi_linux_arm64.tar.gz +0 -0
  35. package/src/koffi/build/2.2.0/koffi_linux_ia32.tar.gz +0 -0
  36. package/src/koffi/build/2.2.0/koffi_linux_riscv64hf64.tar.gz +0 -0
  37. package/src/koffi/build/2.2.0/koffi_linux_x64.tar.gz +0 -0
  38. package/src/koffi/build/2.2.0/koffi_openbsd_ia32.tar.gz +0 -0
  39. package/src/koffi/build/2.2.0/koffi_openbsd_x64.tar.gz +0 -0
  40. package/src/koffi/build/2.2.0/koffi_win32_arm64.tar.gz +0 -0
  41. package/src/koffi/build/2.2.0/koffi_win32_ia32.tar.gz +0 -0
  42. package/src/koffi/build/2.2.0/koffi_win32_x64.tar.gz +0 -0
package/ChangeLog.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  ## History
4
4
 
5
+ ### Koffi 2.2.1
6
+
7
+ **Main fixes:**
8
+
9
+ - Fix crash when [calling callback again after FFI call inside previous callback](https://github.com/Koromix/rygel/issues/15)
10
+
5
11
  ### Koffi 2.2.0
6
12
 
7
13
  **New features:**
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koffi",
3
- "version": "2.2.0",
4
- "stable": "2.2.0",
3
+ "version": "2.2.1",
4
+ "stable": "2.2.1",
5
5
  "description": "Fast and simple C FFI (foreign function interface) for Node.js",
6
6
  "keywords": [
7
7
  "foreign",
@@ -495,6 +495,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
495
495
 
496
496
  void CallData::Execute()
497
497
  {
498
+ RG_DEFER_C(prev_call = exec_call) { exec_call = prev_call; };
498
499
  exec_call = this;
499
500
 
500
501
  #define PERFORM_CALL(Suffix) \
@@ -563,6 +563,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
563
563
 
564
564
  void CallData::Execute()
565
565
  {
566
+ RG_DEFER_C(prev_call = exec_call) { exec_call = prev_call; };
566
567
  exec_call = this;
567
568
 
568
569
  #define PERFORM_CALL(Suffix) \
@@ -410,6 +410,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
410
410
 
411
411
  void CallData::Execute()
412
412
  {
413
+ RG_DEFER_C(prev_call = exec_call) { exec_call = prev_call; };
413
414
  exec_call = this;
414
415
 
415
416
  #define PERFORM_CALL(Suffix) \
@@ -474,6 +474,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
474
474
 
475
475
  void CallData::Execute()
476
476
  {
477
+ RG_DEFER_C(prev_call = exec_call) { exec_call = prev_call; };
477
478
  exec_call = this;
478
479
 
479
480
  #define PERFORM_CALL(Suffix) \
@@ -285,6 +285,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
285
285
 
286
286
  void CallData::Execute()
287
287
  {
288
+ RG_DEFER_C(prev_call = exec_call) { exec_call = prev_call; };
288
289
  exec_call = this;
289
290
 
290
291
  #define PERFORM_CALL(Suffix) \
@@ -366,6 +366,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
366
366
 
367
367
  void CallData::Execute()
368
368
  {
369
+ RG_DEFER_C(prev_call = exec_call) { exec_call = prev_call; };
369
370
  exec_call = this;
370
371
 
371
372
  #define PERFORM_CALL(Suffix) \
@@ -46,6 +46,8 @@ CallData::~CallData()
46
46
  if (!--mem->depth && mem->temporary) {
47
47
  delete mem;
48
48
  }
49
+
50
+ instance = nullptr;
49
51
  }
50
52
 
51
53
  bool CallData::PushString(Napi::Value value, int directions, const char **out_str)
@@ -972,16 +972,16 @@ static Napi::Value GetTypeDefinition(const Napi::CallbackInfo &info)
972
972
  Napi::Object members = Napi::Object::New(env);
973
973
 
974
974
  for (const RecordMember &member: type->members) {
975
- Napi::Object info = Napi::Object::New(env);
975
+ Napi::Object obj = Napi::Object::New(env);
976
976
 
977
977
  Napi::External<TypeInfo> external = Napi::External<TypeInfo>::New(env, (TypeInfo *)member.type);
978
978
  SetValueTag(instance, external, &TypeInfoMarker);
979
979
 
980
- info.Set("name", member.name);
981
- info.Set("type", external);
982
- info.Set("offset", member.offset);
980
+ obj.Set("name", member.name);
981
+ obj.Set("type", external);
982
+ obj.Set("offset", member.offset);
983
983
 
984
- members.Set(member.name, info);
984
+ members.Set(member.name, obj);
985
985
  }
986
986
 
987
987
  defn.Set("members", members);
@@ -41,6 +41,7 @@ const ApplyCallback = koffi.callback('int __stdcall ApplyCallback(int a, int b,
41
41
  const IntCallback = koffi.callback('int IntCallback(int x)');
42
42
  const VectorCallback = koffi.callback('int VectorCallback(int len, Vec2 *vec)');
43
43
  const SortCallback = koffi.callback('int SortCallback(const void *ptr1, const void *ptr2)');
44
+ const CharCallback = koffi.callback('int CharCallback(int idx, char c)');
44
45
 
45
46
  const StructCallbacks = koffi.struct('StructCallbacks', {
46
47
  first: koffi.pointer(IntCallback),
@@ -75,6 +76,8 @@ async function test() {
75
76
  const CallCallback = lib.func('int CallCallback(int x)');
76
77
  const MakeVectors = lib.func('int MakeVectors(int len, VectorCallback *func)');
77
78
  const CallQSort = lib.func('void CallQSort(_Inout_ void *base, size_t nmemb, size_t size, SortCallback *cb)');
79
+ const CallMeChar = lib.func('int CallMeChar(CharCallback *func)');
80
+ const GetMinusOne1 = lib.func('int8_t GetMinusOne1(void)');
78
81
 
79
82
  // Simple test similar to README example
80
83
  {
@@ -230,4 +233,20 @@ async function test() {
230
233
 
231
234
  assert.deepEqual(array, ['123', 'bar', 'foo', 'foobar']);
232
235
  }
236
+
237
+ // Make sure thread local CallData is restored after nested call inside callback
238
+ // Regression test for issue #15
239
+ {
240
+ let chars = [97, 98];
241
+
242
+ let cb = koffi.register((idx, c) => {
243
+ assert.equal(GetMinusOne1(), -1);
244
+ assert.equal(c, chars[idx]);
245
+
246
+ return c;
247
+ }, 'CharCallback *');
248
+
249
+ let ret = CallMeChar(cb);
250
+ assert.equal(ret, 97 + 98);
251
+ }
233
252
  }
@@ -169,6 +169,7 @@ typedef struct Vec2 {
169
169
 
170
170
  typedef int VectorCallback(int len, Vec2 *vec);
171
171
  typedef int SortCallback(const void *ptr1, const void *ptr2);
172
+ typedef int CharCallback(int idx, char c);
172
173
 
173
174
  EXPORT int8_t GetMinusOne1(void)
174
175
  {
@@ -776,3 +777,13 @@ EXPORT void CallQSort(void *base, size_t nmemb, size_t size, SortCallback *cb)
776
777
  {
777
778
  qsort(base, nmemb, size, cb);
778
779
  }
780
+
781
+ EXPORT int CallMeChar(CharCallback *func)
782
+ {
783
+ int ret = 0;
784
+
785
+ ret += func(0, 'a');
786
+ ret += func(1, 'b');
787
+
788
+ return ret;
789
+ }