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.
- package/CHANGELOG.md +59 -0
- package/build/koffi/darwin_arm64/koffi.node +0 -0
- package/build/koffi/darwin_x64/koffi.node +0 -0
- package/build/koffi/freebsd_arm64/koffi.node +0 -0
- package/build/koffi/freebsd_ia32/koffi.node +0 -0
- package/build/koffi/freebsd_x64/koffi.node +0 -0
- package/build/koffi/linux_arm64/koffi.node +0 -0
- package/build/koffi/linux_armhf/koffi.node +0 -0
- package/build/koffi/linux_ia32/koffi.node +0 -0
- package/build/koffi/linux_loong64/koffi.node +0 -0
- package/build/koffi/linux_riscv64d/koffi.node +0 -0
- package/build/koffi/linux_x64/koffi.node +0 -0
- package/build/koffi/musl_arm64/koffi.node +0 -0
- package/build/koffi/musl_x64/koffi.node +0 -0
- package/build/koffi/openbsd_ia32/koffi.node +0 -0
- package/build/koffi/openbsd_x64/koffi.node +0 -0
- package/build/koffi/win32_arm64/koffi.exp +0 -0
- package/build/koffi/win32_arm64/koffi.lib +0 -0
- package/build/koffi/win32_arm64/koffi.node +0 -0
- package/build/koffi/win32_ia32/koffi.exp +0 -0
- package/build/koffi/win32_ia32/koffi.lib +0 -0
- package/build/koffi/win32_ia32/koffi.node +0 -0
- package/build/koffi/win32_x64/koffi.exp +0 -0
- package/build/koffi/win32_x64/koffi.lib +0 -0
- package/build/koffi/win32_x64/koffi.node +0 -0
- package/index.d.ts +9 -11
- package/index.js +6 -9
- package/indirect.js +6 -9
- package/lib/native/base/base.cc +1 -6
- package/package.json +3 -3
- package/src/cnoke/assets/FindCNoke.cmake +27 -16
- package/src/cnoke/assets/toolchains.json +126 -0
- package/src/cnoke/cnoke.js +27 -33
- package/src/cnoke/src/builder.js +124 -63
- package/src/cnoke/src/tools.js +1 -5
- package/src/koffi/CMakeLists.txt +32 -21
- package/src/koffi/src/{abi/arm32.cc → abi_arm32.cc} +235 -238
- package/src/koffi/src/{abi/arm32_asm.S → abi_arm32_asm.S} +19 -15
- package/src/koffi/src/{abi/arm64.cc → abi_arm64.cc} +253 -274
- package/src/koffi/src/{abi/arm64_asm.S → abi_arm64_asm.S} +16 -10
- package/src/koffi/src/{abi/arm64_asm.asm → abi_arm64_asm.asm} +17 -10
- package/src/koffi/src/{abi/loong64_asm.S → abi_loong64_asm.S} +16 -10
- package/src/koffi/src/{abi/riscv64.cc → abi_riscv64.cc} +233 -236
- package/src/koffi/src/{abi/riscv64_asm.S → abi_riscv64_asm.S} +16 -10
- package/src/koffi/src/{abi/x64_sysv.cc → abi_x64_sysv.cc} +208 -212
- package/src/koffi/src/{abi/x64_sysv_asm.S → abi_x64_sysv_asm.S} +17 -10
- package/src/koffi/src/{abi/x64_win.cc → abi_x64_win.cc} +175 -206
- package/src/koffi/src/{abi/x64_win_asm.S → abi_x64_win_asm.S} +49 -27
- package/src/koffi/src/{abi/x64_win_asm.asm → abi_x64_win_asm.asm} +54 -27
- package/src/koffi/src/{abi/x86.cc → abi_x86.cc} +187 -226
- package/src/koffi/src/{abi/x86_asm.S → abi_x86_asm.S} +36 -21
- package/src/koffi/src/{abi/x86_asm.asm → abi_x86_asm.asm} +31 -16
- package/src/koffi/src/call.cc +473 -287
- package/src/koffi/src/call.hh +15 -18
- package/src/koffi/src/ffi.cc +167 -183
- package/src/koffi/src/ffi.hh +59 -13
- package/src/koffi/src/init.js +1 -0
- package/src/koffi/src/util.cc +113 -159
- package/src/koffi/src/util.hh +23 -74
- package/src/koffi/src/win32.cc +13 -0
- package/src/koffi/src/win32.hh +7 -0
- package/src/koffi/tools/write_trampolines.js +77 -0
- package/doc/README.md +0 -27
- package/doc/assets.ini +0 -24
- package/doc/build.sh +0 -9
- package/doc/develop.sh +0 -15
- package/doc/pages/404.md +0 -17
- package/doc/pages.ini +0 -86
- package/doc/static/highlight.js +0 -8
- package/doc/static/koffi.css +0 -11
- package/doc/static/koffi.png +0 -0
- package/doc/static/logo.webp +0 -0
- package/doc/static/perf_linux.png +0 -0
- package/doc/static/perf_windows.png +0 -0
- package/doc/static/print.css +0 -10
- package/doc/templates/code.html +0 -48
- package/doc/templates/page.html +0 -47
- package/src/koffi/cmake/raylib.cmake +0 -85
- package/src/koffi/cmake/sqlite3.cmake +0 -9
- package/src/koffi/examples/electron-builder/README.md +0 -11
- package/src/koffi/examples/electron-builder/package.json +0 -21
- package/src/koffi/examples/electron-builder/src/app.js +0 -20
- package/src/koffi/examples/electron-builder/src/index.html +0 -143
- package/src/koffi/examples/electron-builder/src/preload.js +0 -5
- package/src/koffi/examples/electron-forge/README.md +0 -25
- package/src/koffi/examples/electron-forge/forge.config.js +0 -63
- package/src/koffi/examples/electron-forge/package.json +0 -39
- package/src/koffi/examples/electron-forge/src/index.css +0 -7
- package/src/koffi/examples/electron-forge/src/index.html +0 -143
- package/src/koffi/examples/electron-forge/src/main.js +0 -52
- package/src/koffi/examples/electron-forge/src/preload.js +0 -5
- package/src/koffi/examples/electron-forge/src/renderer.js +0 -31
- package/src/koffi/examples/electron-forge/webpack.main.config.js +0 -11
- package/src/koffi/examples/electron-forge/webpack.renderer.config.js +0 -13
- package/src/koffi/examples/electron-forge/webpack.rules.js +0 -35
- package/src/koffi/examples/node-esbuild/README.md +0 -19
- package/src/koffi/examples/node-esbuild/index.js +0 -2
- package/src/koffi/examples/node-esbuild/package.json +0 -16
- package/src/koffi/examples/nwjs/README.md +0 -20
- package/src/koffi/examples/nwjs/package.json +0 -11
- package/src/koffi/examples/nwjs/src/index.html +0 -145
- package/src/koffi/examples/nwjs/src/package.json +0 -10
- package/src/koffi/examples/yao-pkg/README.md +0 -17
- package/src/koffi/examples/yao-pkg/index.js +0 -2
- package/src/koffi/examples/yao-pkg/package.json +0 -22
- package/src/koffi/src/primitives.inc +0 -39
- package/src/koffi/src/trampolines/armasm.inc +0 -32771
- package/src/koffi/src/trampolines/gnu.inc +0 -24577
- package/src/koffi/src/trampolines/masm32.inc +0 -32769
- package/src/koffi/src/trampolines/masm64.inc +0 -32769
- package/src/koffi/src/trampolines/prototypes.inc +0 -16388
- package/vendor/node-addon-api/CHANGELOG.md +0 -1272
- package/vendor/node-addon-api/CODE_OF_CONDUCT.md +0 -4
- package/vendor/node-addon-api/CONTRIBUTING.md +0 -203
- package/vendor/node-addon-api/appveyor.yml +0 -37
- package/vendor/node-addon-api/benchmark/README.md +0 -47
- package/vendor/node-addon-api/benchmark/binding.gyp +0 -25
- package/vendor/node-addon-api/benchmark/function_args.cc +0 -250
- package/vendor/node-addon-api/benchmark/function_args.js +0 -60
- package/vendor/node-addon-api/benchmark/index.js +0 -34
- package/vendor/node-addon-api/benchmark/property_descriptor.cc +0 -84
- package/vendor/node-addon-api/benchmark/property_descriptor.js +0 -38
- package/vendor/node-addon-api/common.gypi +0 -21
- package/vendor/node-addon-api/doc/README.md +0 -145
- package/vendor/node-addon-api/doc/addon.md +0 -163
- package/vendor/node-addon-api/doc/array.md +0 -81
- package/vendor/node-addon-api/doc/array_buffer.md +0 -165
- package/vendor/node-addon-api/doc/async_context.md +0 -86
- package/vendor/node-addon-api/doc/async_operations.md +0 -31
- package/vendor/node-addon-api/doc/async_worker.md +0 -428
- package/vendor/node-addon-api/doc/async_worker_variants.md +0 -578
- package/vendor/node-addon-api/doc/basic_env.md +0 -200
- package/vendor/node-addon-api/doc/bigint.md +0 -97
- package/vendor/node-addon-api/doc/boolean.md +0 -68
- package/vendor/node-addon-api/doc/buffer.md +0 -245
- package/vendor/node-addon-api/doc/callback_scope.md +0 -54
- package/vendor/node-addon-api/doc/callbackinfo.md +0 -97
- package/vendor/node-addon-api/doc/checker-tool.md +0 -32
- package/vendor/node-addon-api/doc/class_property_descriptor.md +0 -123
- package/vendor/node-addon-api/doc/cmake-js.md +0 -87
- package/vendor/node-addon-api/doc/contributing/creating_a_release.md +0 -95
- package/vendor/node-addon-api/doc/conversion-tool.md +0 -28
- package/vendor/node-addon-api/doc/dataview.md +0 -248
- package/vendor/node-addon-api/doc/date.md +0 -68
- package/vendor/node-addon-api/doc/env.md +0 -87
- package/vendor/node-addon-api/doc/error.md +0 -120
- package/vendor/node-addon-api/doc/error_handling.md +0 -266
- package/vendor/node-addon-api/doc/escapable_handle_scope.md +0 -80
- package/vendor/node-addon-api/doc/external.md +0 -79
- package/vendor/node-addon-api/doc/external_buffer.md +0 -18
- package/vendor/node-addon-api/doc/finalization.md +0 -153
- package/vendor/node-addon-api/doc/function.md +0 -402
- package/vendor/node-addon-api/doc/function_reference.md +0 -238
- package/vendor/node-addon-api/doc/generator.md +0 -13
- package/vendor/node-addon-api/doc/handle_scope.md +0 -77
- package/vendor/node-addon-api/doc/hierarchy.md +0 -95
- package/vendor/node-addon-api/doc/instance_wrap.md +0 -408
- package/vendor/node-addon-api/doc/maybe.md +0 -76
- package/vendor/node-addon-api/doc/memory_management.md +0 -27
- package/vendor/node-addon-api/doc/name.md +0 -29
- package/vendor/node-addon-api/doc/node-gyp.md +0 -82
- package/vendor/node-addon-api/doc/number.md +0 -163
- package/vendor/node-addon-api/doc/object.md +0 -411
- package/vendor/node-addon-api/doc/object_lifetime_management.md +0 -83
- package/vendor/node-addon-api/doc/object_reference.md +0 -117
- package/vendor/node-addon-api/doc/object_wrap.md +0 -604
- package/vendor/node-addon-api/doc/prebuild_tools.md +0 -16
- package/vendor/node-addon-api/doc/promises.md +0 -130
- package/vendor/node-addon-api/doc/property_descriptor.md +0 -286
- package/vendor/node-addon-api/doc/propertylvalue.md +0 -50
- package/vendor/node-addon-api/doc/range_error.md +0 -59
- package/vendor/node-addon-api/doc/reference.md +0 -113
- package/vendor/node-addon-api/doc/setup.md +0 -115
- package/vendor/node-addon-api/doc/string.md +0 -93
- package/vendor/node-addon-api/doc/symbol.md +0 -61
- package/vendor/node-addon-api/doc/syntax_error.md +0 -66
- package/vendor/node-addon-api/doc/threadsafe.md +0 -121
- package/vendor/node-addon-api/doc/threadsafe_function.md +0 -290
- package/vendor/node-addon-api/doc/type_error.md +0 -59
- package/vendor/node-addon-api/doc/type_taggable.md +0 -40
- package/vendor/node-addon-api/doc/typed_array.md +0 -78
- package/vendor/node-addon-api/doc/typed_array_of.md +0 -137
- package/vendor/node-addon-api/doc/typed_threadsafe_function.md +0 -306
- package/vendor/node-addon-api/doc/value.md +0 -368
- package/vendor/node-addon-api/doc/version_management.md +0 -43
- package/vendor/node-addon-api/eslint.config.js +0 -5
- package/vendor/node-addon-api/except.gypi +0 -25
- package/vendor/node-addon-api/index.js +0 -14
- package/vendor/node-addon-api/node_addon_api.gyp +0 -42
- package/vendor/node-addon-api/node_api.gyp +0 -9
- package/vendor/node-addon-api/noexcept.gypi +0 -26
- package/vendor/node-addon-api/nothing.c +0 -0
- package/vendor/node-addon-api/package-support.json +0 -21
- package/vendor/node-addon-api/package.json +0 -480
- package/vendor/node-addon-api/release-please-config.json +0 -15
- package/vendor/node-addon-api/test/README.md +0 -91
- package/vendor/node-addon-api/test/addon.cc +0 -44
- package/vendor/node-addon-api/test/addon.js +0 -7
- package/vendor/node-addon-api/test/addon_build/index.js +0 -49
- package/vendor/node-addon-api/test/addon_build/tpl/addon.cc +0 -18
- package/vendor/node-addon-api/test/addon_build/tpl/binding.gyp +0 -63
- package/vendor/node-addon-api/test/addon_build/tpl/index.js +0 -9
- package/vendor/node-addon-api/test/addon_build/tpl/package.json +0 -11
- package/vendor/node-addon-api/test/addon_data.cc +0 -98
- package/vendor/node-addon-api/test/addon_data.js +0 -24
- package/vendor/node-addon-api/test/array_buffer.cc +0 -243
- package/vendor/node-addon-api/test/array_buffer.js +0 -70
- package/vendor/node-addon-api/test/async_context.cc +0 -36
- package/vendor/node-addon-api/test/async_context.js +0 -122
- package/vendor/node-addon-api/test/async_progress_queue_worker.cc +0 -248
- package/vendor/node-addon-api/test/async_progress_queue_worker.js +0 -180
- package/vendor/node-addon-api/test/async_progress_worker.cc +0 -357
- package/vendor/node-addon-api/test/async_progress_worker.js +0 -200
- package/vendor/node-addon-api/test/async_worker.cc +0 -341
- package/vendor/node-addon-api/test/async_worker.js +0 -264
- package/vendor/node-addon-api/test/async_worker_nocallback.js +0 -19
- package/vendor/node-addon-api/test/async_worker_persistent.cc +0 -63
- package/vendor/node-addon-api/test/async_worker_persistent.js +0 -24
- package/vendor/node-addon-api/test/basic_types/array.cc +0 -40
- package/vendor/node-addon-api/test/basic_types/array.js +0 -34
- package/vendor/node-addon-api/test/basic_types/boolean.cc +0 -40
- package/vendor/node-addon-api/test/basic_types/boolean.js +0 -34
- package/vendor/node-addon-api/test/basic_types/number.cc +0 -105
- package/vendor/node-addon-api/test/basic_types/number.js +0 -115
- package/vendor/node-addon-api/test/basic_types/value.cc +0 -177
- package/vendor/node-addon-api/test/basic_types/value.js +0 -173
- package/vendor/node-addon-api/test/bigint.cc +0 -91
- package/vendor/node-addon-api/test/bigint.js +0 -53
- package/vendor/node-addon-api/test/binding-swallowexcept.cc +0 -12
- package/vendor/node-addon-api/test/binding.cc +0 -200
- package/vendor/node-addon-api/test/binding.gyp +0 -160
- package/vendor/node-addon-api/test/buffer.cc +0 -185
- package/vendor/node-addon-api/test/buffer.h +0 -26
- package/vendor/node-addon-api/test/buffer.js +0 -150
- package/vendor/node-addon-api/test/buffer_new_or_copy-inl.h +0 -68
- package/vendor/node-addon-api/test/buffer_no_external.cc +0 -24
- package/vendor/node-addon-api/test/callbackInfo.cc +0 -27
- package/vendor/node-addon-api/test/callbackInfo.js +0 -9
- package/vendor/node-addon-api/test/callbackscope.cc +0 -39
- package/vendor/node-addon-api/test/callbackscope.js +0 -49
- package/vendor/node-addon-api/test/child_processes/addon.js +0 -11
- package/vendor/node-addon-api/test/child_processes/addon_data.js +0 -24
- package/vendor/node-addon-api/test/child_processes/objectwrap_function.js +0 -22
- package/vendor/node-addon-api/test/child_processes/threadsafe_function_exception.js +0 -33
- package/vendor/node-addon-api/test/child_processes/typed_threadsafe_function_exception.js +0 -19
- package/vendor/node-addon-api/test/common/index.js +0 -246
- package/vendor/node-addon-api/test/common/test_helper.h +0 -71
- package/vendor/node-addon-api/test/dataview/dataview.cc +0 -48
- package/vendor/node-addon-api/test/dataview/dataview.js +0 -35
- package/vendor/node-addon-api/test/dataview/dataview_read_write.cc +0 -115
- package/vendor/node-addon-api/test/dataview/dataview_read_write.js +0 -92
- package/vendor/node-addon-api/test/date.cc +0 -45
- package/vendor/node-addon-api/test/date.js +0 -18
- package/vendor/node-addon-api/test/env_cleanup.cc +0 -100
- package/vendor/node-addon-api/test/env_cleanup.js +0 -55
- package/vendor/node-addon-api/test/env_misc.cc +0 -25
- package/vendor/node-addon-api/test/env_misc.js +0 -12
- package/vendor/node-addon-api/test/error.cc +0 -436
- package/vendor/node-addon-api/test/error.js +0 -111
- package/vendor/node-addon-api/test/error_handling_for_primitives.cc +0 -13
- package/vendor/node-addon-api/test/error_handling_for_primitives.js +0 -29
- package/vendor/node-addon-api/test/error_terminating_environment.js +0 -99
- package/vendor/node-addon-api/test/except_all.cc +0 -22
- package/vendor/node-addon-api/test/except_all.js +0 -14
- package/vendor/node-addon-api/test/exports.js +0 -19
- package/vendor/node-addon-api/test/external.cc +0 -85
- package/vendor/node-addon-api/test/external.js +0 -85
- package/vendor/node-addon-api/test/finalizer_order.cc +0 -152
- package/vendor/node-addon-api/test/finalizer_order.js +0 -98
- package/vendor/node-addon-api/test/function.cc +0 -338
- package/vendor/node-addon-api/test/function.js +0 -137
- package/vendor/node-addon-api/test/function_reference.cc +0 -204
- package/vendor/node-addon-api/test/function_reference.js +0 -157
- package/vendor/node-addon-api/test/globalObject/global_object.cc +0 -61
- package/vendor/node-addon-api/test/globalObject/global_object_delete_property.cc +0 -31
- package/vendor/node-addon-api/test/globalObject/global_object_delete_property.js +0 -58
- package/vendor/node-addon-api/test/globalObject/global_object_get_property.cc +0 -40
- package/vendor/node-addon-api/test/globalObject/global_object_get_property.js +0 -56
- package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.cc +0 -28
- package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.js +0 -46
- package/vendor/node-addon-api/test/globalObject/global_object_set_property.cc +0 -31
- package/vendor/node-addon-api/test/globalObject/global_object_set_property.js +0 -56
- package/vendor/node-addon-api/test/handlescope.cc +0 -86
- package/vendor/node-addon-api/test/handlescope.js +0 -16
- package/vendor/node-addon-api/test/index.js +0 -160
- package/vendor/node-addon-api/test/maybe/check.cc +0 -69
- package/vendor/node-addon-api/test/maybe/index.js +0 -50
- package/vendor/node-addon-api/test/memory_management.cc +0 -18
- package/vendor/node-addon-api/test/memory_management.js +0 -9
- package/vendor/node-addon-api/test/movable_callbacks.cc +0 -23
- package/vendor/node-addon-api/test/movable_callbacks.js +0 -21
- package/vendor/node-addon-api/test/name.cc +0 -110
- package/vendor/node-addon-api/test/name.js +0 -59
- package/vendor/node-addon-api/test/napi_child.js +0 -14
- package/vendor/node-addon-api/test/object/delete_property.cc +0 -38
- package/vendor/node-addon-api/test/object/delete_property.js +0 -41
- package/vendor/node-addon-api/test/object/finalizer.cc +0 -30
- package/vendor/node-addon-api/test/object/finalizer.js +0 -28
- package/vendor/node-addon-api/test/object/get_property.cc +0 -34
- package/vendor/node-addon-api/test/object/get_property.js +0 -40
- package/vendor/node-addon-api/test/object/has_own_property.cc +0 -34
- package/vendor/node-addon-api/test/object/has_own_property.js +0 -34
- package/vendor/node-addon-api/test/object/has_property.cc +0 -38
- package/vendor/node-addon-api/test/object/has_property.js +0 -37
- package/vendor/node-addon-api/test/object/object.cc +0 -430
- package/vendor/node-addon-api/test/object/object.js +0 -218
- package/vendor/node-addon-api/test/object/object_deprecated.cc +0 -70
- package/vendor/node-addon-api/test/object/object_deprecated.js +0 -42
- package/vendor/node-addon-api/test/object/object_freeze_seal.cc +0 -25
- package/vendor/node-addon-api/test/object/object_freeze_seal.js +0 -61
- package/vendor/node-addon-api/test/object/set_property.cc +0 -45
- package/vendor/node-addon-api/test/object/set_property.js +0 -30
- package/vendor/node-addon-api/test/object/subscript_operator.cc +0 -58
- package/vendor/node-addon-api/test/object/subscript_operator.js +0 -17
- package/vendor/node-addon-api/test/object_reference.cc +0 -417
- package/vendor/node-addon-api/test/object_reference.js +0 -262
- package/vendor/node-addon-api/test/objectwrap.cc +0 -295
- package/vendor/node-addon-api/test/objectwrap.js +0 -309
- package/vendor/node-addon-api/test/objectwrap_constructor_exception.cc +0 -26
- package/vendor/node-addon-api/test/objectwrap_constructor_exception.js +0 -18
- package/vendor/node-addon-api/test/objectwrap_function.cc +0 -43
- package/vendor/node-addon-api/test/objectwrap_function.js +0 -6
- package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.cc +0 -30
- package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.js +0 -13
- package/vendor/node-addon-api/test/objectwrap_removewrap.cc +0 -45
- package/vendor/node-addon-api/test/objectwrap_removewrap.js +0 -32
- package/vendor/node-addon-api/test/objectwrap_worker_thread.js +0 -20
- package/vendor/node-addon-api/test/promise.cc +0 -111
- package/vendor/node-addon-api/test/promise.js +0 -43
- package/vendor/node-addon-api/test/reference.cc +0 -78
- package/vendor/node-addon-api/test/reference.js +0 -20
- package/vendor/node-addon-api/test/require_basic_finalizers/index.js +0 -38
- package/vendor/node-addon-api/test/require_basic_finalizers/tpl/addon.cc +0 -12
- package/vendor/node-addon-api/test/require_basic_finalizers/tpl/binding.gyp +0 -48
- package/vendor/node-addon-api/test/require_basic_finalizers/tpl/index.js +0 -3
- package/vendor/node-addon-api/test/require_basic_finalizers/tpl/package.json +0 -11
- package/vendor/node-addon-api/test/run_script.cc +0 -56
- package/vendor/node-addon-api/test/run_script.js +0 -45
- package/vendor/node-addon-api/test/symbol.cc +0 -79
- package/vendor/node-addon-api/test/symbol.js +0 -66
- package/vendor/node-addon-api/test/testUtil.js +0 -54
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.cc +0 -230
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.js +0 -225
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.cc +0 -155
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.js +0 -13
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_exception.cc +0 -50
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_exception.js +0 -20
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.cc +0 -125
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.js +0 -14
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.cc +0 -27
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.js +0 -7
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.cc +0 -240
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.js +0 -59
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.cc +0 -55
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.js +0 -98
- package/vendor/node-addon-api/test/thunking_manual.cc +0 -127
- package/vendor/node-addon-api/test/thunking_manual.js +0 -16
- package/vendor/node-addon-api/test/type_taggable.cc +0 -66
- package/vendor/node-addon-api/test/type_taggable.js +0 -59
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.cc +0 -215
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.js +0 -188
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.cc +0 -120
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.js +0 -14
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_exception.cc +0 -39
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_exception.js +0 -13
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.cc +0 -127
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.js +0 -14
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.cc +0 -32
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.js +0 -8
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.cc +0 -237
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.js +0 -59
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.cc +0 -67
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.js +0 -98
- package/vendor/node-addon-api/test/typedarray-bigint.js +0 -58
- package/vendor/node-addon-api/test/typedarray.cc +0 -413
- package/vendor/node-addon-api/test/typedarray.js +0 -103
- package/vendor/node-addon-api/test/value_type_cast.cc +0 -60
- package/vendor/node-addon-api/test/value_type_cast.js +0 -106
- package/vendor/node-addon-api/test/version_management.cc +0 -28
- package/vendor/node-addon-api/test/version_management.js +0 -29
- package/vendor/node-addon-api/tools/README.md +0 -73
- package/vendor/node-addon-api/tools/check-napi.js +0 -99
- package/vendor/node-addon-api/tools/clang-format.js +0 -71
- package/vendor/node-addon-api/tools/conversion.js +0 -301
- package/vendor/node-addon-api/unit-test/README.md +0 -28
- package/vendor/node-addon-api/unit-test/binding-file-template.js +0 -39
- package/vendor/node-addon-api/unit-test/binding.gyp +0 -72
- package/vendor/node-addon-api/unit-test/exceptions.js +0 -32
- package/vendor/node-addon-api/unit-test/generate-binding-cc.js +0 -61
- package/vendor/node-addon-api/unit-test/injectTestParams.js +0 -101
- package/vendor/node-addon-api/unit-test/listOfTestModules.js +0 -88
- package/vendor/node-addon-api/unit-test/matchModules.js +0 -65
- package/vendor/node-addon-api/unit-test/setup.js +0 -13
- package/vendor/node-addon-api/unit-test/spawnTask.js +0 -26
- package/vendor/node-addon-api/unit-test/test.js +0 -30
- package/vendor/node-api-headers/CHANGELOG.md +0 -130
- package/vendor/node-api-headers/CODE_OF_CONDUCT.md +0 -4
- package/vendor/node-api-headers/CONTRIBUTING.md +0 -32
- package/vendor/node-api-headers/CREATING_A_RELEASE.md +0 -68
- package/vendor/node-api-headers/index.js +0 -17
- package/vendor/node-api-headers/lib/clang-utils.js +0 -50
- package/vendor/node-api-headers/lib/parse-utils.js +0 -92
- package/vendor/node-api-headers/package.json +0 -59
- package/vendor/node-api-headers/release-please-config.json +0 -12
- package/vendor/node-api-headers/scripts/update-headers.js +0 -246
- package/vendor/node-api-headers/scripts/write-symbols.js +0 -154
- package/vendor/node-api-headers/scripts/write-win32-def.js +0 -52
- package/vendor/node-api-headers/symbols.js +0 -257
- package/vendor/node-api-headers/test/parse-utils.js +0 -21
- /package/doc/{pages/benchmarks.md → benchmarks.md} +0 -0
- /package/doc/{pages/callbacks.md → callbacks.md} +0 -0
- /package/doc/{pages/contribute.md → contribute.md} +0 -0
- /package/doc/{pages/functions.md → functions.md} +0 -0
- /package/doc/{pages/index.md → index.md} +0 -0
- /package/doc/{pages/input.md → input.md} +0 -0
- /package/doc/{pages/migration.md → migration.md} +0 -0
- /package/doc/{pages/misc.md → misc.md} +0 -0
- /package/doc/{pages/output.md → output.md} +0 -0
- /package/doc/{pages/packaging.md → packaging.md} +0 -0
- /package/doc/{pages/platforms.md → platforms.md} +0 -0
- /package/doc/{pages/pointers.md → pointers.md} +0 -0
- /package/doc/{pages/start.md → start.md} +0 -0
- /package/doc/{pages/unions.md → unions.md} +0 -0
- /package/doc/{pages/variables.md → variables.md} +0 -0
- /package/src/koffi/src/{abi/loong64.cc → abi_loong64.cc} +0 -0
package/src/koffi/src/call.cc
CHANGED
|
@@ -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 *
|
|
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
|
-
|
|
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::
|
|
80
|
+
void CallData::RelayAsync(Size idx, uint8_t *sp)
|
|
78
81
|
{
|
|
79
|
-
|
|
80
|
-
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
ctx.out_reg = out_reg;
|
|
85
|
+
RelayContext ctx = {
|
|
86
|
+
.call = this,
|
|
87
|
+
.idx = idx,
|
|
88
|
+
.sp = sp
|
|
89
|
+
};
|
|
91
90
|
|
|
92
|
-
|
|
91
|
+
napi_call_threadsafe_function(instance->broker, &ctx, napi_tsfn_blocking);
|
|
93
92
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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>(&
|
|
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>(&
|
|
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>(&
|
|
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
|
-
|
|
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: {
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
case PrimitiveKind::
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
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 (
|
|
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: {
|
|
467
|
-
|
|
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(
|
|
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
|
-
|
|
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: {
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
case PrimitiveKind::
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
case PrimitiveKind::
|
|
570
|
-
|
|
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 (
|
|
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: {
|
|
651
|
-
|
|
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
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
880
|
+
switch (value.Type()) {
|
|
881
|
+
case napi_undefined:
|
|
882
|
+
case napi_null: {
|
|
883
|
+
*out_ptr = nullptr;
|
|
884
|
+
return true;
|
|
885
|
+
} break;
|
|
759
886
|
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
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
|
-
|
|
767
|
-
|
|
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
|
-
|
|
770
|
-
|
|
898
|
+
*out_ptr = value.As<Napi::External<uint8_t>>().Data();
|
|
899
|
+
return true;
|
|
900
|
+
} break;
|
|
771
901
|
|
|
772
|
-
|
|
773
|
-
|
|
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
|
-
|
|
779
|
-
|
|
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
|
-
|
|
792
|
-
|
|
908
|
+
if (value.IsArray()) {
|
|
909
|
+
Napi::Array array = value.As<Napi::Array>();
|
|
910
|
+
Size len = PushIndirectString(array, ref, &ptr);
|
|
793
911
|
|
|
794
|
-
|
|
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
|
-
|
|
797
|
-
|
|
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
|
-
|
|
975
|
+
goto unexpected;
|
|
801
976
|
}
|
|
802
977
|
|
|
803
|
-
|
|
804
|
-
|
|
978
|
+
if (directions & 2) {
|
|
979
|
+
OutArgument *out = out_arguments.AppendDefault();
|
|
805
980
|
|
|
806
|
-
|
|
807
|
-
|
|
981
|
+
napi_status status = napi_create_reference(env, value, 1, &out->ref);
|
|
982
|
+
K_ASSERT(status == napi_ok);
|
|
808
983
|
|
|
809
|
-
|
|
810
|
-
|
|
984
|
+
out->kind = out_kind;
|
|
985
|
+
out->ptr = ptr;
|
|
986
|
+
out->type = ref;
|
|
987
|
+
out->max_len = out_max_len;
|
|
988
|
+
}
|
|
811
989
|
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
out->max_len = out_max_len;
|
|
816
|
-
}
|
|
990
|
+
*out_ptr = ptr;
|
|
991
|
+
return true;
|
|
992
|
+
} break;
|
|
817
993
|
|
|
818
|
-
|
|
819
|
-
|
|
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
|
-
|
|
997
|
+
if (directions & 2) [[unlikely]]
|
|
998
|
+
goto unexpected;
|
|
826
999
|
|
|
827
|
-
|
|
828
|
-
(
|
|
829
|
-
|
|
830
|
-
|
|
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
|
-
|
|
834
|
-
if (
|
|
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
|
-
|
|
837
|
-
MemSet(ptr, 0, ref->size);
|
|
838
|
-
}
|
|
839
|
-
|
|
840
|
-
if (directions & 2) {
|
|
841
|
-
OutArgument *out = out_arguments.AppendDefault();
|
|
1021
|
+
}
|
|
842
1022
|
|
|
843
|
-
|
|
844
|
-
K_ASSERT(status == napi_ok);
|
|
1023
|
+
Napi::Function func = value.As<Napi::Function>();
|
|
845
1024
|
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
out->max_len = -1;
|
|
850
|
-
}
|
|
1025
|
+
void *ptr = ReserveTrampoline(type->ref.proto, func);
|
|
1026
|
+
if (!ptr) [[unlikely]]
|
|
1027
|
+
return false;
|
|
851
1028
|
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
K_ASSERT(type->primitive == PrimitiveKind::Pointer);
|
|
1029
|
+
*out_ptr = (void *)ptr;
|
|
1030
|
+
return true;
|
|
1031
|
+
} break;
|
|
856
1032
|
|
|
857
|
-
|
|
858
|
-
|
|
1033
|
+
case napi_number: {
|
|
1034
|
+
Napi::Number number = value.As<Napi::Number>();
|
|
1035
|
+
intptr_t ptr = (intptr_t)number.Int32Value();
|
|
859
1036
|
|
|
860
|
-
|
|
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
|
-
}
|
|
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
|
-
|
|
1041
|
+
case napi_bigint: {
|
|
1042
|
+
Napi::BigInt bigint = value.As<Napi::BigInt>();
|
|
882
1043
|
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
return false;
|
|
1044
|
+
bool lossless;
|
|
1045
|
+
intptr_t ptr = (intptr_t)bigint.Int64Value(&lossless);
|
|
886
1046
|
|
|
887
|
-
|
|
888
|
-
|
|
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 (
|
|
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
|
-
|
|
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 (!
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
1316
|
+
return (void *)(TrampolineStart + TrampolineSize * idx);
|
|
1131
1317
|
}
|
|
1132
1318
|
|
|
1133
1319
|
}
|