koffi 1.0.4 → 1.1.0-beta.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 (268) hide show
  1. package/README.md +51 -22
  2. package/build/qemu/1.1.0-beta.1/koffi_darwin_x64.tar.gz +0 -0
  3. package/build/qemu/1.1.0-beta.1/koffi_freebsd_arm64.tar.gz +0 -0
  4. package/build/qemu/1.1.0-beta.1/koffi_freebsd_ia32.tar.gz +0 -0
  5. package/build/qemu/1.1.0-beta.1/koffi_freebsd_x64.tar.gz +0 -0
  6. package/build/qemu/1.1.0-beta.1/koffi_linux_arm.tar.gz +0 -0
  7. package/build/qemu/1.1.0-beta.1/koffi_linux_arm64.tar.gz +0 -0
  8. package/build/qemu/1.1.0-beta.1/koffi_linux_ia32.tar.gz +0 -0
  9. package/build/qemu/1.1.0-beta.1/koffi_linux_x64.tar.gz +0 -0
  10. package/build/qemu/1.1.0-beta.1/koffi_win32_ia32.tar.gz +0 -0
  11. package/build/qemu/1.1.0-beta.1/koffi_win32_x64.tar.gz +0 -0
  12. package/package.json +1 -1
  13. package/qemu/qemu.js +11 -5
  14. package/qemu/registry/machines.json +20 -10
  15. package/src/abi_arm32.cc +13 -6
  16. package/src/abi_arm64.cc +13 -6
  17. package/src/abi_x64_sysv.cc +13 -6
  18. package/src/abi_x64_win.cc +13 -6
  19. package/src/abi_x86.cc +13 -6
  20. package/src/call.cc +25 -26
  21. package/src/call.hh +27 -41
  22. package/src/ffi.cc +152 -17
  23. package/src/ffi.hh +24 -10
  24. package/test/misc.c +2 -2
  25. package/build/qemu/1.0.4/koffi_darwin_x64.tar.gz +0 -0
  26. package/build/qemu/1.0.4/koffi_freebsd_arm64.tar.gz +0 -0
  27. package/build/qemu/1.0.4/koffi_freebsd_ia32.tar.gz +0 -0
  28. package/build/qemu/1.0.4/koffi_freebsd_x64.tar.gz +0 -0
  29. package/build/qemu/1.0.4/koffi_linux_arm.tar.gz +0 -0
  30. package/build/qemu/1.0.4/koffi_linux_arm64.tar.gz +0 -0
  31. package/build/qemu/1.0.4/koffi_linux_ia32.tar.gz +0 -0
  32. package/build/qemu/1.0.4/koffi_linux_x64.tar.gz +0 -0
  33. package/build/qemu/1.0.4/koffi_win32_ia32.tar.gz +0 -0
  34. package/build/qemu/1.0.4/koffi_win32_x64.tar.gz +0 -0
  35. package/test/misc.js +0 -227
  36. package/vendor/node-addon-api/CODE_OF_CONDUCT.md +0 -4
  37. package/vendor/node-addon-api/CONTRIBUTING.md +0 -93
  38. package/vendor/node-addon-api/appveyor.yml +0 -37
  39. package/vendor/node-addon-api/benchmark/README.md +0 -47
  40. package/vendor/node-addon-api/benchmark/binding.gyp +0 -25
  41. package/vendor/node-addon-api/benchmark/function_args.cc +0 -217
  42. package/vendor/node-addon-api/benchmark/function_args.js +0 -60
  43. package/vendor/node-addon-api/benchmark/index.js +0 -34
  44. package/vendor/node-addon-api/benchmark/property_descriptor.cc +0 -91
  45. package/vendor/node-addon-api/benchmark/property_descriptor.js +0 -37
  46. package/vendor/node-addon-api/doc/addon.md +0 -163
  47. package/vendor/node-addon-api/doc/array.md +0 -81
  48. package/vendor/node-addon-api/doc/array_buffer.md +0 -155
  49. package/vendor/node-addon-api/doc/async_context.md +0 -86
  50. package/vendor/node-addon-api/doc/async_operations.md +0 -31
  51. package/vendor/node-addon-api/doc/async_worker.md +0 -427
  52. package/vendor/node-addon-api/doc/async_worker_variants.md +0 -557
  53. package/vendor/node-addon-api/doc/bigint.md +0 -97
  54. package/vendor/node-addon-api/doc/boolean.md +0 -68
  55. package/vendor/node-addon-api/doc/buffer.md +0 -150
  56. package/vendor/node-addon-api/doc/callback_scope.md +0 -54
  57. package/vendor/node-addon-api/doc/callbackinfo.md +0 -97
  58. package/vendor/node-addon-api/doc/checker-tool.md +0 -32
  59. package/vendor/node-addon-api/doc/class_property_descriptor.md +0 -123
  60. package/vendor/node-addon-api/doc/cmake-js.md +0 -68
  61. package/vendor/node-addon-api/doc/conversion-tool.md +0 -28
  62. package/vendor/node-addon-api/doc/creating_a_release.md +0 -62
  63. package/vendor/node-addon-api/doc/dataview.md +0 -248
  64. package/vendor/node-addon-api/doc/date.md +0 -68
  65. package/vendor/node-addon-api/doc/env.md +0 -196
  66. package/vendor/node-addon-api/doc/error.md +0 -120
  67. package/vendor/node-addon-api/doc/error_handling.md +0 -254
  68. package/vendor/node-addon-api/doc/escapable_handle_scope.md +0 -80
  69. package/vendor/node-addon-api/doc/external.md +0 -63
  70. package/vendor/node-addon-api/doc/function.md +0 -402
  71. package/vendor/node-addon-api/doc/function_reference.md +0 -238
  72. package/vendor/node-addon-api/doc/generator.md +0 -13
  73. package/vendor/node-addon-api/doc/handle_scope.md +0 -63
  74. package/vendor/node-addon-api/doc/hierarchy.md +0 -91
  75. package/vendor/node-addon-api/doc/instance_wrap.md +0 -408
  76. package/vendor/node-addon-api/doc/maybe.md +0 -76
  77. package/vendor/node-addon-api/doc/memory_management.md +0 -27
  78. package/vendor/node-addon-api/doc/name.md +0 -29
  79. package/vendor/node-addon-api/doc/node-gyp.md +0 -82
  80. package/vendor/node-addon-api/doc/number.md +0 -163
  81. package/vendor/node-addon-api/doc/object.md +0 -411
  82. package/vendor/node-addon-api/doc/object_lifetime_management.md +0 -83
  83. package/vendor/node-addon-api/doc/object_reference.md +0 -117
  84. package/vendor/node-addon-api/doc/object_wrap.md +0 -588
  85. package/vendor/node-addon-api/doc/prebuild_tools.md +0 -16
  86. package/vendor/node-addon-api/doc/promises.md +0 -79
  87. package/vendor/node-addon-api/doc/property_descriptor.md +0 -286
  88. package/vendor/node-addon-api/doc/propertylvalue.md +0 -50
  89. package/vendor/node-addon-api/doc/range_error.md +0 -59
  90. package/vendor/node-addon-api/doc/reference.md +0 -113
  91. package/vendor/node-addon-api/doc/setup.md +0 -110
  92. package/vendor/node-addon-api/doc/string.md +0 -93
  93. package/vendor/node-addon-api/doc/symbol.md +0 -61
  94. package/vendor/node-addon-api/doc/threadsafe.md +0 -121
  95. package/vendor/node-addon-api/doc/threadsafe_function.md +0 -290
  96. package/vendor/node-addon-api/doc/type_error.md +0 -59
  97. package/vendor/node-addon-api/doc/typed_array.md +0 -78
  98. package/vendor/node-addon-api/doc/typed_array_of.md +0 -137
  99. package/vendor/node-addon-api/doc/typed_threadsafe_function.md +0 -306
  100. package/vendor/node-addon-api/doc/value.md +0 -340
  101. package/vendor/node-addon-api/doc/version_management.md +0 -43
  102. package/vendor/node-addon-api/package.json +0 -415
  103. package/vendor/node-addon-api/test/README.md +0 -91
  104. package/vendor/node-addon-api/test/addon.cc +0 -36
  105. package/vendor/node-addon-api/test/addon.js +0 -11
  106. package/vendor/node-addon-api/test/addon_build/index.js +0 -49
  107. package/vendor/node-addon-api/test/addon_build/tpl/addon.cc +0 -17
  108. package/vendor/node-addon-api/test/addon_build/tpl/binding.gyp +0 -62
  109. package/vendor/node-addon-api/test/addon_build/tpl/index.js +0 -9
  110. package/vendor/node-addon-api/test/addon_build/tpl/package.json +0 -11
  111. package/vendor/node-addon-api/test/addon_data.cc +0 -99
  112. package/vendor/node-addon-api/test/addon_data.js +0 -46
  113. package/vendor/node-addon-api/test/array_buffer.cc +0 -243
  114. package/vendor/node-addon-api/test/array_buffer.js +0 -69
  115. package/vendor/node-addon-api/test/async_context.cc +0 -36
  116. package/vendor/node-addon-api/test/async_context.js +0 -122
  117. package/vendor/node-addon-api/test/async_progress_queue_worker.cc +0 -83
  118. package/vendor/node-addon-api/test/async_progress_queue_worker.js +0 -46
  119. package/vendor/node-addon-api/test/async_progress_worker.cc +0 -134
  120. package/vendor/node-addon-api/test/async_progress_worker.js +0 -61
  121. package/vendor/node-addon-api/test/async_worker.cc +0 -106
  122. package/vendor/node-addon-api/test/async_worker.js +0 -179
  123. package/vendor/node-addon-api/test/async_worker_nocallback.js +0 -13
  124. package/vendor/node-addon-api/test/async_worker_persistent.cc +0 -63
  125. package/vendor/node-addon-api/test/async_worker_persistent.js +0 -24
  126. package/vendor/node-addon-api/test/basic_types/array.cc +0 -40
  127. package/vendor/node-addon-api/test/basic_types/array.js +0 -35
  128. package/vendor/node-addon-api/test/basic_types/boolean.cc +0 -38
  129. package/vendor/node-addon-api/test/basic_types/boolean.js +0 -35
  130. package/vendor/node-addon-api/test/basic_types/number.cc +0 -99
  131. package/vendor/node-addon-api/test/basic_types/number.js +0 -114
  132. package/vendor/node-addon-api/test/basic_types/value.cc +0 -120
  133. package/vendor/node-addon-api/test/basic_types/value.js +0 -133
  134. package/vendor/node-addon-api/test/bigint.cc +0 -91
  135. package/vendor/node-addon-api/test/bigint.js +0 -53
  136. package/vendor/node-addon-api/test/binding-swallowexcept.cc +0 -12
  137. package/vendor/node-addon-api/test/binding.cc +0 -173
  138. package/vendor/node-addon-api/test/binding.gyp +0 -124
  139. package/vendor/node-addon-api/test/buffer.cc +0 -183
  140. package/vendor/node-addon-api/test/buffer.js +0 -69
  141. package/vendor/node-addon-api/test/callbackscope.cc +0 -22
  142. package/vendor/node-addon-api/test/callbackscope.js +0 -49
  143. package/vendor/node-addon-api/test/common/index.js +0 -114
  144. package/vendor/node-addon-api/test/common/test_helper.h +0 -71
  145. package/vendor/node-addon-api/test/dataview/dataview.cc +0 -48
  146. package/vendor/node-addon-api/test/dataview/dataview.js +0 -35
  147. package/vendor/node-addon-api/test/dataview/dataview_read_write.cc +0 -115
  148. package/vendor/node-addon-api/test/dataview/dataview_read_write.js +0 -90
  149. package/vendor/node-addon-api/test/date.cc +0 -44
  150. package/vendor/node-addon-api/test/date.js +0 -18
  151. package/vendor/node-addon-api/test/env_cleanup.cc +0 -88
  152. package/vendor/node-addon-api/test/env_cleanup.js +0 -56
  153. package/vendor/node-addon-api/test/error.cc +0 -287
  154. package/vendor/node-addon-api/test/error.js +0 -81
  155. package/vendor/node-addon-api/test/error_handling_for_primitives.cc +0 -13
  156. package/vendor/node-addon-api/test/error_handling_for_primitives.js +0 -29
  157. package/vendor/node-addon-api/test/error_terminating_environment.js +0 -95
  158. package/vendor/node-addon-api/test/external.cc +0 -81
  159. package/vendor/node-addon-api/test/external.js +0 -88
  160. package/vendor/node-addon-api/test/function.cc +0 -324
  161. package/vendor/node-addon-api/test/function.js +0 -133
  162. package/vendor/node-addon-api/test/function_reference.cc +0 -202
  163. package/vendor/node-addon-api/test/function_reference.js +0 -157
  164. package/vendor/node-addon-api/test/globalObject/global_object.cc +0 -61
  165. package/vendor/node-addon-api/test/globalObject/global_object_delete_property.cc +0 -31
  166. package/vendor/node-addon-api/test/globalObject/global_object_delete_property.js +0 -61
  167. package/vendor/node-addon-api/test/globalObject/global_object_get_property.cc +0 -40
  168. package/vendor/node-addon-api/test/globalObject/global_object_get_property.js +0 -57
  169. package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.cc +0 -28
  170. package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.js +0 -48
  171. package/vendor/node-addon-api/test/globalObject/global_object_set_property.cc +0 -31
  172. package/vendor/node-addon-api/test/globalObject/global_object_set_property.js +0 -58
  173. package/vendor/node-addon-api/test/handlescope.cc +0 -60
  174. package/vendor/node-addon-api/test/handlescope.js +0 -14
  175. package/vendor/node-addon-api/test/index.js +0 -159
  176. package/vendor/node-addon-api/test/maybe/check.cc +0 -23
  177. package/vendor/node-addon-api/test/maybe/index.js +0 -38
  178. package/vendor/node-addon-api/test/memory_management.cc +0 -17
  179. package/vendor/node-addon-api/test/memory_management.js +0 -9
  180. package/vendor/node-addon-api/test/movable_callbacks.cc +0 -23
  181. package/vendor/node-addon-api/test/movable_callbacks.js +0 -21
  182. package/vendor/node-addon-api/test/name.cc +0 -108
  183. package/vendor/node-addon-api/test/name.js +0 -59
  184. package/vendor/node-addon-api/test/napi_child.js +0 -14
  185. package/vendor/node-addon-api/test/object/delete_property.cc +0 -38
  186. package/vendor/node-addon-api/test/object/delete_property.js +0 -41
  187. package/vendor/node-addon-api/test/object/finalizer.cc +0 -29
  188. package/vendor/node-addon-api/test/object/finalizer.js +0 -28
  189. package/vendor/node-addon-api/test/object/get_property.cc +0 -34
  190. package/vendor/node-addon-api/test/object/get_property.js +0 -40
  191. package/vendor/node-addon-api/test/object/has_own_property.cc +0 -34
  192. package/vendor/node-addon-api/test/object/has_own_property.js +0 -34
  193. package/vendor/node-addon-api/test/object/has_property.cc +0 -38
  194. package/vendor/node-addon-api/test/object/has_property.js +0 -37
  195. package/vendor/node-addon-api/test/object/object.cc +0 -350
  196. package/vendor/node-addon-api/test/object/object.js +0 -217
  197. package/vendor/node-addon-api/test/object/object_deprecated.cc +0 -66
  198. package/vendor/node-addon-api/test/object/object_deprecated.js +0 -47
  199. package/vendor/node-addon-api/test/object/object_freeze_seal.cc +0 -25
  200. package/vendor/node-addon-api/test/object/object_freeze_seal.js +0 -61
  201. package/vendor/node-addon-api/test/object/set_property.cc +0 -45
  202. package/vendor/node-addon-api/test/object/set_property.js +0 -30
  203. package/vendor/node-addon-api/test/object/subscript_operator.cc +0 -58
  204. package/vendor/node-addon-api/test/object/subscript_operator.js +0 -17
  205. package/vendor/node-addon-api/test/object_reference.cc +0 -219
  206. package/vendor/node-addon-api/test/object_reference.js +0 -259
  207. package/vendor/node-addon-api/test/objectwrap.cc +0 -268
  208. package/vendor/node-addon-api/test/objectwrap.js +0 -284
  209. package/vendor/node-addon-api/test/objectwrap_constructor_exception.cc +0 -26
  210. package/vendor/node-addon-api/test/objectwrap_constructor_exception.js +0 -18
  211. package/vendor/node-addon-api/test/objectwrap_function.cc +0 -45
  212. package/vendor/node-addon-api/test/objectwrap_function.js +0 -22
  213. package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.cc +0 -30
  214. package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.js +0 -13
  215. package/vendor/node-addon-api/test/objectwrap_removewrap.cc +0 -45
  216. package/vendor/node-addon-api/test/objectwrap_removewrap.js +0 -40
  217. package/vendor/node-addon-api/test/objectwrap_worker_thread.js +0 -19
  218. package/vendor/node-addon-api/test/promise.cc +0 -29
  219. package/vendor/node-addon-api/test/promise.js +0 -18
  220. package/vendor/node-addon-api/test/reference.cc +0 -24
  221. package/vendor/node-addon-api/test/reference.js +0 -14
  222. package/vendor/node-addon-api/test/run_script.cc +0 -56
  223. package/vendor/node-addon-api/test/run_script.js +0 -45
  224. package/vendor/node-addon-api/test/symbol.cc +0 -79
  225. package/vendor/node-addon-api/test/symbol.js +0 -73
  226. package/vendor/node-addon-api/test/testUtil.js +0 -54
  227. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.cc +0 -195
  228. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.js +0 -188
  229. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.cc +0 -63
  230. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.js +0 -12
  231. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.cc +0 -115
  232. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.js +0 -14
  233. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.cc +0 -26
  234. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.js +0 -7
  235. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.cc +0 -225
  236. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.js +0 -59
  237. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.cc +0 -42
  238. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.js +0 -53
  239. package/vendor/node-addon-api/test/thunking_manual.cc +0 -140
  240. package/vendor/node-addon-api/test/thunking_manual.js +0 -17
  241. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.cc +0 -215
  242. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.js +0 -188
  243. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.cc +0 -68
  244. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.js +0 -12
  245. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.cc +0 -127
  246. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.js +0 -14
  247. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.cc +0 -28
  248. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.js +0 -7
  249. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.cc +0 -237
  250. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.js +0 -59
  251. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.cc +0 -53
  252. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.js +0 -53
  253. package/vendor/node-addon-api/test/typedarray-bigint.js +0 -58
  254. package/vendor/node-addon-api/test/typedarray.cc +0 -216
  255. package/vendor/node-addon-api/test/typedarray.js +0 -69
  256. package/vendor/node-addon-api/test/version_management.cc +0 -27
  257. package/vendor/node-addon-api/test/version_management.js +0 -31
  258. package/vendor/node-addon-api/unit-test/README.md +0 -28
  259. package/vendor/node-addon-api/unit-test/binding-file-template.js +0 -39
  260. package/vendor/node-addon-api/unit-test/binding.gyp +0 -72
  261. package/vendor/node-addon-api/unit-test/exceptions.js +0 -32
  262. package/vendor/node-addon-api/unit-test/generate-binding-cc.js +0 -61
  263. package/vendor/node-addon-api/unit-test/injectTestParams.js +0 -101
  264. package/vendor/node-addon-api/unit-test/listOfTestModules.js +0 -88
  265. package/vendor/node-addon-api/unit-test/matchModules.js +0 -65
  266. package/vendor/node-addon-api/unit-test/setup.js +0 -13
  267. package/vendor/node-addon-api/unit-test/spawnTask.js +0 -26
  268. package/vendor/node-addon-api/unit-test/test.js +0 -30
package/src/call.hh CHANGED
@@ -24,24 +24,27 @@ namespace RG {
24
24
  bool AnalyseFunction(InstanceData *instance, FunctionInfo *func);
25
25
 
26
26
  class CallData {
27
- Napi::Env env;
28
- InstanceData *instance;
29
- const FunctionInfo *func;
30
-
31
27
  struct OutObject {
32
- Napi::Object obj;
28
+ Napi::ObjectReference ref;
33
29
  const uint8_t *ptr;
34
30
  const TypeInfo *type;
35
31
  };
36
32
 
37
- Span<uint8_t> *stack_mem;
38
- Span<uint8_t> *heap_mem;
39
- LocalArray<OutObject, MaxOutParameters> out_objects;
40
- BlockAllocator big_alloc;
33
+ Napi::Env env;
34
+ InstanceData *instance;
35
+ const FunctionInfo *func;
36
+
37
+ bool debug;
41
38
 
39
+ InstanceMemory *mem;
42
40
  Span<uint8_t> old_stack_mem;
43
41
  Span<uint8_t> old_heap_mem;
44
42
 
43
+ LocalArray<OutObject, MaxOutParameters> out_objects;
44
+
45
+ Span<uint8_t> heap;
46
+ Span<uint8_t> stack;
47
+
45
48
  union {
46
49
  uint32_t u32;
47
50
  uint64_t u64;
@@ -53,26 +56,9 @@ class CallData {
53
56
  uint8_t *return_ptr = nullptr;
54
57
 
55
58
  public:
56
- CallData(Napi::Env env, InstanceData *instance, const FunctionInfo *func);
59
+ CallData(Napi::Env env, const FunctionInfo *func, InstanceMemory *mem, bool debug);
57
60
  ~CallData();
58
61
 
59
- Span<uint8_t> GetStack() const
60
- {
61
- uint8_t *sp = stack_mem->end();
62
- Size len = old_stack_mem.end() - sp;
63
-
64
- return MakeSpan(sp, len);
65
- }
66
- uint8_t *GetSP() const { return stack_mem->end(); };
67
-
68
- Span<uint8_t> GetHeap() const
69
- {
70
- uint8_t *ptr = old_heap_mem.ptr;
71
- Size len = heap_mem->ptr - ptr;
72
-
73
- return MakeSpan(ptr, len);
74
- }
75
-
76
62
  bool Prepare(const Napi::CallbackInfo &info);
77
63
  void Execute();
78
64
  Napi::Value Complete();
@@ -82,11 +68,11 @@ public:
82
68
  if (!RG_UNLIKELY(Prepare(info)))
83
69
  return env.Null();
84
70
 
85
- if (instance->debug) {
71
+ if (debug) {
86
72
  DumpDebug();
87
73
  }
88
-
89
74
  Execute();
75
+
90
76
  return Complete();
91
77
  }
92
78
 
@@ -109,19 +95,19 @@ private:
109
95
  template <typename T>
110
96
  bool CallData::AllocStack(Size size, Size align, T **out_ptr)
111
97
  {
112
- uint8_t *ptr = AlignDown(stack_mem->end() - size, align);
113
- Size delta = stack_mem->end() - ptr;
98
+ uint8_t *ptr = AlignDown(mem->stack.end() - size, align);
99
+ Size delta = mem->stack.end() - ptr;
114
100
 
115
- if (RG_UNLIKELY(stack_mem->len < delta)) {
101
+ if (RG_UNLIKELY(mem->stack.len < delta)) {
116
102
  ThrowError<Napi::Error>(env, "FFI call is taking up too much memory");
117
103
  return false;
118
104
  }
119
105
 
120
- if (instance->debug) {
106
+ if (debug) {
121
107
  memset(ptr, 0, delta);
122
108
  }
123
109
 
124
- stack_mem->len -= delta;
110
+ mem->stack.len -= delta;
125
111
 
126
112
  if (out_ptr) {
127
113
  *out_ptr = (T *)ptr;
@@ -132,20 +118,20 @@ bool CallData::AllocStack(Size size, Size align, T **out_ptr)
132
118
  template <typename T>
133
119
  bool CallData::AllocHeap(Size size, Size align, T **out_ptr)
134
120
  {
135
- uint8_t *ptr = AlignUp(heap_mem->ptr, align);
136
- Size delta = size + (ptr - heap_mem->ptr);
121
+ uint8_t *ptr = AlignUp(mem->heap.ptr, align);
122
+ Size delta = size + (ptr - mem->heap.ptr);
137
123
 
138
- if (RG_UNLIKELY(delta > heap_mem->len)) {
124
+ if (RG_UNLIKELY(delta > mem->heap.len)) {
139
125
  ThrowError<Napi::Error>(env, "FFI call is taking up too much memory");
140
126
  return false;
141
127
  }
142
128
 
143
- if (instance->debug) {
144
- memset(heap_mem->ptr, 0, (size_t)delta);
129
+ if (debug) {
130
+ memset(mem->heap.ptr, 0, (size_t)delta);
145
131
  }
146
132
 
147
- heap_mem->ptr += delta;
148
- heap_mem->len -= delta;
133
+ mem->heap.ptr += delta;
134
+ mem->heap.len -= delta;
149
135
 
150
136
  if (out_ptr) {
151
137
  *out_ptr = (T *)ptr;
package/src/ffi.cc CHANGED
@@ -241,6 +241,42 @@ static Napi::Value MarkInOut(const Napi::CallbackInfo &info)
241
241
  return EncodePointerDirection(info, 3);
242
242
  }
243
243
 
244
+ static Span<uint8_t> AllocateAndAlign16(Allocator *alloc, Size size)
245
+ {
246
+ RG_ASSERT(AlignLen(size, 16) == size);
247
+ RG_ASSERT(size >= Kibibytes(1));
248
+
249
+ // Account for allocator overhead
250
+ size -= 256;
251
+
252
+ uint8_t *ptr = (uint8_t *)Allocator::Allocate(alloc, size);
253
+ uint8_t *aligned = AlignUp(ptr, 16);
254
+ Size delta = AlignLen(aligned - ptr, 16);
255
+
256
+ return MakeSpan(aligned, size - delta);
257
+ }
258
+
259
+ static InstanceMemory *AllocateCallMemory(InstanceData *instance)
260
+ {
261
+ for (InstanceMemory *mem: instance->memories) {
262
+ if (!mem->depth)
263
+ return mem;
264
+ }
265
+
266
+ InstanceMemory *mem = new InstanceMemory();
267
+
268
+ mem->stack = AllocateAndAlign16(&mem->mem_alloc, Mebibytes(1));
269
+ mem->heap = AllocateAndAlign16(&mem->mem_alloc, Mebibytes(2));
270
+
271
+ if (instance->memories.Available()) {
272
+ instance->memories.Append(mem);
273
+ } else {
274
+ mem->temporary = true;
275
+ }
276
+
277
+ return mem;
278
+ }
279
+
244
280
  static Napi::Value TranslateNormalCall(const Napi::CallbackInfo &info)
245
281
  {
246
282
  Napi::Env env = info.Env();
@@ -252,7 +288,9 @@ static Napi::Value TranslateNormalCall(const Napi::CallbackInfo &info)
252
288
  return env.Null();
253
289
  }
254
290
 
255
- CallData call(env, instance, func);
291
+ InstanceMemory *mem = AllocateCallMemory(instance);
292
+ CallData call(env, func, mem, instance->debug);
293
+
256
294
  return call.Run(info);
257
295
  }
258
296
 
@@ -309,10 +347,93 @@ static Napi::Value TranslateVariadicCall(const Napi::CallbackInfo &info)
309
347
  if (!AnalyseFunction(instance, &func))
310
348
  return env.Null();
311
349
 
312
- CallData call(env, instance, &func);
350
+ InstanceMemory *mem = AllocateCallMemory(instance);
351
+ CallData call(env, &func, mem, instance->debug);
352
+
313
353
  return call.Run(info);
314
354
  }
315
355
 
356
+ class AsyncCall: public Napi::AsyncWorker {
357
+ Napi::Env env;
358
+ const FunctionInfo *func;
359
+
360
+ CallData call;
361
+ bool prepared = false;
362
+
363
+ public:
364
+ AsyncCall(Napi::Env env, InstanceMemory *mem, FunctionInfo *func, bool debug,
365
+ Napi::Function &callback)
366
+ : Napi::AsyncWorker(callback), env(env), func(func->Ref()),
367
+ call(env, func, mem, debug) {}
368
+ ~AsyncCall() { func->Unref(); }
369
+
370
+ bool Prepare(const Napi::CallbackInfo &info) {
371
+ prepared = call.Prepare(info);
372
+
373
+ if (!prepared) {
374
+ Napi::Error err = env.GetAndClearPendingException();
375
+ SetError(err.Message());
376
+ }
377
+
378
+ return prepared;
379
+ }
380
+ void DumpDebug() { call.DumpDebug(); }
381
+
382
+ void Execute() override;
383
+ void OnOK() override;
384
+ };
385
+
386
+ void AsyncCall::Execute()
387
+ {
388
+ if (prepared) {
389
+ call.Execute();
390
+ }
391
+ }
392
+
393
+ void AsyncCall::OnOK()
394
+ {
395
+ RG_ASSERT(prepared);
396
+
397
+ Napi::FunctionReference &callback = Callback();
398
+
399
+ Napi::Value self = env.Null();
400
+ napi_value args[] = {
401
+ env.Null(),
402
+ call.Complete()
403
+ };
404
+
405
+ callback.Call(self, RG_LEN(args), args);
406
+ }
407
+
408
+ static Napi::Value TranslateAsyncCall(const Napi::CallbackInfo &info)
409
+ {
410
+ Napi::Env env = info.Env();
411
+ InstanceData *instance = env.GetInstanceData<InstanceData>();
412
+ FunctionInfo *func = (FunctionInfo *)info.Data();
413
+
414
+ if (info.Length() <= (uint32_t)func->parameters.len) {
415
+ ThrowError<Napi::TypeError>(env, "Expected %1 arguments, got %2", func->parameters.len + 1, info.Length());
416
+ return env.Null();
417
+ }
418
+
419
+ Napi::Function callback = info[(uint32_t)func->parameters.len].As<Napi::Function>();
420
+
421
+ if (!callback.IsFunction()) {
422
+ ThrowError<Napi::TypeError>(env, "Expected callback function as last arguments, got %1", GetValueType(instance, callback));
423
+ return env.Null();
424
+ }
425
+
426
+ InstanceMemory *mem = AllocateCallMemory(instance);
427
+ AsyncCall *async = new AsyncCall(env, mem, func, instance->debug, callback);
428
+
429
+ if (async->Prepare(info) && instance->debug) {
430
+ async->DumpDebug();
431
+ }
432
+ async->Queue();
433
+
434
+ return env.Null();
435
+ }
436
+
316
437
  static bool ParseClassicFunction(Napi::Env env, Napi::String name, Napi::Value ret,
317
438
  Napi::Array parameters, FunctionInfo *func)
318
439
  {
@@ -386,7 +507,7 @@ static Napi::Value FindLibraryFunction(const Napi::CallbackInfo &info, CallConve
386
507
  LibraryHolder *lib = (LibraryHolder *)info.Data();
387
508
 
388
509
  FunctionInfo *func = new FunctionInfo();
389
- RG_DEFER_N(func_guard) { delete func; };
510
+ RG_DEFER { func->Unref(); };
390
511
 
391
512
  func->lib = lib->Ref();
392
513
  func->convention = convention;
@@ -445,9 +566,14 @@ static Napi::Value FindLibraryFunction(const Napi::CallbackInfo &info, CallConve
445
566
  }
446
567
 
447
568
  Napi::Function::Callback call = func->variadic ? TranslateVariadicCall : TranslateNormalCall;
448
- Napi::Function wrapper = Napi::Function::New(env, call, func->name, (void *)func);
449
- wrapper.AddFinalizer([](Napi::Env, FunctionInfo *func) { delete func; }, func);
450
- func_guard.Disable();
569
+ Napi::Function wrapper = Napi::Function::New(env, call, func->name, (void *)func->Ref());
570
+ wrapper.AddFinalizer([](Napi::Env, FunctionInfo *func) { func->Unref(); }, func);
571
+
572
+ if (!func->variadic) {
573
+ Napi::Function async = Napi::Function::New(env, TranslateAsyncCall, func->name, (void *)func->Ref());
574
+ async.AddFinalizer([](Napi::Env, FunctionInfo *func) { func->Unref(); }, func);
575
+ wrapper.Set("async", async);
576
+ }
451
577
 
452
578
  return wrapper;
453
579
  }
@@ -540,13 +666,13 @@ LibraryHolder::~LibraryHolder()
540
666
  #endif
541
667
  }
542
668
 
543
- LibraryHolder *LibraryHolder::Ref()
669
+ const LibraryHolder *LibraryHolder::Ref() const
544
670
  {
545
671
  refcount++;
546
672
  return this;
547
673
  }
548
674
 
549
- void LibraryHolder::Unref()
675
+ void LibraryHolder::Unref() const
550
676
  {
551
677
  if (!--refcount) {
552
678
  delete this;
@@ -646,21 +772,30 @@ FunctionInfo::~FunctionInfo()
646
772
  }
647
773
  }
648
774
 
649
- static Span<uint8_t> AllocateAndAlign16(Allocator *alloc, Size size)
775
+ const FunctionInfo *FunctionInfo::Ref() const
650
776
  {
651
- RG_ASSERT(AlignLen(size, 16) == size);
652
-
653
- uint8_t *ptr = (uint8_t *)Allocator::Allocate(alloc, size);
654
- uint8_t *aligned = AlignUp(ptr, 16);
655
- Size delta = AlignLen(aligned - ptr, 16);
777
+ refcount++;
778
+ return this;
779
+ }
656
780
 
657
- return MakeSpan(aligned, size - delta);
781
+ void FunctionInfo::Unref() const
782
+ {
783
+ if (!--refcount) {
784
+ delete this;
785
+ }
658
786
  }
659
787
 
660
788
  InstanceData::InstanceData()
661
789
  {
662
- stack_mem = AllocateAndAlign16(&mem_alloc, Mebibytes(2));
663
- heap_mem = AllocateAndAlign16(&mem_alloc, Mebibytes(4));
790
+ AllocateCallMemory(this);
791
+ RG_ASSERT(memories.len == 1);
792
+ }
793
+
794
+ InstanceData::~InstanceData()
795
+ {
796
+ for (InstanceMemory *mem: memories) {
797
+ delete mem;
798
+ }
664
799
  }
665
800
 
666
801
  template <typename Func>
package/src/ffi.hh CHANGED
@@ -86,13 +86,13 @@ struct RecordMember {
86
86
 
87
87
  struct LibraryHolder {
88
88
  void *module = nullptr; // HMODULE on Windows
89
- std::atomic_int refcount {1};
89
+ mutable std::atomic_int refcount {1};
90
90
 
91
91
  LibraryHolder(void *module) : module(module) {}
92
92
  ~LibraryHolder();
93
93
 
94
- LibraryHolder *Ref();
95
- void Unref();
94
+ const LibraryHolder *Ref() const;
95
+ void Unref() const;
96
96
  };
97
97
 
98
98
  enum class CallConvention {
@@ -132,11 +132,11 @@ struct ParameterInfo {
132
132
  };
133
133
 
134
134
  struct FunctionInfo {
135
- ~FunctionInfo();
135
+ mutable std::atomic_int refcount {1};
136
136
 
137
137
  const char *name;
138
138
  const char *decorated_name;
139
- LibraryHolder *lib = nullptr;
139
+ const LibraryHolder *lib = nullptr;
140
140
 
141
141
  void *func;
142
142
  CallConvention convention;
@@ -152,10 +152,27 @@ struct FunctionInfo {
152
152
  #if defined(__arm__) || defined(__aarch64__) || defined(__x86_64__) || defined(_WIN64)
153
153
  bool forward_fp;
154
154
  #endif
155
+
156
+ ~FunctionInfo();
157
+
158
+ const FunctionInfo *Ref() const;
159
+ void Unref() const;
160
+ };
161
+
162
+ struct InstanceMemory {
163
+ LinkedAllocator mem_alloc;
164
+
165
+ Span<uint8_t> stack;
166
+ Span<uint8_t> heap;
167
+ IndirectBlockAllocator big_alloc { &mem_alloc };
168
+
169
+ int depth;
170
+ bool temporary;
155
171
  };
156
172
 
157
173
  struct InstanceData {
158
174
  InstanceData();
175
+ ~InstanceData();
159
176
 
160
177
  BucketArray<TypeInfo> types;
161
178
  HashTable<const char *, TypeInfo *> types_map;
@@ -163,12 +180,9 @@ struct InstanceData {
163
180
  bool debug;
164
181
  uint64_t tag_lower;
165
182
 
166
- BlockAllocator str_alloc;
167
-
168
- Span<uint8_t> stack_mem;
169
- Span<uint8_t> heap_mem;
183
+ LocalArray<InstanceMemory *, 8> memories;
170
184
 
171
- LinkedAllocator mem_alloc;
185
+ BlockAllocator str_alloc;
172
186
  };
173
187
 
174
188
  }
package/test/misc.c CHANGED
@@ -275,7 +275,7 @@ EXPORT BFG STDCALL MakeBFG(BFG *p, int x, double y, const char *str)
275
275
  {
276
276
  BFG bfg;
277
277
 
278
- char buf[64];
278
+ static char buf[64];
279
279
  snprintf(buf, sizeof(buf), "X/%s/X", str);
280
280
 
281
281
  bfg.a = x;
@@ -294,7 +294,7 @@ EXPORT PackedBFG FASTCALL MakePackedBFG(int x, double y, PackedBFG *p, const cha
294
294
  {
295
295
  PackedBFG bfg;
296
296
 
297
- char buf[64];
297
+ static char buf[64];
298
298
  snprintf(buf, sizeof(buf), "X/%s/X", str);
299
299
 
300
300
  bfg.a = x;