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