koffi 2.16.0-beta.2 → 2.16.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 (425) hide show
  1. package/CHANGELOG.md +66 -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 -246
  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 -300
  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 -244
  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 -220
  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 -230
  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 -252
  51. package/src/koffi/src/{abi/x86_asm.S → abi_x86_asm.S} +38 -21
  52. package/src/koffi/src/{abi/x86_asm.asm → abi_x86_asm.asm} +33 -16
  53. package/src/koffi/src/call.cc +475 -290
  54. package/src/koffi/src/call.hh +15 -18
  55. package/src/koffi/src/ffi.cc +195 -184
  56. package/src/koffi/src/ffi.hh +60 -16
  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
@@ -12,26 +12,28 @@ namespace K {
12
12
 
13
13
  struct RelayContext {
14
14
  CallData *call;
15
- bool dispose_call;
16
15
 
17
16
  Size idx;
18
- uint8_t *own_sp;
19
- uint8_t *caller_sp;
20
- BackRegisters *out_reg;
17
+ uint8_t *sp;
21
18
 
22
- std::mutex mutex;
23
- std::condition_variable cv;
19
+ std::mutex mutex = {};
20
+ std::condition_variable cv = {};
24
21
  bool done = false;
25
22
  };
26
23
 
27
- #include "trampolines/prototypes.inc"
24
+ extern "C" void *FindTrampolineStart();
25
+ extern "C" void *FindTrampolineEnd();
26
+
27
+ static const uint8_t *TrampolineStart = (const uint8_t *)FindTrampolineStart();
28
+ static const Size TrampolineSize = ((const uint8_t *)FindTrampolineEnd() - TrampolineStart) / MaxTrampolines;
28
29
 
29
30
  CallData::CallData(Napi::Env env, InstanceData *instance, InstanceMemory *mem)
30
31
  : env(env), instance(instance),
31
32
  mem(mem), old_stack_mem(mem->stack), old_heap_mem(mem->heap)
32
33
  {
33
- mem->generation += !mem->depth;
34
34
  mem->depth++;
35
+
36
+ K_ASSERT(AlignUp(mem->stack.ptr, 16) == mem->stack.ptr);
35
37
  }
36
38
 
37
39
  CallData::~CallData()
@@ -61,9 +63,9 @@ void CallData::Dispose()
61
63
  K_ASSERT(trampoline->instance == instance);
62
64
  K_ASSERT(!trampoline->func.IsEmpty());
63
65
 
64
- trampoline->instance = nullptr;
65
66
  trampoline->func.Reset();
66
67
  trampoline->recv.Reset();
68
+ trampoline->used = false;
67
69
 
68
70
  shared.available.Append(idx);
69
71
  }
@@ -74,50 +76,26 @@ void CallData::Dispose()
74
76
  instance = nullptr;
75
77
  }
76
78
 
77
- void CallData::RelaySafe(Size idx, uint8_t *own_sp, uint8_t *caller_sp, bool outside_call, BackRegisters *out_reg)
79
+ void CallData::RelayAsync(Size idx, uint8_t *sp)
78
80
  {
79
- if (std::this_thread::get_id() != instance->main_thread_id) {
80
- // JS/V8 is single-threaded, and runs on main_thread_id. Forward the call
81
- // to the JS event loop.
82
-
83
- RelayContext ctx;
81
+ // JS/V8 is single-threaded, and runs on main_thread_id. Forward the call
82
+ // to the JS event loop.
84
83
 
85
- ctx.call = this;
86
- ctx.dispose_call = outside_call;
87
- ctx.idx = idx;
88
- ctx.own_sp = own_sp;
89
- ctx.caller_sp = caller_sp;
90
- ctx.out_reg = out_reg;
84
+ RelayContext ctx = {
85
+ .call = this,
86
+ .idx = idx,
87
+ .sp = sp
88
+ };
91
89
 
92
- napi_call_threadsafe_function(instance->broker, &ctx, napi_tsfn_blocking);
90
+ napi_call_threadsafe_function(instance->broker, &ctx, napi_tsfn_blocking);
93
91
 
94
- // Wait until it executes
95
- std::unique_lock<std::mutex> lock(ctx.mutex);
96
- while (!ctx.done) {
97
- ctx.cv.wait(lock);
98
- }
99
- } else {
100
- Napi::HandleScope scope(env);
101
- Relay(idx, own_sp, caller_sp, !outside_call, out_reg);
92
+ // Wait until it executes
93
+ std::unique_lock<std::mutex> lock(ctx.mutex);
94
+ while (!ctx.done) {
95
+ ctx.cv.wait(lock);
102
96
  }
103
97
  }
104
98
 
105
- void CallData::RelayAsync(napi_env, napi_value, void *, void *udata)
106
- {
107
- RelayContext *ctx = (RelayContext *)udata;
108
-
109
- ctx->call->Relay(ctx->idx, ctx->own_sp, ctx->caller_sp, false, ctx->out_reg);
110
-
111
- if (ctx->dispose_call) {
112
- ctx->call->Dispose();
113
- }
114
-
115
- // We're done!
116
- std::lock_guard<std::mutex> lock(ctx->mutex);
117
- ctx->done = true;
118
- ctx->cv.notify_one();
119
- }
120
-
121
99
  bool CallData::PushString(Napi::Value value, int directions, const char **out_str)
122
100
  {
123
101
  // Fast path
@@ -188,7 +166,7 @@ Size CallData::PushStringValue(Napi::Value value, const char **out_str)
188
166
  K_ASSERT(status == napi_ok);
189
167
 
190
168
  len++;
191
- buf = AllocateSpan<char>(&call_alloc, (Size)len);
169
+ buf = AllocateSpan<char>(&alloc, (Size)len);
192
170
 
193
171
  status = napi_get_value_string_utf8(env, value, buf.ptr, (size_t)buf.len, &len);
194
172
  K_ASSERT(status == napi_ok);
@@ -223,7 +201,7 @@ Size CallData::PushString16Value(Napi::Value value, const char16_t **out_str16)
223
201
  K_ASSERT(status == napi_ok);
224
202
 
225
203
  len++;
226
- buf = AllocateSpan<char16_t>(&call_alloc, (Size)len);
204
+ buf = AllocateSpan<char16_t>(&alloc, (Size)len);
227
205
 
228
206
  status = napi_get_value_string_utf16(env, value, buf.ptr, (size_t)buf.len, &len);
229
207
  K_ASSERT(status == napi_ok);
@@ -254,7 +232,7 @@ Size CallData::PushString32Value(Napi::Value value, const char32_t **out_str32)
254
232
  mem->heap.ptr += buf16.len * 4;
255
233
  mem->heap.len -= buf16.len * 4;
256
234
  } else {
257
- buf = AllocateSpan<char32_t>(&call_alloc, buf16.len);
235
+ buf = AllocateSpan<char32_t>(&alloc, buf16.len);
258
236
  }
259
237
 
260
238
  Size j = 0;
@@ -342,29 +320,6 @@ bool CallData::PushObject(Napi::Object obj, const TypeInfo *type, uint8_t *origi
342
320
 
343
321
  MemSet(origin, 0, type->size);
344
322
 
345
- #define PUSH_NUMBER(CType) \
346
- do { \
347
- CType v; \
348
- \
349
- if (!TryNumber(value, &v)) [[unlikely]] { \
350
- ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected number", GetValueType(instance, value)); \
351
- return false; \
352
- } \
353
- \
354
- *(CType *)dest = v; \
355
- } while (false)
356
- #define PUSH_NUMBER_SWAP(CType) \
357
- do { \
358
- CType v; \
359
- \
360
- if (!TryNumber(value, &v)) [[unlikely]] { \
361
- ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected number", GetValueType(instance, value)); \
362
- return false; \
363
- } \
364
- \
365
- *(CType *)dest = ReverseBytes(v); \
366
- } while (false)
367
-
368
323
  for (Size i = 0; i < members.len; i++) {
369
324
  const RecordMember &member = members[i];
370
325
  Napi::Value value = obj.Get(member.name);
@@ -385,30 +340,140 @@ bool CallData::PushObject(Napi::Object obj, const TypeInfo *type, uint8_t *origi
385
340
  case PrimitiveKind::Void: { K_UNREACHABLE(); } break;
386
341
 
387
342
  case PrimitiveKind::Bool: {
388
- bool b;
389
- napi_status status = napi_get_value_bool(env, value, &b);
390
-
391
- if (status != napi_ok) [[unlikely]] {
343
+ if (!value.IsBoolean()) [[unlikely]] {
392
344
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected boolean", GetValueType(instance, value));
393
345
  return false;
394
346
  }
395
347
 
348
+ bool b = value.As<Napi::Boolean>();
396
349
  *(bool *)dest = b;
397
350
  } break;
398
- case PrimitiveKind::Int8: { PUSH_NUMBER(int8_t); } break;
399
- case PrimitiveKind::UInt8: { PUSH_NUMBER(uint8_t); } break;
400
- case PrimitiveKind::Int16: { PUSH_NUMBER(int16_t); } break;
401
- case PrimitiveKind::Int16S: { PUSH_NUMBER_SWAP(int16_t); } break;
402
- case PrimitiveKind::UInt16: { PUSH_NUMBER(uint16_t); } break;
403
- case PrimitiveKind::UInt16S: { PUSH_NUMBER_SWAP(uint16_t); } break;
404
- case PrimitiveKind::Int32: { PUSH_NUMBER(int32_t); } break;
405
- case PrimitiveKind::Int32S: { PUSH_NUMBER_SWAP(int32_t); } break;
406
- case PrimitiveKind::UInt32: { PUSH_NUMBER(uint32_t); } break;
407
- case PrimitiveKind::UInt32S: { PUSH_NUMBER_SWAP(uint32_t); } break;
408
- case PrimitiveKind::Int64: { PUSH_NUMBER(int64_t); } break;
409
- case PrimitiveKind::Int64S: { PUSH_NUMBER_SWAP(int64_t); } break;
410
- case PrimitiveKind::UInt64: { PUSH_NUMBER(uint64_t); } break;
411
- case PrimitiveKind::UInt64S: { PUSH_NUMBER_SWAP(uint64_t); } break;
351
+ case PrimitiveKind::Int8: {
352
+ if (!value.IsNumber() && !value.IsBigInt()) [[unlikely]] {
353
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected number", GetValueType(instance, value));
354
+ return false;
355
+ }
356
+
357
+ int8_t v = GetNumber<int8_t>(value);
358
+ *(int8_t *)dest = v;
359
+ } break;
360
+ case PrimitiveKind::UInt8: {
361
+ if (!value.IsNumber() && !value.IsBigInt()) [[unlikely]] {
362
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected number", GetValueType(instance, value));
363
+ return false;
364
+ }
365
+
366
+ uint8_t v = GetNumber<uint8_t>(value);
367
+ *(uint8_t *)dest = v;
368
+ } break;
369
+ case PrimitiveKind::Int16: {
370
+ if (!value.IsNumber() && !value.IsBigInt()) [[unlikely]] {
371
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected number", GetValueType(instance, value));
372
+ return false;
373
+ }
374
+
375
+ int16_t v = GetNumber<int16_t>(value);
376
+ *(int16_t *)dest = v;
377
+ } break;
378
+ case PrimitiveKind::Int16S: {
379
+ if (!value.IsNumber() && !value.IsBigInt()) [[unlikely]] {
380
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected number", GetValueType(instance, value));
381
+ return false;
382
+ }
383
+
384
+ int16_t v = GetNumber<int16_t>(value);
385
+ *(int16_t *)dest = ReverseBytes(v);
386
+ } break;
387
+ case PrimitiveKind::UInt16: {
388
+ if (!value.IsNumber() && !value.IsBigInt()) [[unlikely]] {
389
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected number", GetValueType(instance, value));
390
+ return false;
391
+ }
392
+
393
+ uint16_t v = GetNumber<uint16_t>(value);
394
+ *(uint16_t *)dest = v;
395
+ } break;
396
+ case PrimitiveKind::UInt16S: {
397
+ if (!value.IsNumber() && !value.IsBigInt()) [[unlikely]] {
398
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected number", GetValueType(instance, value));
399
+ return false;
400
+ }
401
+
402
+ uint16_t v = GetNumber<uint16_t>(value);
403
+ *(uint16_t *)dest = ReverseBytes(v);
404
+ } break;
405
+ case PrimitiveKind::Int32: {
406
+ if (!value.IsNumber() && !value.IsBigInt()) [[unlikely]] {
407
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected number", GetValueType(instance, value));
408
+ return false;
409
+ }
410
+
411
+ int32_t v = GetNumber<int32_t>(value);
412
+ *(int32_t *)dest = v;
413
+ } break;
414
+ case PrimitiveKind::Int32S: {
415
+ if (!value.IsNumber() && !value.IsBigInt()) [[unlikely]] {
416
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected number", GetValueType(instance, value));
417
+ return false;
418
+ }
419
+
420
+ int32_t v = GetNumber<int32_t>(value);
421
+ *(int32_t *)dest = ReverseBytes(v);
422
+ } break;
423
+ case PrimitiveKind::UInt32: {
424
+ if (!value.IsNumber() && !value.IsBigInt()) [[unlikely]] {
425
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected number", GetValueType(instance, value));
426
+ return false;
427
+ }
428
+
429
+ uint32_t v = GetNumber<uint32_t>(value);
430
+ *(uint32_t *)dest = v;
431
+ } break;
432
+ case PrimitiveKind::UInt32S: {
433
+ if (!value.IsNumber() && !value.IsBigInt()) [[unlikely]] {
434
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected number", GetValueType(instance, value));
435
+ return false;
436
+ }
437
+
438
+ uint32_t v = GetNumber<uint32_t>(value);
439
+ *(uint32_t *)dest = ReverseBytes(v);
440
+ } break;
441
+ case PrimitiveKind::Int64: {
442
+ if (!value.IsNumber() && !value.IsBigInt()) [[unlikely]] {
443
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected number", GetValueType(instance, value));
444
+ return false;
445
+ }
446
+
447
+ int64_t v = GetNumber<int64_t>(value);
448
+ *(int64_t *)dest = v;
449
+ } break;
450
+ case PrimitiveKind::Int64S: {
451
+ if (!value.IsNumber() && !value.IsBigInt()) [[unlikely]] {
452
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected number", GetValueType(instance, value));
453
+ return false;
454
+ }
455
+
456
+ int64_t v = GetNumber<int64_t>(value);
457
+ *(int64_t *)dest = ReverseBytes(v);
458
+ } break;
459
+ case PrimitiveKind::UInt64: {
460
+ if (!value.IsNumber() && !value.IsBigInt()) [[unlikely]] {
461
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected number", GetValueType(instance, value));
462
+ return false;
463
+ }
464
+
465
+ uint64_t v = GetNumber<uint64_t>(value);
466
+ *(uint64_t *)dest = v;
467
+ } break;
468
+ case PrimitiveKind::UInt64S: {
469
+ if (!value.IsNumber() && !value.IsBigInt()) [[unlikely]] {
470
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected number", GetValueType(instance, value));
471
+ return false;
472
+ }
473
+
474
+ uint64_t v = GetNumber<uint64_t>(value);
475
+ *(uint64_t *)dest = ReverseBytes(v);
476
+ } break;
412
477
  case PrimitiveKind::String: {
413
478
  const char *str;
414
479
  if (!PushString(value, 1, &str)) [[unlikely]]
@@ -453,7 +518,8 @@ bool CallData::PushObject(Napi::Object obj, const TypeInfo *type, uint8_t *origi
453
518
  Napi::Array array = value.As<Napi::Array>();
454
519
  if (!PushNormalArray(array, member.type, member.type->size, dest))
455
520
  return false;
456
- } else if (Span<uint8_t> buffer = {}; TryBuffer(value, &buffer)) {
521
+ } else if (IsRawBuffer(value)) {
522
+ Span<const uint8_t> buffer = GetRawBuffer(value);
457
523
  PushBuffer(buffer, member.type, dest);
458
524
  } else if (value.IsString()) {
459
525
  if (!PushStringArray(value, member.type, dest))
@@ -463,8 +529,24 @@ bool CallData::PushObject(Napi::Object obj, const TypeInfo *type, uint8_t *origi
463
529
  return false;
464
530
  }
465
531
  } break;
466
- case PrimitiveKind::Float32: { PUSH_NUMBER(float); } break;
467
- case PrimitiveKind::Float64: { PUSH_NUMBER(double); } break;
532
+ case PrimitiveKind::Float32: {
533
+ if (!value.IsNumber() && !value.IsBigInt()) [[unlikely]] {
534
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected number", GetValueType(instance, value));
535
+ return false;
536
+ }
537
+
538
+ float f = GetNumber<float>(value);
539
+ *(float *)dest = f;
540
+ } break;
541
+ case PrimitiveKind::Float64: {
542
+ if (!value.IsNumber() && !value.IsBigInt()) [[unlikely]] {
543
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected number", GetValueType(instance, value));
544
+ return false;
545
+ }
546
+
547
+ double d = GetNumber<double>(value);
548
+ *(double *)dest = d;
549
+ } break;
468
550
  case PrimitiveKind::Callback: {
469
551
  void *ptr;
470
552
  if (!PushCallback(value, member.type, &ptr))
@@ -477,9 +559,6 @@ bool CallData::PushObject(Napi::Object obj, const TypeInfo *type, uint8_t *origi
477
559
  }
478
560
  }
479
561
 
480
- #undef PUSH_NUMBER_SWAP
481
- #undef PUSH_NUMBER
482
-
483
562
  return true;
484
563
  }
485
564
 
@@ -499,7 +578,7 @@ bool CallData::PushNormalArray(Napi::Array array, const TypeInfo *type, Size siz
499
578
 
500
579
  Size offset = 0;
501
580
 
502
- #define PUSH_ARRAY(Code) \
581
+ #define PUSH_ARRAY(Check, Expected, GetCode) \
503
582
  do { \
504
583
  for (Size i = 0; i < len; i++) { \
505
584
  Napi::Value value = array[(uint32_t)i]; \
@@ -507,33 +586,16 @@ bool CallData::PushNormalArray(Napi::Array array, const TypeInfo *type, Size siz
507
586
  offset = AlignLen(offset, ref->align); \
508
587
  uint8_t *dest = origin + offset; \
509
588
  \
510
- Code \
589
+ if (!(Check)) [[unlikely]] { \
590
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected %2", GetValueType(instance, value), (Expected)); \
591
+ return false; \
592
+ } \
593
+ \
594
+ GetCode \
511
595
  \
512
596
  offset += ref->size; \
513
597
  } \
514
598
  } while (false)
515
- #define PUSH_NUMBERS(CType) \
516
- PUSH_ARRAY({ \
517
- CType v; \
518
- \
519
- if (!TryNumber(value, &v)) [[unlikely]] { \
520
- ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected number", GetValueType(instance, value)); \
521
- return false; \
522
- } \
523
- \
524
- *(CType *)dest = v; \
525
- })
526
- #define PUSH_NUMBERS_SWAP(CType) \
527
- PUSH_ARRAY({ \
528
- CType v; \
529
- \
530
- if (!TryNumber(value, &v)) [[unlikely]] { \
531
- ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected number", GetValueType(instance, value)); \
532
- return false; \
533
- } \
534
- \
535
- *(CType *)dest = ReverseBytes(v); \
536
- })
537
599
 
538
600
  switch (ref->primitive) {
539
601
  case PrimitiveKind::Void: {
@@ -542,34 +604,97 @@ bool CallData::PushNormalArray(Napi::Array array, const TypeInfo *type, Size siz
542
604
  } break;
543
605
 
544
606
  case PrimitiveKind::Bool: {
545
- PUSH_ARRAY({
546
- bool b;
547
- napi_status status = napi_get_value_bool(env, value, &b);
548
-
549
- if (status != napi_ok) [[unlikely]] {
550
- ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected boolean", GetValueType(instance, value));
551
- return false;
552
- }
553
-
607
+ PUSH_ARRAY(value.IsBoolean(), "boolean", {
608
+ bool b = value.As<Napi::Boolean>();
554
609
  *(bool *)dest = b;
555
610
  });
556
611
  } break;
557
- case PrimitiveKind::Int8: { PUSH_NUMBERS(int8_t); } break;
558
- case PrimitiveKind::UInt8: { PUSH_NUMBERS(uint8_t); } break;
559
- case PrimitiveKind::Int16: { PUSH_NUMBERS(int16_t); } break;
560
- case PrimitiveKind::Int16S: { PUSH_NUMBERS_SWAP(int16_t); } break;
561
- case PrimitiveKind::UInt16: { PUSH_NUMBERS(uint16_t); } break;
562
- case PrimitiveKind::UInt16S: { PUSH_NUMBERS_SWAP(uint16_t); } break;
563
- case PrimitiveKind::Int32: { PUSH_NUMBERS(int32_t); } break;
564
- case PrimitiveKind::Int32S: { PUSH_NUMBERS_SWAP(int32_t); } break;
565
- case PrimitiveKind::UInt32: { PUSH_NUMBERS(uint32_t); } break;
566
- case PrimitiveKind::UInt32S: { PUSH_NUMBERS_SWAP(uint32_t); } break;
567
- case PrimitiveKind::Int64: { PUSH_NUMBERS(int64_t); } break;
568
- case PrimitiveKind::Int64S: { PUSH_NUMBERS_SWAP(int64_t); } break;
569
- case PrimitiveKind::UInt64: { PUSH_NUMBERS(uint64_t); } break;
570
- case PrimitiveKind::UInt64S: { PUSH_NUMBERS_SWAP(uint64_t); } break;
612
+ case PrimitiveKind::Int8: {
613
+ PUSH_ARRAY(value.IsNumber() || value.IsBigInt(), "number", {
614
+ int8_t v = GetNumber<int8_t>(value);
615
+ *(int8_t *)dest = v;
616
+ });
617
+ } break;
618
+ case PrimitiveKind::UInt8: {
619
+ PUSH_ARRAY(value.IsNumber() || value.IsBigInt(), "number", {
620
+ uint8_t v = GetNumber<uint8_t>(value);
621
+ *(uint8_t *)dest = v;
622
+ });
623
+ } break;
624
+ case PrimitiveKind::Int16: {
625
+ PUSH_ARRAY(value.IsNumber() || value.IsBigInt(), "number", {
626
+ int16_t v = GetNumber<int16_t>(value);
627
+ *(int16_t *)dest = v;
628
+ });
629
+ } break;
630
+ case PrimitiveKind::Int16S: {
631
+ PUSH_ARRAY(value.IsNumber() || value.IsBigInt(), "number", {
632
+ int16_t v = GetNumber<int16_t>(value);
633
+ *(int16_t *)dest = ReverseBytes(v);
634
+ });
635
+ } break;
636
+ case PrimitiveKind::UInt16: {
637
+ PUSH_ARRAY(value.IsNumber() || value.IsBigInt(), "number", {
638
+ uint16_t v = GetNumber<uint16_t>(value);
639
+ *(uint16_t *)dest = v;
640
+ });
641
+ } break;
642
+ case PrimitiveKind::UInt16S: {
643
+ PUSH_ARRAY(value.IsNumber() || value.IsBigInt(), "number", {
644
+ uint16_t v = GetNumber<uint16_t>(value);
645
+ *(uint16_t *)dest = ReverseBytes(v);
646
+ });
647
+ } break;
648
+ case PrimitiveKind::Int32: {
649
+ PUSH_ARRAY(value.IsNumber() || value.IsBigInt(), "number", {
650
+ int32_t v = GetNumber<int32_t>(value);
651
+ *(int32_t *)dest = v;
652
+ });
653
+ } break;
654
+ case PrimitiveKind::Int32S: {
655
+ PUSH_ARRAY(value.IsNumber() || value.IsBigInt(), "number", {
656
+ int32_t v = GetNumber<int32_t>(value);
657
+ *(int32_t *)dest = ReverseBytes(v);
658
+ });
659
+ } break;
660
+ case PrimitiveKind::UInt32: {
661
+ PUSH_ARRAY(value.IsNumber() || value.IsBigInt(), "number", {
662
+ uint32_t v = GetNumber<uint32_t>(value);
663
+ *(uint32_t *)dest = v;
664
+ });
665
+ } break;
666
+ case PrimitiveKind::UInt32S: {
667
+ PUSH_ARRAY(value.IsNumber() || value.IsBigInt(), "number", {
668
+ uint32_t v = GetNumber<uint32_t>(value);
669
+ *(uint32_t *)dest = ReverseBytes(v);
670
+ });
671
+ } break;
672
+ case PrimitiveKind::Int64: {
673
+ PUSH_ARRAY(value.IsNumber() || value.IsBigInt(), "number", {
674
+ int64_t v = GetNumber<int64_t>(value);
675
+ *(int64_t *)dest = v;
676
+ });
677
+ } break;
678
+ case PrimitiveKind::Int64S: {
679
+ PUSH_ARRAY(value.IsNumber() || value.IsBigInt(), "number", {
680
+ int64_t v = GetNumber<int64_t>(value);
681
+ *(int64_t *)dest = ReverseBytes(v);
682
+ });
683
+ } break;
684
+ case PrimitiveKind::UInt64: {
685
+ PUSH_ARRAY(value.IsNumber() || value.IsBigInt(), "number", {
686
+ uint64_t v = GetNumber<uint64_t>(value);
687
+ *(uint64_t *)dest = v;
688
+ });
689
+ } break;
690
+ case PrimitiveKind::UInt64S: {
691
+ PUSH_ARRAY(value.IsNumber() || value.IsBigInt(), "number", {
692
+ uint64_t v = GetNumber<uint64_t>(value);
693
+ *(uint64_t *)dest = ReverseBytes(v);
694
+ });
695
+ } break;
571
696
  case PrimitiveKind::String: {
572
- PUSH_ARRAY({
697
+ PUSH_ARRAY(true, "string", {
573
698
  const char *str;
574
699
  if (!PushString(value, 1, &str)) [[unlikely]]
575
700
  return false;
@@ -578,7 +703,7 @@ bool CallData::PushNormalArray(Napi::Array array, const TypeInfo *type, Size siz
578
703
  });
579
704
  } break;
580
705
  case PrimitiveKind::String16: {
581
- PUSH_ARRAY({
706
+ PUSH_ARRAY(true, "string", {
582
707
  const char16_t *str16;
583
708
  if (!PushString16(value, 1, &str16)) [[unlikely]]
584
709
  return false;
@@ -587,7 +712,7 @@ bool CallData::PushNormalArray(Napi::Array array, const TypeInfo *type, Size siz
587
712
  });
588
713
  } break;
589
714
  case PrimitiveKind::String32: {
590
- PUSH_ARRAY({
715
+ PUSH_ARRAY(true, "string", {
591
716
  const char32_t *str32;
592
717
  if (!PushString32(value, 1, &str32)) [[unlikely]]
593
718
  return false;
@@ -596,12 +721,7 @@ bool CallData::PushNormalArray(Napi::Array array, const TypeInfo *type, Size siz
596
721
  });
597
722
  } break;
598
723
  case PrimitiveKind::Pointer: {
599
- PUSH_ARRAY({
600
- if (!IsObject(value)) [[unlikely]] {
601
- ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected object", GetValueType(instance, value));
602
- return false;
603
- }
604
-
724
+ PUSH_ARRAY(true, ref->name, {
605
725
  void *ptr;
606
726
  if (!PushPointer(value, ref, 1, &ptr)) [[unlikely]]
607
727
  return false;
@@ -611,12 +731,7 @@ bool CallData::PushNormalArray(Napi::Array array, const TypeInfo *type, Size siz
611
731
  } break;
612
732
  case PrimitiveKind::Record:
613
733
  case PrimitiveKind::Union: {
614
- PUSH_ARRAY({
615
- if (!IsObject(value)) [[unlikely]] {
616
- ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected object", GetValueType(instance, value));
617
- return false;
618
- }
619
-
734
+ PUSH_ARRAY(IsObject(value), "object", {
620
735
  Napi::Object obj2 = value.As<Napi::Object>();
621
736
  if (!PushObject(obj2, ref, dest))
622
737
  return false;
@@ -634,7 +749,8 @@ bool CallData::PushNormalArray(Napi::Array array, const TypeInfo *type, Size siz
634
749
  Napi::Array array2 = value.As<Napi::Array>();
635
750
  if (!PushNormalArray(array2, ref, (Size)ref->size, dest))
636
751
  return false;
637
- } else if (Span<uint8_t> buffer = {}; TryBuffer(value, &buffer)) {
752
+ } else if (IsRawBuffer(value)) {
753
+ Span<const uint8_t> buffer = GetRawBuffer(value);
638
754
  PushBuffer(buffer, ref, dest);
639
755
  } else if (value.IsString()) {
640
756
  if (!PushStringArray(value, ref, dest))
@@ -647,8 +763,18 @@ bool CallData::PushNormalArray(Napi::Array array, const TypeInfo *type, Size siz
647
763
  offset += ref->size;
648
764
  }
649
765
  } break;
650
- case PrimitiveKind::Float32: { PUSH_NUMBERS(float); } break;
651
- case PrimitiveKind::Float64: { PUSH_NUMBERS(double); } break;
766
+ case PrimitiveKind::Float32: {
767
+ PUSH_ARRAY(value.IsNumber() || value.IsBigInt(), "number", {
768
+ float f = GetNumber<float>(value);
769
+ *(float *)dest = f;
770
+ });
771
+ } break;
772
+ case PrimitiveKind::Float64: {
773
+ PUSH_ARRAY(value.IsNumber() || value.IsBigInt(), "number", {
774
+ double d = GetNumber<double>(value);
775
+ *(double *)dest = d;
776
+ });
777
+ } break;
652
778
  case PrimitiveKind::Callback: {
653
779
  for (Size i = 0; i < len; i++) {
654
780
  Napi::Value value = array[(uint32_t)i];
@@ -670,8 +796,6 @@ bool CallData::PushNormalArray(Napi::Array array, const TypeInfo *type, Size siz
670
796
  case PrimitiveKind::Prototype: { K_UNREACHABLE(); } break;
671
797
  }
672
798
 
673
- #undef PUSH_NUMBERS_SWAP
674
- #undef PUSH_NUMBERS
675
799
  #undef PUSH_ARRAY
676
800
 
677
801
  return true;
@@ -752,140 +876,178 @@ bool CallData::PushPointer(Napi::Value value, const TypeInfo *type, int directio
752
876
 
753
877
  const TypeInfo *ref = type->ref.type;
754
878
 
755
- // In the past we were naively using napi_typeof() and a switch to "reduce" branching,
756
- // but it did not match the common types very well (so there was still various if tests),
757
- // and it turns out that napi_typeof() is made of successive type tests anyway so it
758
- // just made things worse. Oh, well.
879
+ switch (value.Type()) {
880
+ case napi_undefined:
881
+ case napi_null: {
882
+ *out_ptr = nullptr;
883
+ return true;
884
+ } break;
759
885
 
760
- if (void *ptr = nullptr; TryPointer(value, &ptr)) {
761
- *out_ptr = ptr;
762
- return true;
763
- } else if (value.IsArray()) {
764
- uint8_t *ptr = nullptr;
886
+ case napi_external: {
887
+ K_ASSERT(type->primitive == PrimitiveKind::Pointer ||
888
+ type->primitive == PrimitiveKind::String ||
889
+ type->primitive == PrimitiveKind::String16 ||
890
+ type->primitive == PrimitiveKind::String32);
765
891
 
766
- Napi::Array array = value.As<Napi::Array>();
767
- Size len = PushIndirectString(array, ref, &ptr);
892
+ if (!CheckValueTag(value, type->ref.marker) &&
893
+ !CheckValueTag(value, instance->void_type) &&
894
+ ref != instance->void_type) [[unlikely]]
895
+ goto unexpected;
768
896
 
769
- OutArgument::Kind out_kind;
770
- Size out_max_len = -1;
897
+ *out_ptr = value.As<Napi::External<uint8_t>>().Data();
898
+ return true;
899
+ } break;
771
900
 
772
- if (len >= 0) {
773
- if (!ref->size && ref != instance->void_type) [[unlikely]] {
774
- ThrowError<Napi::TypeError>(env, "Cannot pass [string] value to %1", type->name);
775
- return false;
776
- }
901
+ case napi_object: {
902
+ uint8_t *ptr = nullptr;
777
903
 
778
- switch (ref->size) {
779
- default: { out_kind = OutArgument::Kind::String; } break;
780
- case 2: { out_kind = OutArgument::Kind::String16; } break;
781
- case 4: { out_kind = OutArgument::Kind::String32; } break;
782
- }
783
- out_max_len = len;
784
- } else {
785
- if (!ref->size) [[unlikely]] {
786
- ThrowError<Napi::TypeError>(env, "Cannot pass %1 value to %2, use koffi.as()",
787
- ref != instance->void_type ? "opaque" : "ambiguous", type->name);
788
- return false;
789
- }
904
+ OutArgument::Kind out_kind;
905
+ Size out_max_len = -1;
790
906
 
791
- Size len = (Size)array.Length();
792
- Size size = len * ref->size;
907
+ if (value.IsArray()) {
908
+ Napi::Array array = value.As<Napi::Array>();
909
+ Size len = PushIndirectString(array, ref, &ptr);
793
910
 
794
- ptr = AllocHeap(size, 16);
911
+ if (len >= 0) {
912
+ if (!ref->size && ref != instance->void_type) [[unlikely]] {
913
+ ThrowError<Napi::TypeError>(env, "Cannot pass [string] value to %1", type->name);
914
+ return false;
915
+ }
916
+
917
+ switch (ref->size) {
918
+ default: { out_kind = OutArgument::Kind::String; } break;
919
+ case 2: { out_kind = OutArgument::Kind::String16; } break;
920
+ case 4: { out_kind = OutArgument::Kind::String32; } break;
921
+ }
922
+ out_max_len = len;
923
+ } else {
924
+ if (!ref->size) [[unlikely]] {
925
+ ThrowError<Napi::TypeError>(env, "Cannot pass %1 value to %2, use koffi.as()",
926
+ ref != instance->void_type ? "opaque" : "ambiguous", type->name);
927
+ return false;
928
+ }
929
+
930
+ Size len = (Size)array.Length();
931
+ Size size = len * ref->size;
932
+
933
+ ptr = AllocHeap(size, 16);
934
+
935
+ if (directions & 1) {
936
+ if (!PushNormalArray(array, type, size, ptr))
937
+ return false;
938
+ } else {
939
+ MemSet(ptr, 0, size);
940
+ }
941
+
942
+ out_kind = OutArgument::Kind::Array;
943
+ }
944
+ } else if (IsRawBuffer(value)) {
945
+ Span<uint8_t> buffer = GetRawBuffer(value);
946
+
947
+ // We can fast path
948
+ ptr = buffer.ptr;
949
+ directions = 1;
950
+
951
+ out_kind = OutArgument::Kind::Buffer;
952
+ } else if (ref->primitive == PrimitiveKind::Record ||
953
+ ref->primitive == PrimitiveKind::Union) [[likely]] {
954
+ Napi::Object obj = value.As<Napi::Object>();
955
+ K_ASSERT(IsObject(value));
956
+
957
+ ptr = AllocHeap(ref->size, 16);
795
958
 
796
- if (directions & 1) {
797
- if (!PushNormalArray(array, type, size, ptr))
959
+ if (ref->primitive == PrimitiveKind::Union &&
960
+ (directions & 2) && !CheckValueTag(obj, &MagicUnionMarker)) [[unlikely]] {
961
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected union value", GetValueType(instance, obj));
798
962
  return false;
963
+ }
964
+
965
+ if (directions & 1) {
966
+ if (!PushObject(obj, ref, ptr))
967
+ return false;
968
+ } else {
969
+ MemSet(ptr, 0, ref->size);
970
+ }
971
+
972
+ out_kind = OutArgument::Kind::Object;
799
973
  } else {
800
- MemSet(ptr, 0, size);
974
+ goto unexpected;
801
975
  }
802
976
 
803
- out_kind = OutArgument::Kind::Array;
804
- }
977
+ if (directions & 2) {
978
+ OutArgument *out = out_arguments.AppendDefault();
805
979
 
806
- if (directions & 2) {
807
- OutArgument *out = out_arguments.AppendDefault();
980
+ napi_status status = napi_create_reference(env, value, 1, &out->ref);
981
+ K_ASSERT(status == napi_ok);
808
982
 
809
- napi_status status = napi_create_reference(env, value, 1, &out->ref);
810
- K_ASSERT(status == napi_ok);
983
+ out->kind = out_kind;
984
+ out->ptr = ptr;
985
+ out->type = ref;
986
+ out->max_len = out_max_len;
987
+ }
811
988
 
812
- out->kind = out_kind;
813
- out->ptr = ptr;
814
- out->type = ref;
815
- out->max_len = out_max_len;
816
- }
989
+ *out_ptr = ptr;
990
+ return true;
991
+ } break;
817
992
 
818
- *out_ptr = ptr;
819
- return true;
820
- } else if (ref->primitive == PrimitiveKind::Record ||
821
- ref->primitive == PrimitiveKind::Union) [[likely]] {
822
- Napi::Object obj = value.As<Napi::Object>();
823
- K_ASSERT(IsObject(value));
993
+ case napi_string: {
994
+ K_ASSERT(type->primitive == PrimitiveKind::Pointer);
824
995
 
825
- uint8_t *ptr = AllocHeap(ref->size, 16);
996
+ if (directions & 2) [[unlikely]]
997
+ goto unexpected;
826
998
 
827
- if (ref->primitive == PrimitiveKind::Union &&
828
- (directions & 2) && !CheckValueTag(obj, &MagicUnionMarker)) [[unlikely]] {
829
- ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected union value", GetValueType(instance, obj));
830
- return false;
831
- }
999
+ if (ref == instance->void_type) {
1000
+ PushStringValue(value, (const char **)out_ptr);
1001
+ return true;
1002
+ } else if (ref->primitive == PrimitiveKind::Int8) {
1003
+ PushStringValue(value, (const char **)out_ptr);
1004
+ return true;
1005
+ } else if (ref->primitive == PrimitiveKind::Int16) {
1006
+ PushString16Value(value, (const char16_t **)out_ptr);
1007
+ return true;
1008
+ } else if (ref->primitive == PrimitiveKind::Int32) {
1009
+ PushString32Value(value, (const char32_t **)out_ptr);
1010
+ return true;
1011
+ } else {
1012
+ goto unexpected;
1013
+ }
1014
+ } break;
832
1015
 
833
- if (directions & 1) {
834
- if (!PushObject(obj, ref, ptr))
1016
+ case napi_function: {
1017
+ if (type->primitive != PrimitiveKind::Callback) [[unlikely]] {
1018
+ ThrowError<Napi::TypeError>(env, "Cannot pass function to type %1", type->name);
835
1019
  return false;
836
- } else {
837
- MemSet(ptr, 0, ref->size);
838
- }
839
-
840
- if (directions & 2) {
841
- OutArgument *out = out_arguments.AppendDefault();
1020
+ }
842
1021
 
843
- napi_status status = napi_create_reference(env, value, 1, &out->ref);
844
- K_ASSERT(status == napi_ok);
1022
+ Napi::Function func = value.As<Napi::Function>();
845
1023
 
846
- out->kind = OutArgument::Kind::Object;
847
- out->ptr = ptr;
848
- out->type = ref;
849
- out->max_len = -1;
850
- }
1024
+ void *ptr = ReserveTrampoline(type->ref.proto, func);
1025
+ if (!ptr) [[unlikely]]
1026
+ return false;
851
1027
 
852
- *out_ptr = ptr;
853
- return true;
854
- } else if (value.IsString()) {
855
- K_ASSERT(type->primitive == PrimitiveKind::Pointer);
1028
+ *out_ptr = (void *)ptr;
1029
+ return true;
1030
+ } break;
856
1031
 
857
- if (directions & 2) [[unlikely]]
858
- goto unexpected;
1032
+ case napi_number: {
1033
+ Napi::Number number = value.As<Napi::Number>();
1034
+ intptr_t ptr = (intptr_t)number.Int32Value();
859
1035
 
860
- if (ref == instance->void_type) {
861
- PushStringValue(value, (const char **)out_ptr);
862
- return true;
863
- } else if (ref->primitive == PrimitiveKind::Int8) {
864
- PushStringValue(value, (const char **)out_ptr);
865
- return true;
866
- } else if (ref->primitive == PrimitiveKind::Int16) {
867
- PushString16Value(value, (const char16_t **)out_ptr);
868
- return true;
869
- } else if (ref->primitive == PrimitiveKind::Int32) {
870
- PushString32Value(value, (const char32_t **)out_ptr);
1036
+ *out_ptr = (void *)ptr;
871
1037
  return true;
872
- } else {
873
- goto unexpected;
874
- }
875
- } else if (value.IsFunction()) {
876
- if (type->primitive != PrimitiveKind::Callback) [[unlikely]] {
877
- ThrowError<Napi::TypeError>(env, "Cannot pass function to type %1", type->name);
878
- return false;
879
- }
1038
+ } break;
880
1039
 
881
- Napi::Function func = value.As<Napi::Function>();
1040
+ case napi_bigint: {
1041
+ Napi::BigInt bigint = value.As<Napi::BigInt>();
882
1042
 
883
- void *ptr = ReserveTrampoline(type->ref.proto, func);
884
- if (!ptr) [[unlikely]]
885
- return false;
1043
+ bool lossless;
1044
+ intptr_t ptr = (intptr_t)bigint.Int64Value(&lossless);
886
1045
 
887
- *out_ptr = (void *)ptr;
888
- return true;
1046
+ *out_ptr = (void *)ptr;
1047
+ return true;
1048
+ } break;
1049
+
1050
+ default: {} break;
889
1051
  }
890
1052
 
891
1053
  unexpected:
@@ -895,18 +1057,7 @@ unexpected:
895
1057
 
896
1058
  bool CallData::PushCallback(Napi::Value value, const TypeInfo *type, void **out_ptr)
897
1059
  {
898
- if (CheckValueTag(value, &CastMarker)) {
899
- Napi::External<ValueCast> external = value.As<Napi::External<ValueCast>>();
900
- ValueCast *cast = external.Data();
901
-
902
- value = cast->ref.Value();
903
- type = cast->type;
904
- }
905
-
906
- if (void *ptr = nullptr; TryPointer(value, &ptr)) {
907
- *out_ptr = ptr;
908
- return true;
909
- } else if (value.IsFunction()) {
1060
+ if (value.IsFunction()) {
910
1061
  Napi::Function func = value.As<Napi::Function>();
911
1062
 
912
1063
  void *ptr = ReserveTrampoline(type->ref.proto, func);
@@ -914,9 +1065,27 @@ bool CallData::PushCallback(Napi::Value value, const TypeInfo *type, void **out_
914
1065
  return false;
915
1066
 
916
1067
  *out_ptr = ptr;
917
- return true;
1068
+ } else if (CheckValueTag(value, type->ref.marker)) {
1069
+ *out_ptr = value.As<Napi::External<void>>().Data();
1070
+ } else if (CheckValueTag(value, &CastMarker)) {
1071
+ Napi::External<ValueCast> external = value.As<Napi::External<ValueCast>>();
1072
+ ValueCast *cast = external.Data();
1073
+
1074
+ value = cast->ref.Value();
1075
+
1076
+ if (!value.IsExternal() || cast->type != type)
1077
+ goto unexpected;
1078
+
1079
+ *out_ptr = value.As<Napi::External<void>>().Data();
1080
+ } else if (IsNullOrUndefined(value)) {
1081
+ *out_ptr = nullptr;
1082
+ } else {
1083
+ goto unexpected;
918
1084
  }
919
1085
 
1086
+ return true;
1087
+
1088
+ unexpected:
920
1089
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected %2", GetValueType(instance, value), type->name);
921
1090
  return false;
922
1091
  }
@@ -972,7 +1141,7 @@ void *CallData::ReserveTrampoline(const FunctionInfo *proto, Napi::Function func
972
1141
  trampoline->proto = proto;
973
1142
  trampoline->func.Reset(func, 1);
974
1143
  trampoline->recv.Reset();
975
- trampoline->generation = (int32_t)mem->generation;
1144
+ trampoline->used = true;
976
1145
 
977
1146
  void *ptr = GetTrampoline(idx);
978
1147
 
@@ -1008,14 +1177,14 @@ bool CallData::CheckDynamicLength(Napi::Object obj, Size element, const char *co
1008
1177
  {
1009
1178
  Napi::Value by = obj.Get(countedby);
1010
1179
 
1011
- if (!TryNumber(by, &expected)) [[unlikely]] {
1180
+ if (!by.IsNumber() && !by.IsBigInt()) [[unlikely]] {
1012
1181
  ThrowError<Napi::Error>(env, "Unexpected %1 value for dynamic length, expected number", GetValueType(instance, by));
1013
1182
  return false;
1014
1183
  }
1015
1184
 
1016
1185
  // If we get anywhere near overflow there are other problems to worry about.
1017
1186
  // So let's not worry about that.
1018
- expected *= element;
1187
+ expected = GetNumber<int64_t>(by) * element;
1019
1188
  }
1020
1189
 
1021
1190
  // Get actual size
@@ -1067,11 +1236,9 @@ void CallData::PopOutArguments()
1067
1236
  } break;
1068
1237
 
1069
1238
  case OutArgument::Kind::Buffer: {
1070
- Span<uint8_t> buffer;
1071
-
1072
- bool success = TryBuffer(value, &buffer);
1073
- K_ASSERT(success);
1239
+ K_ASSERT(IsRawBuffer(value));
1074
1240
 
1241
+ Span<uint8_t> buffer = GetRawBuffer(value);
1075
1242
  DecodeBuffer(buffer, out.ptr, out.type);
1076
1243
  } break;
1077
1244
 
@@ -1125,9 +1292,27 @@ void CallData::PopOutArguments()
1125
1292
  }
1126
1293
  }
1127
1294
 
1128
- void *GetTrampoline(int16_t idx)
1295
+ void PerformAsyncRelay(napi_env, napi_value, void *, void *udata)
1296
+ {
1297
+ RelayContext *ctx = (RelayContext *)udata;
1298
+ CallData *call = ctx->call;
1299
+
1300
+ call->Relay(ctx->idx, ctx->sp);
1301
+
1302
+ // This CallData was created artificially just to perform the callback. Which means the
1303
+ // creator may not run on the main thread, and cannot properly destroy it, because some
1304
+ // members are managed by Node.
1305
+ call->Dispose();
1306
+
1307
+ // We're done!
1308
+ std::lock_guard<std::mutex> lock(ctx->mutex);
1309
+ ctx->done = true;
1310
+ ctx->cv.notify_one();
1311
+ }
1312
+
1313
+ void *GetTrampoline(int idx)
1129
1314
  {
1130
- return Trampolines[idx];
1315
+ return (void *)(TrampolineStart + TrampolineSize * idx);
1131
1316
  }
1132
1317
 
1133
1318
  }