koffi 2.16.0-beta.2 → 2.16.0

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 (425) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/build/koffi/darwin_arm64/koffi.node +0 -0
  3. package/build/koffi/darwin_x64/koffi.node +0 -0
  4. package/build/koffi/freebsd_arm64/koffi.node +0 -0
  5. package/build/koffi/freebsd_ia32/koffi.node +0 -0
  6. package/build/koffi/freebsd_x64/koffi.node +0 -0
  7. package/build/koffi/linux_arm64/koffi.node +0 -0
  8. package/build/koffi/linux_armhf/koffi.node +0 -0
  9. package/build/koffi/linux_ia32/koffi.node +0 -0
  10. package/build/koffi/linux_loong64/koffi.node +0 -0
  11. package/build/koffi/linux_riscv64d/koffi.node +0 -0
  12. package/build/koffi/linux_x64/koffi.node +0 -0
  13. package/build/koffi/musl_arm64/koffi.node +0 -0
  14. package/build/koffi/musl_x64/koffi.node +0 -0
  15. package/build/koffi/openbsd_ia32/koffi.node +0 -0
  16. package/build/koffi/openbsd_x64/koffi.node +0 -0
  17. package/build/koffi/win32_arm64/koffi.exp +0 -0
  18. package/build/koffi/win32_arm64/koffi.lib +0 -0
  19. package/build/koffi/win32_arm64/koffi.node +0 -0
  20. package/build/koffi/win32_ia32/koffi.exp +0 -0
  21. package/build/koffi/win32_ia32/koffi.lib +0 -0
  22. package/build/koffi/win32_ia32/koffi.node +0 -0
  23. package/build/koffi/win32_x64/koffi.exp +0 -0
  24. package/build/koffi/win32_x64/koffi.lib +0 -0
  25. package/build/koffi/win32_x64/koffi.node +0 -0
  26. package/index.d.ts +9 -11
  27. package/index.js +6 -9
  28. package/indirect.js +6 -9
  29. package/lib/native/base/base.cc +1 -6
  30. package/package.json +3 -3
  31. package/src/cnoke/assets/FindCNoke.cmake +27 -16
  32. package/src/cnoke/assets/toolchains.json +126 -0
  33. package/src/cnoke/cnoke.js +27 -33
  34. package/src/cnoke/src/builder.js +124 -63
  35. package/src/cnoke/src/tools.js +1 -5
  36. package/src/koffi/CMakeLists.txt +32 -21
  37. package/src/koffi/src/{abi/arm32.cc → abi_arm32.cc} +235 -238
  38. package/src/koffi/src/{abi/arm32_asm.S → abi_arm32_asm.S} +19 -15
  39. package/src/koffi/src/{abi/arm64.cc → abi_arm64.cc} +253 -274
  40. package/src/koffi/src/{abi/arm64_asm.S → abi_arm64_asm.S} +16 -10
  41. package/src/koffi/src/{abi/arm64_asm.asm → abi_arm64_asm.asm} +17 -10
  42. package/src/koffi/src/{abi/loong64_asm.S → abi_loong64_asm.S} +16 -10
  43. package/src/koffi/src/{abi/riscv64.cc → abi_riscv64.cc} +233 -236
  44. package/src/koffi/src/{abi/riscv64_asm.S → abi_riscv64_asm.S} +16 -10
  45. package/src/koffi/src/{abi/x64_sysv.cc → abi_x64_sysv.cc} +208 -212
  46. package/src/koffi/src/{abi/x64_sysv_asm.S → abi_x64_sysv_asm.S} +17 -10
  47. package/src/koffi/src/{abi/x64_win.cc → abi_x64_win.cc} +175 -206
  48. package/src/koffi/src/{abi/x64_win_asm.S → abi_x64_win_asm.S} +49 -27
  49. package/src/koffi/src/{abi/x64_win_asm.asm → abi_x64_win_asm.asm} +54 -27
  50. package/src/koffi/src/{abi/x86.cc → abi_x86.cc} +187 -226
  51. package/src/koffi/src/{abi/x86_asm.S → abi_x86_asm.S} +36 -21
  52. package/src/koffi/src/{abi/x86_asm.asm → abi_x86_asm.asm} +31 -16
  53. package/src/koffi/src/call.cc +473 -287
  54. package/src/koffi/src/call.hh +15 -18
  55. package/src/koffi/src/ffi.cc +167 -183
  56. package/src/koffi/src/ffi.hh +59 -13
  57. package/src/koffi/src/init.js +1 -0
  58. package/src/koffi/src/util.cc +113 -159
  59. package/src/koffi/src/util.hh +23 -74
  60. package/src/koffi/src/win32.cc +13 -0
  61. package/src/koffi/src/win32.hh +7 -0
  62. package/src/koffi/tools/write_trampolines.js +77 -0
  63. package/doc/README.md +0 -27
  64. package/doc/assets.ini +0 -24
  65. package/doc/build.sh +0 -9
  66. package/doc/develop.sh +0 -15
  67. package/doc/pages/404.md +0 -17
  68. package/doc/pages.ini +0 -86
  69. package/doc/static/highlight.js +0 -8
  70. package/doc/static/koffi.css +0 -11
  71. package/doc/static/koffi.png +0 -0
  72. package/doc/static/logo.webp +0 -0
  73. package/doc/static/perf_linux.png +0 -0
  74. package/doc/static/perf_windows.png +0 -0
  75. package/doc/static/print.css +0 -10
  76. package/doc/templates/code.html +0 -48
  77. package/doc/templates/page.html +0 -47
  78. package/src/koffi/cmake/raylib.cmake +0 -85
  79. package/src/koffi/cmake/sqlite3.cmake +0 -9
  80. package/src/koffi/examples/electron-builder/README.md +0 -11
  81. package/src/koffi/examples/electron-builder/package.json +0 -21
  82. package/src/koffi/examples/electron-builder/src/app.js +0 -20
  83. package/src/koffi/examples/electron-builder/src/index.html +0 -143
  84. package/src/koffi/examples/electron-builder/src/preload.js +0 -5
  85. package/src/koffi/examples/electron-forge/README.md +0 -25
  86. package/src/koffi/examples/electron-forge/forge.config.js +0 -63
  87. package/src/koffi/examples/electron-forge/package.json +0 -39
  88. package/src/koffi/examples/electron-forge/src/index.css +0 -7
  89. package/src/koffi/examples/electron-forge/src/index.html +0 -143
  90. package/src/koffi/examples/electron-forge/src/main.js +0 -52
  91. package/src/koffi/examples/electron-forge/src/preload.js +0 -5
  92. package/src/koffi/examples/electron-forge/src/renderer.js +0 -31
  93. package/src/koffi/examples/electron-forge/webpack.main.config.js +0 -11
  94. package/src/koffi/examples/electron-forge/webpack.renderer.config.js +0 -13
  95. package/src/koffi/examples/electron-forge/webpack.rules.js +0 -35
  96. package/src/koffi/examples/node-esbuild/README.md +0 -19
  97. package/src/koffi/examples/node-esbuild/index.js +0 -2
  98. package/src/koffi/examples/node-esbuild/package.json +0 -16
  99. package/src/koffi/examples/nwjs/README.md +0 -20
  100. package/src/koffi/examples/nwjs/package.json +0 -11
  101. package/src/koffi/examples/nwjs/src/index.html +0 -145
  102. package/src/koffi/examples/nwjs/src/package.json +0 -10
  103. package/src/koffi/examples/yao-pkg/README.md +0 -17
  104. package/src/koffi/examples/yao-pkg/index.js +0 -2
  105. package/src/koffi/examples/yao-pkg/package.json +0 -22
  106. package/src/koffi/src/primitives.inc +0 -39
  107. package/src/koffi/src/trampolines/armasm.inc +0 -32771
  108. package/src/koffi/src/trampolines/gnu.inc +0 -24577
  109. package/src/koffi/src/trampolines/masm32.inc +0 -32769
  110. package/src/koffi/src/trampolines/masm64.inc +0 -32769
  111. package/src/koffi/src/trampolines/prototypes.inc +0 -16388
  112. package/vendor/node-addon-api/CHANGELOG.md +0 -1272
  113. package/vendor/node-addon-api/CODE_OF_CONDUCT.md +0 -4
  114. package/vendor/node-addon-api/CONTRIBUTING.md +0 -203
  115. package/vendor/node-addon-api/appveyor.yml +0 -37
  116. package/vendor/node-addon-api/benchmark/README.md +0 -47
  117. package/vendor/node-addon-api/benchmark/binding.gyp +0 -25
  118. package/vendor/node-addon-api/benchmark/function_args.cc +0 -250
  119. package/vendor/node-addon-api/benchmark/function_args.js +0 -60
  120. package/vendor/node-addon-api/benchmark/index.js +0 -34
  121. package/vendor/node-addon-api/benchmark/property_descriptor.cc +0 -84
  122. package/vendor/node-addon-api/benchmark/property_descriptor.js +0 -38
  123. package/vendor/node-addon-api/common.gypi +0 -21
  124. package/vendor/node-addon-api/doc/README.md +0 -145
  125. package/vendor/node-addon-api/doc/addon.md +0 -163
  126. package/vendor/node-addon-api/doc/array.md +0 -81
  127. package/vendor/node-addon-api/doc/array_buffer.md +0 -165
  128. package/vendor/node-addon-api/doc/async_context.md +0 -86
  129. package/vendor/node-addon-api/doc/async_operations.md +0 -31
  130. package/vendor/node-addon-api/doc/async_worker.md +0 -428
  131. package/vendor/node-addon-api/doc/async_worker_variants.md +0 -578
  132. package/vendor/node-addon-api/doc/basic_env.md +0 -200
  133. package/vendor/node-addon-api/doc/bigint.md +0 -97
  134. package/vendor/node-addon-api/doc/boolean.md +0 -68
  135. package/vendor/node-addon-api/doc/buffer.md +0 -245
  136. package/vendor/node-addon-api/doc/callback_scope.md +0 -54
  137. package/vendor/node-addon-api/doc/callbackinfo.md +0 -97
  138. package/vendor/node-addon-api/doc/checker-tool.md +0 -32
  139. package/vendor/node-addon-api/doc/class_property_descriptor.md +0 -123
  140. package/vendor/node-addon-api/doc/cmake-js.md +0 -87
  141. package/vendor/node-addon-api/doc/contributing/creating_a_release.md +0 -95
  142. package/vendor/node-addon-api/doc/conversion-tool.md +0 -28
  143. package/vendor/node-addon-api/doc/dataview.md +0 -248
  144. package/vendor/node-addon-api/doc/date.md +0 -68
  145. package/vendor/node-addon-api/doc/env.md +0 -87
  146. package/vendor/node-addon-api/doc/error.md +0 -120
  147. package/vendor/node-addon-api/doc/error_handling.md +0 -266
  148. package/vendor/node-addon-api/doc/escapable_handle_scope.md +0 -80
  149. package/vendor/node-addon-api/doc/external.md +0 -79
  150. package/vendor/node-addon-api/doc/external_buffer.md +0 -18
  151. package/vendor/node-addon-api/doc/finalization.md +0 -153
  152. package/vendor/node-addon-api/doc/function.md +0 -402
  153. package/vendor/node-addon-api/doc/function_reference.md +0 -238
  154. package/vendor/node-addon-api/doc/generator.md +0 -13
  155. package/vendor/node-addon-api/doc/handle_scope.md +0 -77
  156. package/vendor/node-addon-api/doc/hierarchy.md +0 -95
  157. package/vendor/node-addon-api/doc/instance_wrap.md +0 -408
  158. package/vendor/node-addon-api/doc/maybe.md +0 -76
  159. package/vendor/node-addon-api/doc/memory_management.md +0 -27
  160. package/vendor/node-addon-api/doc/name.md +0 -29
  161. package/vendor/node-addon-api/doc/node-gyp.md +0 -82
  162. package/vendor/node-addon-api/doc/number.md +0 -163
  163. package/vendor/node-addon-api/doc/object.md +0 -411
  164. package/vendor/node-addon-api/doc/object_lifetime_management.md +0 -83
  165. package/vendor/node-addon-api/doc/object_reference.md +0 -117
  166. package/vendor/node-addon-api/doc/object_wrap.md +0 -604
  167. package/vendor/node-addon-api/doc/prebuild_tools.md +0 -16
  168. package/vendor/node-addon-api/doc/promises.md +0 -130
  169. package/vendor/node-addon-api/doc/property_descriptor.md +0 -286
  170. package/vendor/node-addon-api/doc/propertylvalue.md +0 -50
  171. package/vendor/node-addon-api/doc/range_error.md +0 -59
  172. package/vendor/node-addon-api/doc/reference.md +0 -113
  173. package/vendor/node-addon-api/doc/setup.md +0 -115
  174. package/vendor/node-addon-api/doc/string.md +0 -93
  175. package/vendor/node-addon-api/doc/symbol.md +0 -61
  176. package/vendor/node-addon-api/doc/syntax_error.md +0 -66
  177. package/vendor/node-addon-api/doc/threadsafe.md +0 -121
  178. package/vendor/node-addon-api/doc/threadsafe_function.md +0 -290
  179. package/vendor/node-addon-api/doc/type_error.md +0 -59
  180. package/vendor/node-addon-api/doc/type_taggable.md +0 -40
  181. package/vendor/node-addon-api/doc/typed_array.md +0 -78
  182. package/vendor/node-addon-api/doc/typed_array_of.md +0 -137
  183. package/vendor/node-addon-api/doc/typed_threadsafe_function.md +0 -306
  184. package/vendor/node-addon-api/doc/value.md +0 -368
  185. package/vendor/node-addon-api/doc/version_management.md +0 -43
  186. package/vendor/node-addon-api/eslint.config.js +0 -5
  187. package/vendor/node-addon-api/except.gypi +0 -25
  188. package/vendor/node-addon-api/index.js +0 -14
  189. package/vendor/node-addon-api/node_addon_api.gyp +0 -42
  190. package/vendor/node-addon-api/node_api.gyp +0 -9
  191. package/vendor/node-addon-api/noexcept.gypi +0 -26
  192. package/vendor/node-addon-api/nothing.c +0 -0
  193. package/vendor/node-addon-api/package-support.json +0 -21
  194. package/vendor/node-addon-api/package.json +0 -480
  195. package/vendor/node-addon-api/release-please-config.json +0 -15
  196. package/vendor/node-addon-api/test/README.md +0 -91
  197. package/vendor/node-addon-api/test/addon.cc +0 -44
  198. package/vendor/node-addon-api/test/addon.js +0 -7
  199. package/vendor/node-addon-api/test/addon_build/index.js +0 -49
  200. package/vendor/node-addon-api/test/addon_build/tpl/addon.cc +0 -18
  201. package/vendor/node-addon-api/test/addon_build/tpl/binding.gyp +0 -63
  202. package/vendor/node-addon-api/test/addon_build/tpl/index.js +0 -9
  203. package/vendor/node-addon-api/test/addon_build/tpl/package.json +0 -11
  204. package/vendor/node-addon-api/test/addon_data.cc +0 -98
  205. package/vendor/node-addon-api/test/addon_data.js +0 -24
  206. package/vendor/node-addon-api/test/array_buffer.cc +0 -243
  207. package/vendor/node-addon-api/test/array_buffer.js +0 -70
  208. package/vendor/node-addon-api/test/async_context.cc +0 -36
  209. package/vendor/node-addon-api/test/async_context.js +0 -122
  210. package/vendor/node-addon-api/test/async_progress_queue_worker.cc +0 -248
  211. package/vendor/node-addon-api/test/async_progress_queue_worker.js +0 -180
  212. package/vendor/node-addon-api/test/async_progress_worker.cc +0 -357
  213. package/vendor/node-addon-api/test/async_progress_worker.js +0 -200
  214. package/vendor/node-addon-api/test/async_worker.cc +0 -341
  215. package/vendor/node-addon-api/test/async_worker.js +0 -264
  216. package/vendor/node-addon-api/test/async_worker_nocallback.js +0 -19
  217. package/vendor/node-addon-api/test/async_worker_persistent.cc +0 -63
  218. package/vendor/node-addon-api/test/async_worker_persistent.js +0 -24
  219. package/vendor/node-addon-api/test/basic_types/array.cc +0 -40
  220. package/vendor/node-addon-api/test/basic_types/array.js +0 -34
  221. package/vendor/node-addon-api/test/basic_types/boolean.cc +0 -40
  222. package/vendor/node-addon-api/test/basic_types/boolean.js +0 -34
  223. package/vendor/node-addon-api/test/basic_types/number.cc +0 -105
  224. package/vendor/node-addon-api/test/basic_types/number.js +0 -115
  225. package/vendor/node-addon-api/test/basic_types/value.cc +0 -177
  226. package/vendor/node-addon-api/test/basic_types/value.js +0 -173
  227. package/vendor/node-addon-api/test/bigint.cc +0 -91
  228. package/vendor/node-addon-api/test/bigint.js +0 -53
  229. package/vendor/node-addon-api/test/binding-swallowexcept.cc +0 -12
  230. package/vendor/node-addon-api/test/binding.cc +0 -200
  231. package/vendor/node-addon-api/test/binding.gyp +0 -160
  232. package/vendor/node-addon-api/test/buffer.cc +0 -185
  233. package/vendor/node-addon-api/test/buffer.h +0 -26
  234. package/vendor/node-addon-api/test/buffer.js +0 -150
  235. package/vendor/node-addon-api/test/buffer_new_or_copy-inl.h +0 -68
  236. package/vendor/node-addon-api/test/buffer_no_external.cc +0 -24
  237. package/vendor/node-addon-api/test/callbackInfo.cc +0 -27
  238. package/vendor/node-addon-api/test/callbackInfo.js +0 -9
  239. package/vendor/node-addon-api/test/callbackscope.cc +0 -39
  240. package/vendor/node-addon-api/test/callbackscope.js +0 -49
  241. package/vendor/node-addon-api/test/child_processes/addon.js +0 -11
  242. package/vendor/node-addon-api/test/child_processes/addon_data.js +0 -24
  243. package/vendor/node-addon-api/test/child_processes/objectwrap_function.js +0 -22
  244. package/vendor/node-addon-api/test/child_processes/threadsafe_function_exception.js +0 -33
  245. package/vendor/node-addon-api/test/child_processes/typed_threadsafe_function_exception.js +0 -19
  246. package/vendor/node-addon-api/test/common/index.js +0 -246
  247. package/vendor/node-addon-api/test/common/test_helper.h +0 -71
  248. package/vendor/node-addon-api/test/dataview/dataview.cc +0 -48
  249. package/vendor/node-addon-api/test/dataview/dataview.js +0 -35
  250. package/vendor/node-addon-api/test/dataview/dataview_read_write.cc +0 -115
  251. package/vendor/node-addon-api/test/dataview/dataview_read_write.js +0 -92
  252. package/vendor/node-addon-api/test/date.cc +0 -45
  253. package/vendor/node-addon-api/test/date.js +0 -18
  254. package/vendor/node-addon-api/test/env_cleanup.cc +0 -100
  255. package/vendor/node-addon-api/test/env_cleanup.js +0 -55
  256. package/vendor/node-addon-api/test/env_misc.cc +0 -25
  257. package/vendor/node-addon-api/test/env_misc.js +0 -12
  258. package/vendor/node-addon-api/test/error.cc +0 -436
  259. package/vendor/node-addon-api/test/error.js +0 -111
  260. package/vendor/node-addon-api/test/error_handling_for_primitives.cc +0 -13
  261. package/vendor/node-addon-api/test/error_handling_for_primitives.js +0 -29
  262. package/vendor/node-addon-api/test/error_terminating_environment.js +0 -99
  263. package/vendor/node-addon-api/test/except_all.cc +0 -22
  264. package/vendor/node-addon-api/test/except_all.js +0 -14
  265. package/vendor/node-addon-api/test/exports.js +0 -19
  266. package/vendor/node-addon-api/test/external.cc +0 -85
  267. package/vendor/node-addon-api/test/external.js +0 -85
  268. package/vendor/node-addon-api/test/finalizer_order.cc +0 -152
  269. package/vendor/node-addon-api/test/finalizer_order.js +0 -98
  270. package/vendor/node-addon-api/test/function.cc +0 -338
  271. package/vendor/node-addon-api/test/function.js +0 -137
  272. package/vendor/node-addon-api/test/function_reference.cc +0 -204
  273. package/vendor/node-addon-api/test/function_reference.js +0 -157
  274. package/vendor/node-addon-api/test/globalObject/global_object.cc +0 -61
  275. package/vendor/node-addon-api/test/globalObject/global_object_delete_property.cc +0 -31
  276. package/vendor/node-addon-api/test/globalObject/global_object_delete_property.js +0 -58
  277. package/vendor/node-addon-api/test/globalObject/global_object_get_property.cc +0 -40
  278. package/vendor/node-addon-api/test/globalObject/global_object_get_property.js +0 -56
  279. package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.cc +0 -28
  280. package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.js +0 -46
  281. package/vendor/node-addon-api/test/globalObject/global_object_set_property.cc +0 -31
  282. package/vendor/node-addon-api/test/globalObject/global_object_set_property.js +0 -56
  283. package/vendor/node-addon-api/test/handlescope.cc +0 -86
  284. package/vendor/node-addon-api/test/handlescope.js +0 -16
  285. package/vendor/node-addon-api/test/index.js +0 -160
  286. package/vendor/node-addon-api/test/maybe/check.cc +0 -69
  287. package/vendor/node-addon-api/test/maybe/index.js +0 -50
  288. package/vendor/node-addon-api/test/memory_management.cc +0 -18
  289. package/vendor/node-addon-api/test/memory_management.js +0 -9
  290. package/vendor/node-addon-api/test/movable_callbacks.cc +0 -23
  291. package/vendor/node-addon-api/test/movable_callbacks.js +0 -21
  292. package/vendor/node-addon-api/test/name.cc +0 -110
  293. package/vendor/node-addon-api/test/name.js +0 -59
  294. package/vendor/node-addon-api/test/napi_child.js +0 -14
  295. package/vendor/node-addon-api/test/object/delete_property.cc +0 -38
  296. package/vendor/node-addon-api/test/object/delete_property.js +0 -41
  297. package/vendor/node-addon-api/test/object/finalizer.cc +0 -30
  298. package/vendor/node-addon-api/test/object/finalizer.js +0 -28
  299. package/vendor/node-addon-api/test/object/get_property.cc +0 -34
  300. package/vendor/node-addon-api/test/object/get_property.js +0 -40
  301. package/vendor/node-addon-api/test/object/has_own_property.cc +0 -34
  302. package/vendor/node-addon-api/test/object/has_own_property.js +0 -34
  303. package/vendor/node-addon-api/test/object/has_property.cc +0 -38
  304. package/vendor/node-addon-api/test/object/has_property.js +0 -37
  305. package/vendor/node-addon-api/test/object/object.cc +0 -430
  306. package/vendor/node-addon-api/test/object/object.js +0 -218
  307. package/vendor/node-addon-api/test/object/object_deprecated.cc +0 -70
  308. package/vendor/node-addon-api/test/object/object_deprecated.js +0 -42
  309. package/vendor/node-addon-api/test/object/object_freeze_seal.cc +0 -25
  310. package/vendor/node-addon-api/test/object/object_freeze_seal.js +0 -61
  311. package/vendor/node-addon-api/test/object/set_property.cc +0 -45
  312. package/vendor/node-addon-api/test/object/set_property.js +0 -30
  313. package/vendor/node-addon-api/test/object/subscript_operator.cc +0 -58
  314. package/vendor/node-addon-api/test/object/subscript_operator.js +0 -17
  315. package/vendor/node-addon-api/test/object_reference.cc +0 -417
  316. package/vendor/node-addon-api/test/object_reference.js +0 -262
  317. package/vendor/node-addon-api/test/objectwrap.cc +0 -295
  318. package/vendor/node-addon-api/test/objectwrap.js +0 -309
  319. package/vendor/node-addon-api/test/objectwrap_constructor_exception.cc +0 -26
  320. package/vendor/node-addon-api/test/objectwrap_constructor_exception.js +0 -18
  321. package/vendor/node-addon-api/test/objectwrap_function.cc +0 -43
  322. package/vendor/node-addon-api/test/objectwrap_function.js +0 -6
  323. package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.cc +0 -30
  324. package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.js +0 -13
  325. package/vendor/node-addon-api/test/objectwrap_removewrap.cc +0 -45
  326. package/vendor/node-addon-api/test/objectwrap_removewrap.js +0 -32
  327. package/vendor/node-addon-api/test/objectwrap_worker_thread.js +0 -20
  328. package/vendor/node-addon-api/test/promise.cc +0 -111
  329. package/vendor/node-addon-api/test/promise.js +0 -43
  330. package/vendor/node-addon-api/test/reference.cc +0 -78
  331. package/vendor/node-addon-api/test/reference.js +0 -20
  332. package/vendor/node-addon-api/test/require_basic_finalizers/index.js +0 -38
  333. package/vendor/node-addon-api/test/require_basic_finalizers/tpl/addon.cc +0 -12
  334. package/vendor/node-addon-api/test/require_basic_finalizers/tpl/binding.gyp +0 -48
  335. package/vendor/node-addon-api/test/require_basic_finalizers/tpl/index.js +0 -3
  336. package/vendor/node-addon-api/test/require_basic_finalizers/tpl/package.json +0 -11
  337. package/vendor/node-addon-api/test/run_script.cc +0 -56
  338. package/vendor/node-addon-api/test/run_script.js +0 -45
  339. package/vendor/node-addon-api/test/symbol.cc +0 -79
  340. package/vendor/node-addon-api/test/symbol.js +0 -66
  341. package/vendor/node-addon-api/test/testUtil.js +0 -54
  342. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.cc +0 -230
  343. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.js +0 -225
  344. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.cc +0 -155
  345. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.js +0 -13
  346. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_exception.cc +0 -50
  347. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_exception.js +0 -20
  348. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.cc +0 -125
  349. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.js +0 -14
  350. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.cc +0 -27
  351. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.js +0 -7
  352. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.cc +0 -240
  353. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.js +0 -59
  354. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.cc +0 -55
  355. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.js +0 -98
  356. package/vendor/node-addon-api/test/thunking_manual.cc +0 -127
  357. package/vendor/node-addon-api/test/thunking_manual.js +0 -16
  358. package/vendor/node-addon-api/test/type_taggable.cc +0 -66
  359. package/vendor/node-addon-api/test/type_taggable.js +0 -59
  360. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.cc +0 -215
  361. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.js +0 -188
  362. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.cc +0 -120
  363. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.js +0 -14
  364. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_exception.cc +0 -39
  365. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_exception.js +0 -13
  366. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.cc +0 -127
  367. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.js +0 -14
  368. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.cc +0 -32
  369. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.js +0 -8
  370. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.cc +0 -237
  371. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.js +0 -59
  372. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.cc +0 -67
  373. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.js +0 -98
  374. package/vendor/node-addon-api/test/typedarray-bigint.js +0 -58
  375. package/vendor/node-addon-api/test/typedarray.cc +0 -413
  376. package/vendor/node-addon-api/test/typedarray.js +0 -103
  377. package/vendor/node-addon-api/test/value_type_cast.cc +0 -60
  378. package/vendor/node-addon-api/test/value_type_cast.js +0 -106
  379. package/vendor/node-addon-api/test/version_management.cc +0 -28
  380. package/vendor/node-addon-api/test/version_management.js +0 -29
  381. package/vendor/node-addon-api/tools/README.md +0 -73
  382. package/vendor/node-addon-api/tools/check-napi.js +0 -99
  383. package/vendor/node-addon-api/tools/clang-format.js +0 -71
  384. package/vendor/node-addon-api/tools/conversion.js +0 -301
  385. package/vendor/node-addon-api/unit-test/README.md +0 -28
  386. package/vendor/node-addon-api/unit-test/binding-file-template.js +0 -39
  387. package/vendor/node-addon-api/unit-test/binding.gyp +0 -72
  388. package/vendor/node-addon-api/unit-test/exceptions.js +0 -32
  389. package/vendor/node-addon-api/unit-test/generate-binding-cc.js +0 -61
  390. package/vendor/node-addon-api/unit-test/injectTestParams.js +0 -101
  391. package/vendor/node-addon-api/unit-test/listOfTestModules.js +0 -88
  392. package/vendor/node-addon-api/unit-test/matchModules.js +0 -65
  393. package/vendor/node-addon-api/unit-test/setup.js +0 -13
  394. package/vendor/node-addon-api/unit-test/spawnTask.js +0 -26
  395. package/vendor/node-addon-api/unit-test/test.js +0 -30
  396. package/vendor/node-api-headers/CHANGELOG.md +0 -130
  397. package/vendor/node-api-headers/CODE_OF_CONDUCT.md +0 -4
  398. package/vendor/node-api-headers/CONTRIBUTING.md +0 -32
  399. package/vendor/node-api-headers/CREATING_A_RELEASE.md +0 -68
  400. package/vendor/node-api-headers/index.js +0 -17
  401. package/vendor/node-api-headers/lib/clang-utils.js +0 -50
  402. package/vendor/node-api-headers/lib/parse-utils.js +0 -92
  403. package/vendor/node-api-headers/package.json +0 -59
  404. package/vendor/node-api-headers/release-please-config.json +0 -12
  405. package/vendor/node-api-headers/scripts/update-headers.js +0 -246
  406. package/vendor/node-api-headers/scripts/write-symbols.js +0 -154
  407. package/vendor/node-api-headers/scripts/write-win32-def.js +0 -52
  408. package/vendor/node-api-headers/symbols.js +0 -257
  409. package/vendor/node-api-headers/test/parse-utils.js +0 -21
  410. /package/doc/{pages/benchmarks.md → benchmarks.md} +0 -0
  411. /package/doc/{pages/callbacks.md → callbacks.md} +0 -0
  412. /package/doc/{pages/contribute.md → contribute.md} +0 -0
  413. /package/doc/{pages/functions.md → functions.md} +0 -0
  414. /package/doc/{pages/index.md → index.md} +0 -0
  415. /package/doc/{pages/input.md → input.md} +0 -0
  416. /package/doc/{pages/migration.md → migration.md} +0 -0
  417. /package/doc/{pages/misc.md → misc.md} +0 -0
  418. /package/doc/{pages/output.md → output.md} +0 -0
  419. /package/doc/{pages/packaging.md → packaging.md} +0 -0
  420. /package/doc/{pages/platforms.md → platforms.md} +0 -0
  421. /package/doc/{pages/pointers.md → pointers.md} +0 -0
  422. /package/doc/{pages/start.md → start.md} +0 -0
  423. /package/doc/{pages/unions.md → unions.md} +0 -0
  424. /package/doc/{pages/variables.md → variables.md} +0 -0
  425. /package/src/koffi/src/{abi/loong64.cc → abi_loong64.cc} +0 -0
@@ -17,7 +17,7 @@ struct BackRegisters;
17
17
 
18
18
  // I'm not sure why the alignas(8), because alignof(CallData) is 8 without it.
19
19
  // But on Windows i386, without it, the alignment may not be correct (compiler bug?).
20
- class alignas(8) CallData {
20
+ struct alignas(8) CallData {
21
21
  struct OutArgument {
22
22
  enum class Kind {
23
23
  Array,
@@ -66,7 +66,7 @@ class alignas(8) CallData {
66
66
  LocalArray<int16_t, 16> used_trampolines;
67
67
  HeapArray<OutArgument> out_arguments;
68
68
 
69
- BlockAllocator call_alloc;
69
+ BlockAllocator alloc;
70
70
 
71
71
  public:
72
72
  CallData(Napi::Env env, InstanceData *instance, InstanceMemory *mem);
@@ -77,10 +77,8 @@ public:
77
77
  #if defined(UNITY_BUILD)
78
78
  #if defined(_MSC_VER)
79
79
  #define INLINE_IF_UNITY __forceinline
80
- #elif defined(__clang__)
81
- #define INLINE_IF_UNITY __attribute__((always_inline)) inline
82
80
  #else
83
- #define INLINE_IF_UNITY
81
+ #define INLINE_IF_UNITY __attribute__((always_inline)) inline
84
82
  #endif
85
83
  #else
86
84
  #define INLINE_IF_UNITY
@@ -92,9 +90,8 @@ public:
92
90
 
93
91
  #undef INLINE_IF_UNITY
94
92
 
95
- void Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, bool switch_stack, BackRegisters *out_reg);
96
- void RelaySafe(Size idx, uint8_t *own_sp, uint8_t *caller_sp, bool outside_call, BackRegisters *out_reg);
97
- static void RelayAsync(napi_env, napi_value, void *, void *udata);
93
+ void Relay(Size idx, uint8_t *sp);
94
+ void RelayAsync(Size idx, uint8_t *sp);
98
95
 
99
96
  void DumpForward(const FunctionInfo *func) const;
100
97
 
@@ -114,11 +111,8 @@ public:
114
111
 
115
112
  void *ReserveTrampoline(const FunctionInfo *proto, Napi::Function func);
116
113
 
117
- BlockAllocator *GetAllocator() { return &call_alloc; }
118
-
119
- private:
120
114
  template <typename T>
121
- T *AllocStack(Size size);
115
+ bool AllocStack(Size size, Size align, T **out_ptr);
122
116
  template <typename T = uint8_t>
123
117
  T *AllocHeap(Size size, Size align);
124
118
 
@@ -128,15 +122,15 @@ private:
128
122
  };
129
123
 
130
124
  template <typename T>
131
- inline T *CallData::AllocStack(Size size)
125
+ inline bool CallData::AllocStack(Size size, Size align, T **out_ptr)
132
126
  {
133
- uint8_t *ptr = AlignDown(mem->stack.end(), 16) - size;
127
+ uint8_t *ptr = AlignDown(mem->stack.end() - size, align);
134
128
  Size delta = mem->stack.end() - ptr;
135
129
 
136
130
  // Keep 512 bytes for redzone (required in some ABIs)
137
131
  if (mem->stack.len - 512 < delta) [[unlikely]] {
138
132
  ThrowError<Napi::Error>(env, "FFI call is taking up too much memory");
139
- return nullptr;
133
+ return false;
140
134
  }
141
135
 
142
136
  #if defined(K_DEBUG)
@@ -145,7 +139,8 @@ inline T *CallData::AllocStack(Size size)
145
139
 
146
140
  mem->stack.len -= delta;
147
141
 
148
- return (T *)ptr;
142
+ *out_ptr = (T *)ptr;
143
+ return true;
149
144
  }
150
145
 
151
146
  template <typename T>
@@ -170,13 +165,15 @@ inline T *CallData::AllocHeap(Size size, Size align)
170
165
  int flags = 0;
171
166
  #endif
172
167
 
173
- ptr = (uint8_t *)AllocateRaw(&call_alloc, size + align, flags);
168
+ ptr = (uint8_t *)AllocateRaw(&alloc, size + align, flags);
174
169
  ptr = AlignUp(ptr, align);
175
170
 
176
171
  return ptr;
177
172
  }
178
173
  }
179
174
 
180
- void *GetTrampoline(int16_t idx);
175
+ void PerformAsyncRelay(napi_env env, napi_value callback, void *ctx, void *udata);
176
+
177
+ void *GetTrampoline(int idx);
181
178
 
182
179
  }
@@ -39,6 +39,8 @@ SharedData shared;
39
39
 
40
40
  static thread_local CallData *exec_call;
41
41
 
42
+ extern "C" napi_value SwitchAndRelay(CallData *call, Size idx, uint8_t *sp, uint8_t *saved_sp, Span<uint8_t> *new_stack);
43
+
42
44
  static bool ChangeSize(const char *name, Napi::Value value, Size min_size, Size max_size, Size *out_size)
43
45
  {
44
46
  Napi::Env env = value.Env();
@@ -138,20 +140,6 @@ static Napi::Value GetSetConfig(const Napi::CallbackInfo &info)
138
140
  } else if (key == "max_type_size") {
139
141
  if (!ChangeSize(key.c_str(), value, 32, Mebibytes(512), &new_config.max_type_size))
140
142
  return env.Null();
141
- } else if (key == "fast_pointers") {
142
- if (!value.IsBoolean()) {
143
- ThrowError<Napi::TypeError>(env, "Unexpected %1 value for '%2', expected boolean", GetValueType(instance, value), key.c_str());
144
- return env.Null();
145
- }
146
-
147
- new_config.fast_pointers = value.As<Napi::Boolean>();
148
- } else if (key == "fast_callbacks") {
149
- if (!value.IsBoolean()) {
150
- ThrowError<Napi::TypeError>(env, "Unexpected %1 value for '%2', expected boolean", GetValueType(instance, value), key.c_str());
151
- return env.Null();
152
- }
153
-
154
- new_config.fast_callbacks = value.As<Napi::Boolean>();
155
143
  } else {
156
144
  ThrowError<Napi::Error>(env, "Unexpected config member '%1'", key.c_str());
157
145
  return env.Null();
@@ -176,8 +164,6 @@ static Napi::Value GetSetConfig(const Napi::CallbackInfo &info)
176
164
  obj.Set("resident_async_pools", instance->config.resident_async_pools);
177
165
  obj.Set("max_async_calls", instance->config.resident_async_pools + instance->config.max_temporaries);
178
166
  obj.Set("max_type_size", instance->config.max_type_size);
179
- obj.Set("fast_pointers", instance->config.fast_pointers);
180
- obj.Set("fast_callbacks", instance->config.fast_callbacks);
181
167
 
182
168
  return obj;
183
169
  }
@@ -806,10 +792,13 @@ static Napi::Value CreateDisposableType(const Napi::CallbackInfo &info)
806
792
  InstanceData *instance = env.GetInstanceData<InstanceData>();
807
793
  const Napi::FunctionReference &ref = type->dispose_ref;
808
794
 
809
- Napi::Value p = WrapPointer(env, type->ref.type, (void *)ptr);
795
+ Napi::External<void> external = Napi::External<void>::New(env, (void *)ptr);
796
+ SetValueTag(external, type->ref.marker);
810
797
 
811
- napi_value self = env.Null();
812
- napi_value args[] = { p };
798
+ Napi::Value self = env.Null();
799
+ napi_value args[] = {
800
+ external
801
+ };
813
802
 
814
803
  ref.Call(self, K_LEN(args), args);
815
804
  instance->stats.disposed++;
@@ -837,15 +826,8 @@ static Napi::Value CreateDisposableType(const Napi::CallbackInfo &info)
837
826
  type->dispose_ref = Napi::Persistent(dispose_func);
838
827
 
839
828
  // If the insert succeeds, we cannot fail anymore
840
- if (named) {
841
- bool inserted;
842
- instance->types_map.InsertOrGet(type->name, type, &inserted);
843
-
844
- if (!inserted) {
845
- ThrowError<Napi::Error>(env, "Duplicate type name '%1'", type->name);
846
- return env.Null();
847
- }
848
- }
829
+ if (named && !MapType(env, instance, type, type->name))
830
+ return env.Null();
849
831
  err_guard.Disable();
850
832
 
851
833
  return WrapType(env, type);
@@ -855,12 +837,26 @@ static inline bool GetExternalPointer(Napi::Env env, Napi::Value value, void **o
855
837
  {
856
838
  InstanceData *instance = env.GetInstanceData<InstanceData>();
857
839
 
858
- if (!TryPointer(value, out_ptr)) {
859
- ThrowError<Napi::TypeError>(env, "Unexpected %1 value for ptr, expected pointer", GetValueType(instance, value));
840
+ if (IsNullOrUndefined(value)) {
841
+ *out_ptr = 0;
842
+ return true;
843
+ } else if (IsRawBuffer(value)) {
844
+ Span<uint8_t> buffer = GetRawBuffer(value);
845
+
846
+ *out_ptr = buffer.ptr;
847
+ return true;
848
+ } else if (value.IsExternal() && !CheckValueTag(value, &TypeInfoMarker) &&
849
+ !CheckValueTag(value, &CastMarker) &&
850
+ !CheckValueTag(value, &MagicUnionMarker)) {
851
+ Napi::External<void> external = value.As<Napi::External<void>>();
852
+ void *ptr = external.Data();
853
+
854
+ *out_ptr = ptr;
855
+ return true;
856
+ } else {
857
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value for ptr, expected external pointer", GetValueType(instance, value));
860
858
  return false;
861
859
  }
862
-
863
- return true;
864
860
  }
865
861
 
866
862
  static Napi::Value CallAlloc(const Napi::CallbackInfo &info)
@@ -906,7 +902,10 @@ static Napi::Value CallAlloc(const Napi::CallbackInfo &info)
906
902
  return env.Null();
907
903
  }
908
904
 
909
- return WrapPointer(env, type, ptr);
905
+ Napi::External<void> external = Napi::External<void>::New(env, ptr);
906
+ SetValueTag(external, type);
907
+
908
+ return external;
910
909
  }
911
910
 
912
911
  static Napi::Value CallFree(const Napi::CallbackInfo &info)
@@ -1140,7 +1139,12 @@ static Napi::Value CreateFunctionType(const Napi::CallbackInfo &info)
1140
1139
  InstanceData *instance = env.GetInstanceData<InstanceData>();
1141
1140
 
1142
1141
  FunctionInfo *func = instance->callbacks.AppendDefault();
1143
- K_DEFER_N(err_guard) { instance->callbacks.RemoveLast(1); };
1142
+ TypeInfo *type = instance->types.AppendDefault();
1143
+
1144
+ K_DEFER_N(err_guard) {
1145
+ instance->callbacks.RemoveLast(1);
1146
+ instance->types.RemoveLast(1);
1147
+ };
1144
1148
 
1145
1149
  if (info.Length() >= 2) {
1146
1150
  if (!ParseClassicFunction(info, false, func))
@@ -1168,29 +1172,12 @@ static Napi::Value CreateFunctionType(const Napi::CallbackInfo &info)
1168
1172
  if (!AnalyseFunction(env, instance, func))
1169
1173
  return env.Null();
1170
1174
 
1171
- // Branchless push loop
1172
- for (const ParameterInfo &param: func->parameters) {
1173
- func->primitives.Append(param.type->primitive);
1174
- }
1175
- if (!func->variadic) {
1176
- func->primitives.Append(PrimitiveKind::Prototype);
1177
- }
1178
-
1179
1175
  // Adjust parameter offsets for koffi.call()
1180
1176
  for (ParameterInfo &param: func->parameters) {
1181
1177
  param.offset += 2;
1182
1178
  }
1183
1179
  func->required_parameters += 2;
1184
1180
 
1185
- // We cannot fail after this check
1186
- if (named && instance->types_map.Find(func->name)) {
1187
- ThrowError<Napi::Error>(env, "Duplicate type name '%1'", func->name);
1188
- return env.Null();
1189
- }
1190
- err_guard.Disable();
1191
-
1192
- TypeInfo *type = instance->types.AppendDefault();
1193
-
1194
1181
  type->name = func->name;
1195
1182
 
1196
1183
  type->primitive = PrimitiveKind::Prototype;
@@ -1198,7 +1185,10 @@ static Napi::Value CreateFunctionType(const Napi::CallbackInfo &info)
1198
1185
  type->size = K_SIZE(void *);
1199
1186
  type->ref.proto = func;
1200
1187
 
1201
- instance->types_map.Set(type->name, type);
1188
+ // If the insert succeeds, we cannot fail anymore
1189
+ if (named && !MapType(env, instance, type, type->name))
1190
+ return env.Null();
1191
+ err_guard.Disable();
1202
1192
 
1203
1193
  return WrapType(env, type);
1204
1194
  }
@@ -1441,6 +1431,18 @@ InstanceMemory *AllocateMemory(InstanceData *instance, Size stack_size, Size hea
1441
1431
  // Keep real stack limits intact, in case we need them
1442
1432
  mem->stack0 = mem->stack;
1443
1433
 
1434
+ #if defined(_WIN32) && !defined(_WIN64)
1435
+ mem->stack.len -= K_SIZE(SehFrame);
1436
+
1437
+ // Prepare at the top SEH frame record
1438
+ {
1439
+ SehFrame *seh = (SehFrame *)mem->stack.end();
1440
+
1441
+ seh->Next = (void *)-1;
1442
+ seh->Handler = (void *)SehHandler;
1443
+ }
1444
+ #endif
1445
+
1444
1446
  mem->heap.len = heap_size;
1445
1447
  #if defined(_WIN32)
1446
1448
  mem->heap.ptr = (uint8_t *)VirtualAlloc(nullptr, mem->heap.len, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
@@ -1526,105 +1528,62 @@ static Napi::Value TranslateVariadicCall(const FunctionInfo *func, void *native,
1526
1528
  Napi::Env env = info.Env();
1527
1529
  InstanceData *instance = env.GetInstanceData<InstanceData>();
1528
1530
 
1529
- FunctionInfo *variadic = nullptr;
1530
- K_DEFER_N(err_guard) { delete variadic; };
1531
-
1532
- // Try cached function
1533
- {
1534
- FunctionInfo *prev = instance->variadic_func;
1535
-
1536
- if (prev && prev->native == native) {
1537
- Size specified = (info.Length() - prev->required_parameters);
1538
- Size processed = (prev->parameters.len - prev->required_parameters) * 2;
1539
-
1540
- if (specified == processed) {
1541
- bool match = true;
1531
+ FunctionInfo copy;
1532
+ memcpy((void *)&copy, func, K_SIZE(*func));
1533
+ copy.lib = nullptr;
1542
1534
 
1543
- for (Size i = prev->required_parameters, j = prev->required_parameters; i < (Size)info.Length(); i += 2, j++) {
1544
- int directions;
1545
- const TypeInfo *type = ResolveType(info[(uint32_t)i], &directions);
1546
-
1547
- if (type != prev->parameters[j].type || directions != prev->parameters[j].directions) [[unlikely]] {
1548
- match = false;
1549
- break;
1550
- }
1551
- }
1552
-
1553
- if (match) [[likely]] {
1554
- variadic = prev;
1535
+ // This makes variadic calls non-reentrant
1536
+ K_DEFER_C(len = copy.parameters.len) {
1537
+ copy.parameters.RemoveFrom(len);
1538
+ copy.parameters.Leak();
1539
+ };
1555
1540
 
1556
- // If an error happens it'll get destroyed, so don't keep it around
1557
- instance->variadic_func = nullptr;
1558
- }
1559
- }
1560
- }
1541
+ if (info.Length() < (uint32_t)copy.required_parameters) [[unlikely]] {
1542
+ ThrowError<Napi::TypeError>(env, "Expected %1 arguments or more, got %2", copy.parameters.len, info.Length());
1543
+ return env.Null();
1544
+ }
1545
+ if ((info.Length() - copy.required_parameters) % 2) [[unlikely]] {
1546
+ ThrowError<Napi::Error>(env, "Missing value argument for variadic call");
1547
+ return env.Null();
1561
1548
  }
1562
1549
 
1563
- if (!variadic) {
1564
- variadic = new FunctionInfo();
1565
-
1566
- memcpy((void *)variadic, func, K_SIZE(*func));
1567
- memset((void *)&variadic->parameters, 0, K_SIZE(variadic->parameters));
1568
- memset((void *)&variadic->primitives, 0, K_SIZE(variadic->primitives));
1550
+ for (Size i = copy.required_parameters; i < (Size)info.Length(); i += 2) {
1551
+ ParameterInfo param = {};
1569
1552
 
1570
- variadic->parameters = func->parameters;
1571
- variadic->primitives = func->primitives;
1572
- variadic->lib = nullptr;
1553
+ param.type = ResolveType(info[(uint32_t)i], &param.directions);
1573
1554
 
1574
- if (info.Length() < (uint32_t)variadic->required_parameters) [[unlikely]] {
1575
- ThrowError<Napi::TypeError>(env, "Expected %1 arguments or more, got %2", variadic->parameters.len, info.Length());
1555
+ if (!param.type) [[unlikely]]
1556
+ return env.Null();
1557
+ if (!CanPassType(param.type, param.directions)) [[unlikely]] {
1558
+ ThrowError<Napi::TypeError>(env, "Type %1 cannot be used as a parameter", param.type->name);
1576
1559
  return env.Null();
1577
1560
  }
1578
- if ((info.Length() - variadic->required_parameters) % 2) [[unlikely]] {
1579
- ThrowError<Napi::Error>(env, "Missing value argument for variadic call");
1561
+ if (copy.parameters.len >= MaxParameters) [[unlikely]] {
1562
+ ThrowError<Napi::TypeError>(env, "Functions cannot have more than %1 parameters", MaxParameters);
1580
1563
  return env.Null();
1581
1564
  }
1582
-
1583
- for (Size i = variadic->required_parameters; i < (Size)info.Length(); i += 2) {
1584
- ParameterInfo param = {};
1585
-
1586
- param.type = ResolveType(info[(uint32_t)i], &param.directions);
1587
-
1588
- if (!param.type) [[unlikely]]
1589
- return env.Null();
1590
- if (!CanPassType(param.type, param.directions)) [[unlikely]] {
1591
- ThrowError<Napi::TypeError>(env, "Type %1 cannot be used as a parameter", param.type->name);
1592
- return env.Null();
1593
- }
1594
- if (variadic->parameters.len >= MaxParameters) [[unlikely]] {
1595
- ThrowError<Napi::TypeError>(env, "Functions cannot have more than %1 parameters", MaxParameters);
1596
- return env.Null();
1597
- }
1598
- if ((param.directions & 2) && ++variadic->out_parameters >= MaxParameters) [[unlikely]] {
1599
- ThrowError<Napi::TypeError>(env, "Functions cannot have more than %1 output parameters", MaxParameters);
1600
- return env.Null();
1601
- }
1602
-
1603
- param.variadic = true;
1604
- param.offset = (int8_t)(i + 1);
1605
-
1606
- variadic->parameters.Append(param);
1565
+ if ((param.directions & 2) && ++copy.out_parameters >= MaxParameters) [[unlikely]] {
1566
+ ThrowError<Napi::TypeError>(env, "Functions cannot have more than %1 output parameters", MaxParameters);
1567
+ return env.Null();
1607
1568
  }
1608
1569
 
1609
- if (!AnalyseFunction(env, instance, variadic)) [[unlikely]]
1610
- return env.Null();
1570
+ param.variadic = true;
1571
+ param.offset = (int8_t)(i + 1);
1611
1572
 
1612
- // Branchless push loop
1613
- for (Size i = func->parameters.len; i < variadic->parameters.len; i++) {
1614
- const ParameterInfo &param = variadic->parameters[i];
1615
- variadic->primitives.Append(param.type->primitive);
1616
- }
1617
- variadic->primitives.Append(PrimitiveKind::Prototype);
1573
+ copy.parameters.Append(param);
1618
1574
  }
1619
1575
 
1576
+ if (!AnalyseFunction(env, instance, &copy)) [[unlikely]]
1577
+ return env.Null();
1578
+
1620
1579
  InstanceMemory *mem = instance->memories[0];
1621
1580
  CallData call(env, instance, mem);
1622
1581
 
1623
- if (!call.Prepare(variadic, info)) [[unlikely]]
1582
+ if (!call.Prepare(&copy, info)) [[unlikely]]
1624
1583
  return env.Null();
1625
1584
 
1626
1585
  if (instance->debug) {
1627
- call.DumpForward(variadic);
1586
+ call.DumpForward(&copy);
1628
1587
  }
1629
1588
 
1630
1589
  // Execute call
@@ -1632,17 +1591,10 @@ static Napi::Value TranslateVariadicCall(const FunctionInfo *func, void *native,
1632
1591
  K_DEFER_C(prev_call = exec_call) { exec_call = prev_call; };
1633
1592
  exec_call = &call;
1634
1593
 
1635
- call.Execute(variadic, native);
1636
- }
1637
-
1638
- if (variadic != instance->variadic_func) {
1639
- err_guard.Disable();
1640
-
1641
- delete instance->variadic_func;
1642
- instance->variadic_func = variadic;
1594
+ call.Execute(&copy, native);
1643
1595
  }
1644
1596
 
1645
- return call.Complete(variadic);
1597
+ return call.Complete(&copy);
1646
1598
  }
1647
1599
 
1648
1600
  Napi::Value TranslateVariadicCall(const Napi::CallbackInfo &info)
@@ -1699,8 +1651,11 @@ void AsyncCall::OnOK()
1699
1651
 
1700
1652
  Napi::FunctionReference &callback = Callback();
1701
1653
 
1702
- napi_value self = env.Null();
1703
- napi_value args[] = { env.Null(), call.Complete(func) };
1654
+ Napi::Value self = env.Null();
1655
+ napi_value args[] = {
1656
+ env.Null(),
1657
+ call.Complete(func)
1658
+ };
1704
1659
 
1705
1660
  callback.Call(self, K_LEN(args), args);
1706
1661
  }
@@ -1746,35 +1701,54 @@ Napi::Value TranslateAsyncCall(const Napi::CallbackInfo &info)
1746
1701
  return TranslateAsyncCall(func, func->native, info);
1747
1702
  }
1748
1703
 
1749
- extern "C" void RelayCallback(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegisters *out_reg)
1704
+ extern "C" void RelayCallback(Size idx, uint8_t *sp)
1750
1705
  {
1751
- if (exec_call) [[likely]] {
1752
- exec_call->RelaySafe(idx, own_sp, caller_sp, false, out_reg);
1753
- } else {
1754
- // This happens if the callback pointer is called from a different thread
1755
- // than the one that runs the FFI call (sync or async).
1706
+ CallData *call = exec_call;
1756
1707
 
1757
- TrampolineInfo *trampoline = &shared.trampolines[idx];
1708
+ // Try the fast path first: we are on the main thread and we are running a native call through Koffi.
1709
+ // It should be easy, but in this case we are running on the custom Koffi stack, which will trip up
1710
+ // Node and V8. So we need to switch back to the normal/main stack.
1711
+ if (call && std::this_thread::get_id() == call->instance->main_thread_id) {
1712
+ SwitchAndRelay(call, idx, sp, call->old_sp, &call->mem->stack);
1713
+ return;
1714
+ }
1758
1715
 
1759
- Napi::Env env = trampoline->func.Env();
1760
- InstanceData *instance = env.GetInstanceData<InstanceData>();
1716
+ // Otherwise, we need to allocate memory to perform the callback.
1717
+ // Since the necessary machinery live in CallData, just use a temporary instance.
1718
+ // In some cases we would reuse the existing call (exec_call may be not null),
1719
+ // but it is rare so let's ignore this for simplicity.
1761
1720
 
1762
- InstanceMemory *mem = AllocateMemory(instance, instance->config.async_stack_size, instance->config.async_heap_size);
1763
- if (!mem) [[unlikely]] {
1764
- ThrowError<Napi::Error>(env, "Too many asynchronous calls are running");
1765
- return;
1766
- }
1721
+ TrampolineInfo *trampoline = &shared.trampolines[idx];
1722
+ Napi::Env env = trampoline->func.Env();
1723
+ InstanceData *instance = env.GetInstanceData<InstanceData>();
1724
+
1725
+ InstanceMemory *mem = AllocateMemory(instance, instance->config.async_stack_size, instance->config.async_heap_size);
1726
+ if (!mem) [[unlikely]] {
1727
+ ThrowError<Napi::Error>(env, "Too many asynchronous calls are running");
1728
+ return;
1729
+ }
1730
+
1731
+ // Avoid triggering the "use callback beyond FFI" check
1732
+ K_DEFER_C(generation = trampoline->generation) { trampoline->generation = generation; };
1733
+ trampoline->generation = -1;
1767
1734
 
1768
- // Avoid triggering the "use callback beyond FFI" check
1769
- K_DEFER_C(generation = trampoline->generation) { trampoline->generation = generation; };
1770
- trampoline->generation = -1;
1735
+ if (std::this_thread::get_id() == instance->main_thread_id) {
1736
+ CallData call(env, instance, mem);
1771
1737
 
1772
- // We set dispose_call to true so that the main thread will dispose of CallData itself
1738
+ Napi::HandleScope scope(env);
1739
+ call.Relay(idx, sp);
1740
+ } else {
1773
1741
  CallData call(env, instance, mem);
1774
- call.RelaySafe(idx, own_sp, caller_sp, true, out_reg);
1742
+ call.RelayAsync(idx, sp);
1775
1743
  }
1776
1744
  }
1777
1745
 
1746
+ extern "C" void RelayDirect(CallData *call, Size idx, uint8_t *sp)
1747
+ {
1748
+ Napi::HandleScope scope(call->env);
1749
+ call->Relay(idx, sp);
1750
+ }
1751
+
1778
1752
  static Napi::Value FindLibraryFunction(const Napi::CallbackInfo &info)
1779
1753
  {
1780
1754
  Napi::Env env = info.Env();
@@ -1811,16 +1785,9 @@ static Napi::Value FindLibraryFunction(const Napi::CallbackInfo &info)
1811
1785
 
1812
1786
  if (!AnalyseFunction(env, instance, func))
1813
1787
  return env.Null();
1814
-
1815
- // Branchless push loop
1816
- for (const ParameterInfo &param: func->parameters) {
1817
- func->primitives.Append(param.type->primitive);
1818
- }
1819
1788
  if (func->variadic) {
1789
+ // Minimize reallocations
1820
1790
  func->parameters.Grow(32);
1821
- func->primitives.Grow(32);
1822
- } else {
1823
- func->primitives.Append(PrimitiveKind::Prototype);
1824
1791
  }
1825
1792
 
1826
1793
  #if defined(_WIN32)
@@ -1885,7 +1852,10 @@ static Napi::Value FindSymbol(const Napi::CallbackInfo &info)
1885
1852
  return env.Null();
1886
1853
  }
1887
1854
 
1888
- return WrapPointer(env, type, ptr);
1855
+ Napi::External<void> external = Napi::External<void>::New(env, ptr);
1856
+ SetValueTag(external, &type);
1857
+
1858
+ return external;
1889
1859
  }
1890
1860
 
1891
1861
  static Napi::Value UnloadLibrary(const Napi::CallbackInfo &info)
@@ -2054,10 +2024,13 @@ static Napi::Value RegisterCallback(const Napi::CallbackInfo &info)
2054
2024
 
2055
2025
  void *ptr = GetTrampoline(idx);
2056
2026
 
2027
+ Napi::External<void> external = Napi::External<void>::New(env, ptr);
2028
+ SetValueTag(external, type->ref.marker);
2029
+
2057
2030
  // Cache index for fast unregistration
2058
2031
  instance->trampolines_map.Set(ptr, idx);
2059
2032
 
2060
- return WrapCallback(env, type->ref.type, ptr);
2033
+ return external;
2061
2034
  }
2062
2035
 
2063
2036
  static Napi::Value UnregisterCallback(const Napi::CallbackInfo &info)
@@ -2069,13 +2042,14 @@ static Napi::Value UnregisterCallback(const Napi::CallbackInfo &info)
2069
2042
  ThrowError<Napi::TypeError>(env, "Expected 1 argument, got %1", info.Length());
2070
2043
  return env.Null();
2071
2044
  }
2072
-
2073
- void *ptr;
2074
- if (!TryPointer(info[0], &ptr)) {
2045
+ if (!info[0].IsExternal()) {
2075
2046
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for id, expected registered callback", GetValueType(instance, info[0]));
2076
2047
  return env.Null();
2077
2048
  }
2078
2049
 
2050
+ Napi::External<void> external = info[0].As<Napi::External<void>>();
2051
+ void *ptr = external.Data();
2052
+
2079
2053
  int16_t idx;
2080
2054
  {
2081
2055
  int16_t *it = instance->trampolines_map.Find(ptr);
@@ -2394,7 +2368,7 @@ bool InitAsyncBroker(Napi::Env env, InstanceData *instance)
2394
2368
  if (napi_create_threadsafe_function(env, nullptr, nullptr,
2395
2369
  Napi::String::New(env, "Koffi Async Callback Broker"),
2396
2370
  0, 1, nullptr, nullptr, nullptr,
2397
- CallData::RelayAsync, &instance->broker) != napi_ok) {
2371
+ PerformAsyncRelay, &instance->broker) != napi_ok) {
2398
2372
  LogError("Failed to create async callback broker");
2399
2373
  return false;
2400
2374
  }
@@ -2431,8 +2405,10 @@ static void RegisterPrimitiveType(Napi::Env env, Napi::Object map, std::initiali
2431
2405
  }
2432
2406
 
2433
2407
  if (ref) {
2434
- type->ref.type = instance->types_map.FindValue(ref, nullptr);
2435
- K_ASSERT(type->ref.type);
2408
+ const TypeInfo *marker = instance->types_map.FindValue(ref, nullptr);
2409
+ K_ASSERT(marker);
2410
+
2411
+ type->ref.marker = marker;
2436
2412
  }
2437
2413
 
2438
2414
  Napi::Value wrapper = WrapType(env, type);
@@ -2647,7 +2623,10 @@ static Napi::Object InitModule(Napi::Env env, Napi::Object exports)
2647
2623
  Napi::Object node = Napi::Object::New(env);
2648
2624
  exports.Set("node", node);
2649
2625
 
2650
- node.Set("env", WrapPointer(env, instance->void_type, (napi_env)env));
2626
+ Napi::External<void> external = Napi::External<void>::New(env, (napi_env)env);
2627
+ SetValueTag(external, instance->void_type);
2628
+
2629
+ node.Set("env", external);
2651
2630
 
2652
2631
  node.Set("poll", Napi::Function::New(env, &Poll, "poll"));
2653
2632
  node.Set("PollHandle", PollHandle::Define(env));
@@ -2655,13 +2634,22 @@ static Napi::Object InitModule(Napi::Env env, Napi::Object exports)
2655
2634
 
2656
2635
  exports.Set("version", Napi::String::New(env, K_STRINGIFY(VERSION)));
2657
2636
 
2637
+ napi_add_env_cleanup_hook(env, [](void *udata) {
2638
+ InstanceData *instance = (InstanceData *)udata;
2639
+
2640
+ if (instance->broker) {
2641
+ // This deadlocks if we try to do this when the module is destroyed, when
2642
+ // the InstanceData destructor runs, so run in the env cleanup hook instead,
2643
+ // where it seems to go okay.
2644
+ napi_release_threadsafe_function(instance->broker, napi_tsfn_abort);
2645
+ }
2646
+ }, instance);
2647
+
2658
2648
  return exports;
2659
2649
  }
2660
2650
 
2661
2651
  InstanceData::~InstanceData()
2662
2652
  {
2663
- delete variadic_func;
2664
-
2665
2653
  for (InstanceMemory *mem: memories) {
2666
2654
  delete mem;
2667
2655
  }
@@ -2680,10 +2668,6 @@ InstanceData::~InstanceData()
2680
2668
  }
2681
2669
  }
2682
2670
  }
2683
-
2684
- if (broker) {
2685
- napi_release_threadsafe_function(broker, napi_tsfn_abort);
2686
- }
2687
2671
  }
2688
2672
 
2689
2673
  NODE_API_MODULE(koffi, InitModule);