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