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.hh
CHANGED
|
@@ -17,7 +17,7 @@ struct BackRegisters;
|
|
|
17
17
|
|
|
18
18
|
// I'm not sure why the alignas(8), because alignof(CallData) is 8 without it.
|
|
19
19
|
// But on Windows i386, without it, the alignment may not be correct (compiler bug?).
|
|
20
|
-
|
|
20
|
+
struct alignas(8) CallData {
|
|
21
21
|
struct OutArgument {
|
|
22
22
|
enum class Kind {
|
|
23
23
|
Array,
|
|
@@ -66,7 +66,7 @@ class alignas(8) CallData {
|
|
|
66
66
|
LocalArray<int16_t, 16> used_trampolines;
|
|
67
67
|
HeapArray<OutArgument> out_arguments;
|
|
68
68
|
|
|
69
|
-
BlockAllocator
|
|
69
|
+
BlockAllocator alloc;
|
|
70
70
|
|
|
71
71
|
public:
|
|
72
72
|
CallData(Napi::Env env, InstanceData *instance, InstanceMemory *mem);
|
|
@@ -77,10 +77,8 @@ public:
|
|
|
77
77
|
#if defined(UNITY_BUILD)
|
|
78
78
|
#if defined(_MSC_VER)
|
|
79
79
|
#define INLINE_IF_UNITY __forceinline
|
|
80
|
-
#elif defined(__clang__)
|
|
81
|
-
#define INLINE_IF_UNITY __attribute__((always_inline)) inline
|
|
82
80
|
#else
|
|
83
|
-
#define INLINE_IF_UNITY
|
|
81
|
+
#define INLINE_IF_UNITY __attribute__((always_inline)) inline
|
|
84
82
|
#endif
|
|
85
83
|
#else
|
|
86
84
|
#define INLINE_IF_UNITY
|
|
@@ -92,9 +90,8 @@ public:
|
|
|
92
90
|
|
|
93
91
|
#undef INLINE_IF_UNITY
|
|
94
92
|
|
|
95
|
-
void Relay(Size idx, uint8_t *
|
|
96
|
-
void
|
|
97
|
-
static void RelayAsync(napi_env, napi_value, void *, void *udata);
|
|
93
|
+
void Relay(Size idx, uint8_t *sp);
|
|
94
|
+
void RelayAsync(Size idx, uint8_t *sp);
|
|
98
95
|
|
|
99
96
|
void DumpForward(const FunctionInfo *func) const;
|
|
100
97
|
|
|
@@ -114,11 +111,8 @@ public:
|
|
|
114
111
|
|
|
115
112
|
void *ReserveTrampoline(const FunctionInfo *proto, Napi::Function func);
|
|
116
113
|
|
|
117
|
-
BlockAllocator *GetAllocator() { return &call_alloc; }
|
|
118
|
-
|
|
119
|
-
private:
|
|
120
114
|
template <typename T>
|
|
121
|
-
|
|
115
|
+
bool AllocStack(Size size, Size align, T **out_ptr);
|
|
122
116
|
template <typename T = uint8_t>
|
|
123
117
|
T *AllocHeap(Size size, Size align);
|
|
124
118
|
|
|
@@ -128,15 +122,15 @@ private:
|
|
|
128
122
|
};
|
|
129
123
|
|
|
130
124
|
template <typename T>
|
|
131
|
-
inline
|
|
125
|
+
inline bool CallData::AllocStack(Size size, Size align, T **out_ptr)
|
|
132
126
|
{
|
|
133
|
-
uint8_t *ptr = AlignDown(mem->stack.end()
|
|
127
|
+
uint8_t *ptr = AlignDown(mem->stack.end() - size, align);
|
|
134
128
|
Size delta = mem->stack.end() - ptr;
|
|
135
129
|
|
|
136
130
|
// Keep 512 bytes for redzone (required in some ABIs)
|
|
137
131
|
if (mem->stack.len - 512 < delta) [[unlikely]] {
|
|
138
132
|
ThrowError<Napi::Error>(env, "FFI call is taking up too much memory");
|
|
139
|
-
return
|
|
133
|
+
return false;
|
|
140
134
|
}
|
|
141
135
|
|
|
142
136
|
#if defined(K_DEBUG)
|
|
@@ -145,7 +139,8 @@ inline T *CallData::AllocStack(Size size)
|
|
|
145
139
|
|
|
146
140
|
mem->stack.len -= delta;
|
|
147
141
|
|
|
148
|
-
|
|
142
|
+
*out_ptr = (T *)ptr;
|
|
143
|
+
return true;
|
|
149
144
|
}
|
|
150
145
|
|
|
151
146
|
template <typename T>
|
|
@@ -170,13 +165,15 @@ inline T *CallData::AllocHeap(Size size, Size align)
|
|
|
170
165
|
int flags = 0;
|
|
171
166
|
#endif
|
|
172
167
|
|
|
173
|
-
ptr = (uint8_t *)AllocateRaw(&
|
|
168
|
+
ptr = (uint8_t *)AllocateRaw(&alloc, size + align, flags);
|
|
174
169
|
ptr = AlignUp(ptr, align);
|
|
175
170
|
|
|
176
171
|
return ptr;
|
|
177
172
|
}
|
|
178
173
|
}
|
|
179
174
|
|
|
180
|
-
void
|
|
175
|
+
void PerformAsyncRelay(napi_env env, napi_value callback, void *ctx, void *udata);
|
|
176
|
+
|
|
177
|
+
void *GetTrampoline(int idx);
|
|
181
178
|
|
|
182
179
|
}
|
package/src/koffi/src/ffi.cc
CHANGED
|
@@ -39,6 +39,8 @@ SharedData shared;
|
|
|
39
39
|
|
|
40
40
|
static thread_local CallData *exec_call;
|
|
41
41
|
|
|
42
|
+
extern "C" napi_value SwitchAndRelay(CallData *call, Size idx, uint8_t *sp, uint8_t *saved_sp, Span<uint8_t> *new_stack);
|
|
43
|
+
|
|
42
44
|
static bool ChangeSize(const char *name, Napi::Value value, Size min_size, Size max_size, Size *out_size)
|
|
43
45
|
{
|
|
44
46
|
Napi::Env env = value.Env();
|
|
@@ -138,20 +140,6 @@ static Napi::Value GetSetConfig(const Napi::CallbackInfo &info)
|
|
|
138
140
|
} else if (key == "max_type_size") {
|
|
139
141
|
if (!ChangeSize(key.c_str(), value, 32, Mebibytes(512), &new_config.max_type_size))
|
|
140
142
|
return env.Null();
|
|
141
|
-
} else if (key == "fast_pointers") {
|
|
142
|
-
if (!value.IsBoolean()) {
|
|
143
|
-
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for '%2', expected boolean", GetValueType(instance, value), key.c_str());
|
|
144
|
-
return env.Null();
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
new_config.fast_pointers = value.As<Napi::Boolean>();
|
|
148
|
-
} else if (key == "fast_callbacks") {
|
|
149
|
-
if (!value.IsBoolean()) {
|
|
150
|
-
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for '%2', expected boolean", GetValueType(instance, value), key.c_str());
|
|
151
|
-
return env.Null();
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
new_config.fast_callbacks = value.As<Napi::Boolean>();
|
|
155
143
|
} else {
|
|
156
144
|
ThrowError<Napi::Error>(env, "Unexpected config member '%1'", key.c_str());
|
|
157
145
|
return env.Null();
|
|
@@ -176,8 +164,6 @@ static Napi::Value GetSetConfig(const Napi::CallbackInfo &info)
|
|
|
176
164
|
obj.Set("resident_async_pools", instance->config.resident_async_pools);
|
|
177
165
|
obj.Set("max_async_calls", instance->config.resident_async_pools + instance->config.max_temporaries);
|
|
178
166
|
obj.Set("max_type_size", instance->config.max_type_size);
|
|
179
|
-
obj.Set("fast_pointers", instance->config.fast_pointers);
|
|
180
|
-
obj.Set("fast_callbacks", instance->config.fast_callbacks);
|
|
181
167
|
|
|
182
168
|
return obj;
|
|
183
169
|
}
|
|
@@ -806,10 +792,13 @@ static Napi::Value CreateDisposableType(const Napi::CallbackInfo &info)
|
|
|
806
792
|
InstanceData *instance = env.GetInstanceData<InstanceData>();
|
|
807
793
|
const Napi::FunctionReference &ref = type->dispose_ref;
|
|
808
794
|
|
|
809
|
-
Napi::
|
|
795
|
+
Napi::External<void> external = Napi::External<void>::New(env, (void *)ptr);
|
|
796
|
+
SetValueTag(external, type->ref.marker);
|
|
810
797
|
|
|
811
|
-
|
|
812
|
-
napi_value args[] = {
|
|
798
|
+
Napi::Value self = env.Null();
|
|
799
|
+
napi_value args[] = {
|
|
800
|
+
external
|
|
801
|
+
};
|
|
813
802
|
|
|
814
803
|
ref.Call(self, K_LEN(args), args);
|
|
815
804
|
instance->stats.disposed++;
|
|
@@ -837,15 +826,8 @@ static Napi::Value CreateDisposableType(const Napi::CallbackInfo &info)
|
|
|
837
826
|
type->dispose_ref = Napi::Persistent(dispose_func);
|
|
838
827
|
|
|
839
828
|
// If the insert succeeds, we cannot fail anymore
|
|
840
|
-
if (named)
|
|
841
|
-
|
|
842
|
-
instance->types_map.InsertOrGet(type->name, type, &inserted);
|
|
843
|
-
|
|
844
|
-
if (!inserted) {
|
|
845
|
-
ThrowError<Napi::Error>(env, "Duplicate type name '%1'", type->name);
|
|
846
|
-
return env.Null();
|
|
847
|
-
}
|
|
848
|
-
}
|
|
829
|
+
if (named && !MapType(env, instance, type, type->name))
|
|
830
|
+
return env.Null();
|
|
849
831
|
err_guard.Disable();
|
|
850
832
|
|
|
851
833
|
return WrapType(env, type);
|
|
@@ -855,12 +837,26 @@ static inline bool GetExternalPointer(Napi::Env env, Napi::Value value, void **o
|
|
|
855
837
|
{
|
|
856
838
|
InstanceData *instance = env.GetInstanceData<InstanceData>();
|
|
857
839
|
|
|
858
|
-
if (
|
|
859
|
-
|
|
840
|
+
if (IsNullOrUndefined(value)) {
|
|
841
|
+
*out_ptr = 0;
|
|
842
|
+
return true;
|
|
843
|
+
} else if (IsRawBuffer(value)) {
|
|
844
|
+
Span<uint8_t> buffer = GetRawBuffer(value);
|
|
845
|
+
|
|
846
|
+
*out_ptr = buffer.ptr;
|
|
847
|
+
return true;
|
|
848
|
+
} else if (value.IsExternal() && !CheckValueTag(value, &TypeInfoMarker) &&
|
|
849
|
+
!CheckValueTag(value, &CastMarker) &&
|
|
850
|
+
!CheckValueTag(value, &MagicUnionMarker)) {
|
|
851
|
+
Napi::External<void> external = value.As<Napi::External<void>>();
|
|
852
|
+
void *ptr = external.Data();
|
|
853
|
+
|
|
854
|
+
*out_ptr = ptr;
|
|
855
|
+
return true;
|
|
856
|
+
} else {
|
|
857
|
+
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for ptr, expected external pointer", GetValueType(instance, value));
|
|
860
858
|
return false;
|
|
861
859
|
}
|
|
862
|
-
|
|
863
|
-
return true;
|
|
864
860
|
}
|
|
865
861
|
|
|
866
862
|
static Napi::Value CallAlloc(const Napi::CallbackInfo &info)
|
|
@@ -906,7 +902,10 @@ static Napi::Value CallAlloc(const Napi::CallbackInfo &info)
|
|
|
906
902
|
return env.Null();
|
|
907
903
|
}
|
|
908
904
|
|
|
909
|
-
|
|
905
|
+
Napi::External<void> external = Napi::External<void>::New(env, ptr);
|
|
906
|
+
SetValueTag(external, type);
|
|
907
|
+
|
|
908
|
+
return external;
|
|
910
909
|
}
|
|
911
910
|
|
|
912
911
|
static Napi::Value CallFree(const Napi::CallbackInfo &info)
|
|
@@ -1140,7 +1139,12 @@ static Napi::Value CreateFunctionType(const Napi::CallbackInfo &info)
|
|
|
1140
1139
|
InstanceData *instance = env.GetInstanceData<InstanceData>();
|
|
1141
1140
|
|
|
1142
1141
|
FunctionInfo *func = instance->callbacks.AppendDefault();
|
|
1143
|
-
|
|
1142
|
+
TypeInfo *type = instance->types.AppendDefault();
|
|
1143
|
+
|
|
1144
|
+
K_DEFER_N(err_guard) {
|
|
1145
|
+
instance->callbacks.RemoveLast(1);
|
|
1146
|
+
instance->types.RemoveLast(1);
|
|
1147
|
+
};
|
|
1144
1148
|
|
|
1145
1149
|
if (info.Length() >= 2) {
|
|
1146
1150
|
if (!ParseClassicFunction(info, false, func))
|
|
@@ -1168,29 +1172,12 @@ static Napi::Value CreateFunctionType(const Napi::CallbackInfo &info)
|
|
|
1168
1172
|
if (!AnalyseFunction(env, instance, func))
|
|
1169
1173
|
return env.Null();
|
|
1170
1174
|
|
|
1171
|
-
// Branchless push loop
|
|
1172
|
-
for (const ParameterInfo ¶m: func->parameters) {
|
|
1173
|
-
func->primitives.Append(param.type->primitive);
|
|
1174
|
-
}
|
|
1175
|
-
if (!func->variadic) {
|
|
1176
|
-
func->primitives.Append(PrimitiveKind::Prototype);
|
|
1177
|
-
}
|
|
1178
|
-
|
|
1179
1175
|
// Adjust parameter offsets for koffi.call()
|
|
1180
1176
|
for (ParameterInfo ¶m: func->parameters) {
|
|
1181
1177
|
param.offset += 2;
|
|
1182
1178
|
}
|
|
1183
1179
|
func->required_parameters += 2;
|
|
1184
1180
|
|
|
1185
|
-
// We cannot fail after this check
|
|
1186
|
-
if (named && instance->types_map.Find(func->name)) {
|
|
1187
|
-
ThrowError<Napi::Error>(env, "Duplicate type name '%1'", func->name);
|
|
1188
|
-
return env.Null();
|
|
1189
|
-
}
|
|
1190
|
-
err_guard.Disable();
|
|
1191
|
-
|
|
1192
|
-
TypeInfo *type = instance->types.AppendDefault();
|
|
1193
|
-
|
|
1194
1181
|
type->name = func->name;
|
|
1195
1182
|
|
|
1196
1183
|
type->primitive = PrimitiveKind::Prototype;
|
|
@@ -1198,7 +1185,10 @@ static Napi::Value CreateFunctionType(const Napi::CallbackInfo &info)
|
|
|
1198
1185
|
type->size = K_SIZE(void *);
|
|
1199
1186
|
type->ref.proto = func;
|
|
1200
1187
|
|
|
1201
|
-
|
|
1188
|
+
// If the insert succeeds, we cannot fail anymore
|
|
1189
|
+
if (named && !MapType(env, instance, type, type->name))
|
|
1190
|
+
return env.Null();
|
|
1191
|
+
err_guard.Disable();
|
|
1202
1192
|
|
|
1203
1193
|
return WrapType(env, type);
|
|
1204
1194
|
}
|
|
@@ -1441,6 +1431,18 @@ InstanceMemory *AllocateMemory(InstanceData *instance, Size stack_size, Size hea
|
|
|
1441
1431
|
// Keep real stack limits intact, in case we need them
|
|
1442
1432
|
mem->stack0 = mem->stack;
|
|
1443
1433
|
|
|
1434
|
+
#if defined(_WIN32) && !defined(_WIN64)
|
|
1435
|
+
mem->stack.len -= K_SIZE(SehFrame);
|
|
1436
|
+
|
|
1437
|
+
// Prepare at the top SEH frame record
|
|
1438
|
+
{
|
|
1439
|
+
SehFrame *seh = (SehFrame *)mem->stack.end();
|
|
1440
|
+
|
|
1441
|
+
seh->Next = (void *)-1;
|
|
1442
|
+
seh->Handler = (void *)SehHandler;
|
|
1443
|
+
}
|
|
1444
|
+
#endif
|
|
1445
|
+
|
|
1444
1446
|
mem->heap.len = heap_size;
|
|
1445
1447
|
#if defined(_WIN32)
|
|
1446
1448
|
mem->heap.ptr = (uint8_t *)VirtualAlloc(nullptr, mem->heap.len, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
|
|
@@ -1526,105 +1528,62 @@ static Napi::Value TranslateVariadicCall(const FunctionInfo *func, void *native,
|
|
|
1526
1528
|
Napi::Env env = info.Env();
|
|
1527
1529
|
InstanceData *instance = env.GetInstanceData<InstanceData>();
|
|
1528
1530
|
|
|
1529
|
-
FunctionInfo
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
// Try cached function
|
|
1533
|
-
{
|
|
1534
|
-
FunctionInfo *prev = instance->variadic_func;
|
|
1535
|
-
|
|
1536
|
-
if (prev && prev->native == native) {
|
|
1537
|
-
Size specified = (info.Length() - prev->required_parameters);
|
|
1538
|
-
Size processed = (prev->parameters.len - prev->required_parameters) * 2;
|
|
1539
|
-
|
|
1540
|
-
if (specified == processed) {
|
|
1541
|
-
bool match = true;
|
|
1531
|
+
FunctionInfo copy;
|
|
1532
|
+
memcpy((void *)©, func, K_SIZE(*func));
|
|
1533
|
+
copy.lib = nullptr;
|
|
1542
1534
|
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
match = false;
|
|
1549
|
-
break;
|
|
1550
|
-
}
|
|
1551
|
-
}
|
|
1552
|
-
|
|
1553
|
-
if (match) [[likely]] {
|
|
1554
|
-
variadic = prev;
|
|
1535
|
+
// This makes variadic calls non-reentrant
|
|
1536
|
+
K_DEFER_C(len = copy.parameters.len) {
|
|
1537
|
+
copy.parameters.RemoveFrom(len);
|
|
1538
|
+
copy.parameters.Leak();
|
|
1539
|
+
};
|
|
1555
1540
|
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1541
|
+
if (info.Length() < (uint32_t)copy.required_parameters) [[unlikely]] {
|
|
1542
|
+
ThrowError<Napi::TypeError>(env, "Expected %1 arguments or more, got %2", copy.parameters.len, info.Length());
|
|
1543
|
+
return env.Null();
|
|
1544
|
+
}
|
|
1545
|
+
if ((info.Length() - copy.required_parameters) % 2) [[unlikely]] {
|
|
1546
|
+
ThrowError<Napi::Error>(env, "Missing value argument for variadic call");
|
|
1547
|
+
return env.Null();
|
|
1561
1548
|
}
|
|
1562
1549
|
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
memcpy((void *)variadic, func, K_SIZE(*func));
|
|
1567
|
-
memset((void *)&variadic->parameters, 0, K_SIZE(variadic->parameters));
|
|
1568
|
-
memset((void *)&variadic->primitives, 0, K_SIZE(variadic->primitives));
|
|
1550
|
+
for (Size i = copy.required_parameters; i < (Size)info.Length(); i += 2) {
|
|
1551
|
+
ParameterInfo param = {};
|
|
1569
1552
|
|
|
1570
|
-
|
|
1571
|
-
variadic->primitives = func->primitives;
|
|
1572
|
-
variadic->lib = nullptr;
|
|
1553
|
+
param.type = ResolveType(info[(uint32_t)i], ¶m.directions);
|
|
1573
1554
|
|
|
1574
|
-
if (
|
|
1575
|
-
|
|
1555
|
+
if (!param.type) [[unlikely]]
|
|
1556
|
+
return env.Null();
|
|
1557
|
+
if (!CanPassType(param.type, param.directions)) [[unlikely]] {
|
|
1558
|
+
ThrowError<Napi::TypeError>(env, "Type %1 cannot be used as a parameter", param.type->name);
|
|
1576
1559
|
return env.Null();
|
|
1577
1560
|
}
|
|
1578
|
-
if (
|
|
1579
|
-
ThrowError<Napi::
|
|
1561
|
+
if (copy.parameters.len >= MaxParameters) [[unlikely]] {
|
|
1562
|
+
ThrowError<Napi::TypeError>(env, "Functions cannot have more than %1 parameters", MaxParameters);
|
|
1580
1563
|
return env.Null();
|
|
1581
1564
|
}
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
param.type = ResolveType(info[(uint32_t)i], ¶m.directions);
|
|
1587
|
-
|
|
1588
|
-
if (!param.type) [[unlikely]]
|
|
1589
|
-
return env.Null();
|
|
1590
|
-
if (!CanPassType(param.type, param.directions)) [[unlikely]] {
|
|
1591
|
-
ThrowError<Napi::TypeError>(env, "Type %1 cannot be used as a parameter", param.type->name);
|
|
1592
|
-
return env.Null();
|
|
1593
|
-
}
|
|
1594
|
-
if (variadic->parameters.len >= MaxParameters) [[unlikely]] {
|
|
1595
|
-
ThrowError<Napi::TypeError>(env, "Functions cannot have more than %1 parameters", MaxParameters);
|
|
1596
|
-
return env.Null();
|
|
1597
|
-
}
|
|
1598
|
-
if ((param.directions & 2) && ++variadic->out_parameters >= MaxParameters) [[unlikely]] {
|
|
1599
|
-
ThrowError<Napi::TypeError>(env, "Functions cannot have more than %1 output parameters", MaxParameters);
|
|
1600
|
-
return env.Null();
|
|
1601
|
-
}
|
|
1602
|
-
|
|
1603
|
-
param.variadic = true;
|
|
1604
|
-
param.offset = (int8_t)(i + 1);
|
|
1605
|
-
|
|
1606
|
-
variadic->parameters.Append(param);
|
|
1565
|
+
if ((param.directions & 2) && ++copy.out_parameters >= MaxParameters) [[unlikely]] {
|
|
1566
|
+
ThrowError<Napi::TypeError>(env, "Functions cannot have more than %1 output parameters", MaxParameters);
|
|
1567
|
+
return env.Null();
|
|
1607
1568
|
}
|
|
1608
1569
|
|
|
1609
|
-
|
|
1610
|
-
|
|
1570
|
+
param.variadic = true;
|
|
1571
|
+
param.offset = (int8_t)(i + 1);
|
|
1611
1572
|
|
|
1612
|
-
|
|
1613
|
-
for (Size i = func->parameters.len; i < variadic->parameters.len; i++) {
|
|
1614
|
-
const ParameterInfo ¶m = variadic->parameters[i];
|
|
1615
|
-
variadic->primitives.Append(param.type->primitive);
|
|
1616
|
-
}
|
|
1617
|
-
variadic->primitives.Append(PrimitiveKind::Prototype);
|
|
1573
|
+
copy.parameters.Append(param);
|
|
1618
1574
|
}
|
|
1619
1575
|
|
|
1576
|
+
if (!AnalyseFunction(env, instance, ©)) [[unlikely]]
|
|
1577
|
+
return env.Null();
|
|
1578
|
+
|
|
1620
1579
|
InstanceMemory *mem = instance->memories[0];
|
|
1621
1580
|
CallData call(env, instance, mem);
|
|
1622
1581
|
|
|
1623
|
-
if (!call.Prepare(
|
|
1582
|
+
if (!call.Prepare(©, info)) [[unlikely]]
|
|
1624
1583
|
return env.Null();
|
|
1625
1584
|
|
|
1626
1585
|
if (instance->debug) {
|
|
1627
|
-
call.DumpForward(
|
|
1586
|
+
call.DumpForward(©);
|
|
1628
1587
|
}
|
|
1629
1588
|
|
|
1630
1589
|
// Execute call
|
|
@@ -1632,17 +1591,10 @@ static Napi::Value TranslateVariadicCall(const FunctionInfo *func, void *native,
|
|
|
1632
1591
|
K_DEFER_C(prev_call = exec_call) { exec_call = prev_call; };
|
|
1633
1592
|
exec_call = &call;
|
|
1634
1593
|
|
|
1635
|
-
call.Execute(
|
|
1636
|
-
}
|
|
1637
|
-
|
|
1638
|
-
if (variadic != instance->variadic_func) {
|
|
1639
|
-
err_guard.Disable();
|
|
1640
|
-
|
|
1641
|
-
delete instance->variadic_func;
|
|
1642
|
-
instance->variadic_func = variadic;
|
|
1594
|
+
call.Execute(©, native);
|
|
1643
1595
|
}
|
|
1644
1596
|
|
|
1645
|
-
return call.Complete(
|
|
1597
|
+
return call.Complete(©);
|
|
1646
1598
|
}
|
|
1647
1599
|
|
|
1648
1600
|
Napi::Value TranslateVariadicCall(const Napi::CallbackInfo &info)
|
|
@@ -1699,8 +1651,11 @@ void AsyncCall::OnOK()
|
|
|
1699
1651
|
|
|
1700
1652
|
Napi::FunctionReference &callback = Callback();
|
|
1701
1653
|
|
|
1702
|
-
|
|
1703
|
-
napi_value args[] = {
|
|
1654
|
+
Napi::Value self = env.Null();
|
|
1655
|
+
napi_value args[] = {
|
|
1656
|
+
env.Null(),
|
|
1657
|
+
call.Complete(func)
|
|
1658
|
+
};
|
|
1704
1659
|
|
|
1705
1660
|
callback.Call(self, K_LEN(args), args);
|
|
1706
1661
|
}
|
|
@@ -1746,35 +1701,54 @@ Napi::Value TranslateAsyncCall(const Napi::CallbackInfo &info)
|
|
|
1746
1701
|
return TranslateAsyncCall(func, func->native, info);
|
|
1747
1702
|
}
|
|
1748
1703
|
|
|
1749
|
-
extern "C" void RelayCallback(Size idx, uint8_t *
|
|
1704
|
+
extern "C" void RelayCallback(Size idx, uint8_t *sp)
|
|
1750
1705
|
{
|
|
1751
|
-
|
|
1752
|
-
exec_call->RelaySafe(idx, own_sp, caller_sp, false, out_reg);
|
|
1753
|
-
} else {
|
|
1754
|
-
// This happens if the callback pointer is called from a different thread
|
|
1755
|
-
// than the one that runs the FFI call (sync or async).
|
|
1706
|
+
CallData *call = exec_call;
|
|
1756
1707
|
|
|
1757
|
-
|
|
1708
|
+
// Try the fast path first: we are on the main thread and we are running a native call through Koffi.
|
|
1709
|
+
// It should be easy, but in this case we are running on the custom Koffi stack, which will trip up
|
|
1710
|
+
// Node and V8. So we need to switch back to the normal/main stack.
|
|
1711
|
+
if (call && std::this_thread::get_id() == call->instance->main_thread_id) {
|
|
1712
|
+
SwitchAndRelay(call, idx, sp, call->old_sp, &call->mem->stack);
|
|
1713
|
+
return;
|
|
1714
|
+
}
|
|
1758
1715
|
|
|
1759
|
-
|
|
1760
|
-
|
|
1716
|
+
// Otherwise, we need to allocate memory to perform the callback.
|
|
1717
|
+
// Since the necessary machinery live in CallData, just use a temporary instance.
|
|
1718
|
+
// In some cases we would reuse the existing call (exec_call may be not null),
|
|
1719
|
+
// but it is rare so let's ignore this for simplicity.
|
|
1761
1720
|
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1721
|
+
TrampolineInfo *trampoline = &shared.trampolines[idx];
|
|
1722
|
+
Napi::Env env = trampoline->func.Env();
|
|
1723
|
+
InstanceData *instance = env.GetInstanceData<InstanceData>();
|
|
1724
|
+
|
|
1725
|
+
InstanceMemory *mem = AllocateMemory(instance, instance->config.async_stack_size, instance->config.async_heap_size);
|
|
1726
|
+
if (!mem) [[unlikely]] {
|
|
1727
|
+
ThrowError<Napi::Error>(env, "Too many asynchronous calls are running");
|
|
1728
|
+
return;
|
|
1729
|
+
}
|
|
1730
|
+
|
|
1731
|
+
// Avoid triggering the "use callback beyond FFI" check
|
|
1732
|
+
K_DEFER_C(generation = trampoline->generation) { trampoline->generation = generation; };
|
|
1733
|
+
trampoline->generation = -1;
|
|
1767
1734
|
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
trampoline->generation = -1;
|
|
1735
|
+
if (std::this_thread::get_id() == instance->main_thread_id) {
|
|
1736
|
+
CallData call(env, instance, mem);
|
|
1771
1737
|
|
|
1772
|
-
|
|
1738
|
+
Napi::HandleScope scope(env);
|
|
1739
|
+
call.Relay(idx, sp);
|
|
1740
|
+
} else {
|
|
1773
1741
|
CallData call(env, instance, mem);
|
|
1774
|
-
call.
|
|
1742
|
+
call.RelayAsync(idx, sp);
|
|
1775
1743
|
}
|
|
1776
1744
|
}
|
|
1777
1745
|
|
|
1746
|
+
extern "C" void RelayDirect(CallData *call, Size idx, uint8_t *sp)
|
|
1747
|
+
{
|
|
1748
|
+
Napi::HandleScope scope(call->env);
|
|
1749
|
+
call->Relay(idx, sp);
|
|
1750
|
+
}
|
|
1751
|
+
|
|
1778
1752
|
static Napi::Value FindLibraryFunction(const Napi::CallbackInfo &info)
|
|
1779
1753
|
{
|
|
1780
1754
|
Napi::Env env = info.Env();
|
|
@@ -1811,16 +1785,9 @@ static Napi::Value FindLibraryFunction(const Napi::CallbackInfo &info)
|
|
|
1811
1785
|
|
|
1812
1786
|
if (!AnalyseFunction(env, instance, func))
|
|
1813
1787
|
return env.Null();
|
|
1814
|
-
|
|
1815
|
-
// Branchless push loop
|
|
1816
|
-
for (const ParameterInfo ¶m: func->parameters) {
|
|
1817
|
-
func->primitives.Append(param.type->primitive);
|
|
1818
|
-
}
|
|
1819
1788
|
if (func->variadic) {
|
|
1789
|
+
// Minimize reallocations
|
|
1820
1790
|
func->parameters.Grow(32);
|
|
1821
|
-
func->primitives.Grow(32);
|
|
1822
|
-
} else {
|
|
1823
|
-
func->primitives.Append(PrimitiveKind::Prototype);
|
|
1824
1791
|
}
|
|
1825
1792
|
|
|
1826
1793
|
#if defined(_WIN32)
|
|
@@ -1885,7 +1852,10 @@ static Napi::Value FindSymbol(const Napi::CallbackInfo &info)
|
|
|
1885
1852
|
return env.Null();
|
|
1886
1853
|
}
|
|
1887
1854
|
|
|
1888
|
-
|
|
1855
|
+
Napi::External<void> external = Napi::External<void>::New(env, ptr);
|
|
1856
|
+
SetValueTag(external, &type);
|
|
1857
|
+
|
|
1858
|
+
return external;
|
|
1889
1859
|
}
|
|
1890
1860
|
|
|
1891
1861
|
static Napi::Value UnloadLibrary(const Napi::CallbackInfo &info)
|
|
@@ -2054,10 +2024,13 @@ static Napi::Value RegisterCallback(const Napi::CallbackInfo &info)
|
|
|
2054
2024
|
|
|
2055
2025
|
void *ptr = GetTrampoline(idx);
|
|
2056
2026
|
|
|
2027
|
+
Napi::External<void> external = Napi::External<void>::New(env, ptr);
|
|
2028
|
+
SetValueTag(external, type->ref.marker);
|
|
2029
|
+
|
|
2057
2030
|
// Cache index for fast unregistration
|
|
2058
2031
|
instance->trampolines_map.Set(ptr, idx);
|
|
2059
2032
|
|
|
2060
|
-
return
|
|
2033
|
+
return external;
|
|
2061
2034
|
}
|
|
2062
2035
|
|
|
2063
2036
|
static Napi::Value UnregisterCallback(const Napi::CallbackInfo &info)
|
|
@@ -2069,13 +2042,14 @@ static Napi::Value UnregisterCallback(const Napi::CallbackInfo &info)
|
|
|
2069
2042
|
ThrowError<Napi::TypeError>(env, "Expected 1 argument, got %1", info.Length());
|
|
2070
2043
|
return env.Null();
|
|
2071
2044
|
}
|
|
2072
|
-
|
|
2073
|
-
void *ptr;
|
|
2074
|
-
if (!TryPointer(info[0], &ptr)) {
|
|
2045
|
+
if (!info[0].IsExternal()) {
|
|
2075
2046
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for id, expected registered callback", GetValueType(instance, info[0]));
|
|
2076
2047
|
return env.Null();
|
|
2077
2048
|
}
|
|
2078
2049
|
|
|
2050
|
+
Napi::External<void> external = info[0].As<Napi::External<void>>();
|
|
2051
|
+
void *ptr = external.Data();
|
|
2052
|
+
|
|
2079
2053
|
int16_t idx;
|
|
2080
2054
|
{
|
|
2081
2055
|
int16_t *it = instance->trampolines_map.Find(ptr);
|
|
@@ -2394,7 +2368,7 @@ bool InitAsyncBroker(Napi::Env env, InstanceData *instance)
|
|
|
2394
2368
|
if (napi_create_threadsafe_function(env, nullptr, nullptr,
|
|
2395
2369
|
Napi::String::New(env, "Koffi Async Callback Broker"),
|
|
2396
2370
|
0, 1, nullptr, nullptr, nullptr,
|
|
2397
|
-
|
|
2371
|
+
PerformAsyncRelay, &instance->broker) != napi_ok) {
|
|
2398
2372
|
LogError("Failed to create async callback broker");
|
|
2399
2373
|
return false;
|
|
2400
2374
|
}
|
|
@@ -2431,8 +2405,10 @@ static void RegisterPrimitiveType(Napi::Env env, Napi::Object map, std::initiali
|
|
|
2431
2405
|
}
|
|
2432
2406
|
|
|
2433
2407
|
if (ref) {
|
|
2434
|
-
|
|
2435
|
-
K_ASSERT(
|
|
2408
|
+
const TypeInfo *marker = instance->types_map.FindValue(ref, nullptr);
|
|
2409
|
+
K_ASSERT(marker);
|
|
2410
|
+
|
|
2411
|
+
type->ref.marker = marker;
|
|
2436
2412
|
}
|
|
2437
2413
|
|
|
2438
2414
|
Napi::Value wrapper = WrapType(env, type);
|
|
@@ -2647,7 +2623,10 @@ static Napi::Object InitModule(Napi::Env env, Napi::Object exports)
|
|
|
2647
2623
|
Napi::Object node = Napi::Object::New(env);
|
|
2648
2624
|
exports.Set("node", node);
|
|
2649
2625
|
|
|
2650
|
-
|
|
2626
|
+
Napi::External<void> external = Napi::External<void>::New(env, (napi_env)env);
|
|
2627
|
+
SetValueTag(external, instance->void_type);
|
|
2628
|
+
|
|
2629
|
+
node.Set("env", external);
|
|
2651
2630
|
|
|
2652
2631
|
node.Set("poll", Napi::Function::New(env, &Poll, "poll"));
|
|
2653
2632
|
node.Set("PollHandle", PollHandle::Define(env));
|
|
@@ -2655,13 +2634,22 @@ static Napi::Object InitModule(Napi::Env env, Napi::Object exports)
|
|
|
2655
2634
|
|
|
2656
2635
|
exports.Set("version", Napi::String::New(env, K_STRINGIFY(VERSION)));
|
|
2657
2636
|
|
|
2637
|
+
napi_add_env_cleanup_hook(env, [](void *udata) {
|
|
2638
|
+
InstanceData *instance = (InstanceData *)udata;
|
|
2639
|
+
|
|
2640
|
+
if (instance->broker) {
|
|
2641
|
+
// This deadlocks if we try to do this when the module is destroyed, when
|
|
2642
|
+
// the InstanceData destructor runs, so run in the env cleanup hook instead,
|
|
2643
|
+
// where it seems to go okay.
|
|
2644
|
+
napi_release_threadsafe_function(instance->broker, napi_tsfn_abort);
|
|
2645
|
+
}
|
|
2646
|
+
}, instance);
|
|
2647
|
+
|
|
2658
2648
|
return exports;
|
|
2659
2649
|
}
|
|
2660
2650
|
|
|
2661
2651
|
InstanceData::~InstanceData()
|
|
2662
2652
|
{
|
|
2663
|
-
delete variadic_func;
|
|
2664
|
-
|
|
2665
2653
|
for (InstanceMemory *mem: memories) {
|
|
2666
2654
|
delete mem;
|
|
2667
2655
|
}
|
|
@@ -2680,10 +2668,6 @@ InstanceData::~InstanceData()
|
|
|
2680
2668
|
}
|
|
2681
2669
|
}
|
|
2682
2670
|
}
|
|
2683
|
-
|
|
2684
|
-
if (broker) {
|
|
2685
|
-
napi_release_threadsafe_function(broker, napi_tsfn_abort);
|
|
2686
|
-
}
|
|
2687
2671
|
}
|
|
2688
2672
|
|
|
2689
2673
|
NODE_API_MODULE(koffi, InitModule);
|