koffi 1.1.0-beta.0 → 1.1.0-beta.3
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/CMakeLists.txt +4 -0
- package/README.md +16 -11
- package/build/qemu/1.1.0-beta.3/koffi_darwin_x64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.3/koffi_freebsd_arm64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.3/koffi_freebsd_ia32.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.3/koffi_freebsd_x64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.3/koffi_linux_arm.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.3/koffi_linux_arm64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.3/koffi_linux_ia32.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.3/koffi_linux_x64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.3/koffi_win32_ia32.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.3/koffi_win32_x64.tar.gz +0 -0
- package/package.json +1 -1
- package/qemu/qemu.js +1 -0
- package/src/abi_arm32.cc +27 -45
- package/src/abi_arm64.cc +58 -132
- package/src/abi_x64_sysv.cc +24 -7
- package/src/abi_x64_win.cc +3 -0
- package/src/abi_x86.cc +3 -0
- package/src/call.cc +540 -33
- package/src/call.hh +5 -3
- package/src/ffi.cc +69 -4
- package/src/ffi.hh +3 -1
- package/src/parser.cc +7 -2
- package/src/util.cc +72 -0
- package/src/util.hh +2 -0
- package/test/misc.c +14 -8
- package/vendor/node-addon-api/CODE_OF_CONDUCT.md +4 -0
- package/vendor/node-addon-api/CONTRIBUTING.md +93 -0
- package/vendor/node-addon-api/appveyor.yml +37 -0
- package/vendor/node-addon-api/benchmark/README.md +47 -0
- package/vendor/node-addon-api/benchmark/binding.gyp +25 -0
- package/vendor/node-addon-api/benchmark/function_args.cc +217 -0
- package/vendor/node-addon-api/benchmark/function_args.js +60 -0
- package/vendor/node-addon-api/benchmark/index.js +34 -0
- package/vendor/node-addon-api/benchmark/property_descriptor.cc +91 -0
- package/vendor/node-addon-api/benchmark/property_descriptor.js +37 -0
- package/vendor/node-addon-api/doc/addon.md +163 -0
- package/vendor/node-addon-api/doc/array.md +81 -0
- package/vendor/node-addon-api/doc/array_buffer.md +155 -0
- package/vendor/node-addon-api/doc/async_context.md +86 -0
- package/vendor/node-addon-api/doc/async_operations.md +31 -0
- package/vendor/node-addon-api/doc/async_worker.md +427 -0
- package/vendor/node-addon-api/doc/async_worker_variants.md +557 -0
- package/vendor/node-addon-api/doc/bigint.md +97 -0
- package/vendor/node-addon-api/doc/boolean.md +68 -0
- package/vendor/node-addon-api/doc/buffer.md +150 -0
- package/vendor/node-addon-api/doc/callback_scope.md +54 -0
- package/vendor/node-addon-api/doc/callbackinfo.md +97 -0
- package/vendor/node-addon-api/doc/checker-tool.md +32 -0
- package/vendor/node-addon-api/doc/class_property_descriptor.md +123 -0
- package/vendor/node-addon-api/doc/cmake-js.md +68 -0
- package/vendor/node-addon-api/doc/conversion-tool.md +28 -0
- package/vendor/node-addon-api/doc/creating_a_release.md +62 -0
- package/vendor/node-addon-api/doc/dataview.md +248 -0
- package/vendor/node-addon-api/doc/date.md +68 -0
- package/vendor/node-addon-api/doc/env.md +196 -0
- package/vendor/node-addon-api/doc/error.md +120 -0
- package/vendor/node-addon-api/doc/error_handling.md +254 -0
- package/vendor/node-addon-api/doc/escapable_handle_scope.md +80 -0
- package/vendor/node-addon-api/doc/external.md +63 -0
- package/vendor/node-addon-api/doc/function.md +402 -0
- package/vendor/node-addon-api/doc/function_reference.md +238 -0
- package/vendor/node-addon-api/doc/generator.md +13 -0
- package/vendor/node-addon-api/doc/handle_scope.md +63 -0
- package/vendor/node-addon-api/doc/hierarchy.md +91 -0
- package/vendor/node-addon-api/doc/instance_wrap.md +408 -0
- package/vendor/node-addon-api/doc/maybe.md +76 -0
- package/vendor/node-addon-api/doc/memory_management.md +27 -0
- package/vendor/node-addon-api/doc/name.md +29 -0
- package/vendor/node-addon-api/doc/node-gyp.md +82 -0
- package/vendor/node-addon-api/doc/number.md +163 -0
- package/vendor/node-addon-api/doc/object.md +411 -0
- package/vendor/node-addon-api/doc/object_lifetime_management.md +83 -0
- package/vendor/node-addon-api/doc/object_reference.md +117 -0
- package/vendor/node-addon-api/doc/object_wrap.md +588 -0
- package/vendor/node-addon-api/doc/prebuild_tools.md +16 -0
- package/vendor/node-addon-api/doc/promises.md +79 -0
- package/vendor/node-addon-api/doc/property_descriptor.md +286 -0
- package/vendor/node-addon-api/doc/propertylvalue.md +50 -0
- package/vendor/node-addon-api/doc/range_error.md +59 -0
- package/vendor/node-addon-api/doc/reference.md +113 -0
- package/vendor/node-addon-api/doc/setup.md +110 -0
- package/vendor/node-addon-api/doc/string.md +93 -0
- package/vendor/node-addon-api/doc/symbol.md +61 -0
- package/vendor/node-addon-api/doc/threadsafe.md +121 -0
- package/vendor/node-addon-api/doc/threadsafe_function.md +290 -0
- package/vendor/node-addon-api/doc/type_error.md +59 -0
- package/vendor/node-addon-api/doc/typed_array.md +78 -0
- package/vendor/node-addon-api/doc/typed_array_of.md +137 -0
- package/vendor/node-addon-api/doc/typed_threadsafe_function.md +306 -0
- package/vendor/node-addon-api/doc/value.md +340 -0
- package/vendor/node-addon-api/doc/version_management.md +43 -0
- package/vendor/node-addon-api/package.json +415 -0
- package/vendor/node-addon-api/test/README.md +91 -0
- package/vendor/node-addon-api/test/addon.cc +36 -0
- package/vendor/node-addon-api/test/addon.js +11 -0
- package/vendor/node-addon-api/test/addon_build/index.js +49 -0
- package/vendor/node-addon-api/test/addon_build/tpl/addon.cc +17 -0
- package/vendor/node-addon-api/test/addon_build/tpl/binding.gyp +62 -0
- package/vendor/node-addon-api/test/addon_build/tpl/index.js +9 -0
- package/vendor/node-addon-api/test/addon_build/tpl/package.json +11 -0
- package/vendor/node-addon-api/test/addon_data.cc +99 -0
- package/vendor/node-addon-api/test/addon_data.js +46 -0
- package/vendor/node-addon-api/test/array_buffer.cc +243 -0
- package/vendor/node-addon-api/test/array_buffer.js +69 -0
- package/vendor/node-addon-api/test/async_context.cc +36 -0
- package/vendor/node-addon-api/test/async_context.js +122 -0
- package/vendor/node-addon-api/test/async_progress_queue_worker.cc +83 -0
- package/vendor/node-addon-api/test/async_progress_queue_worker.js +46 -0
- package/vendor/node-addon-api/test/async_progress_worker.cc +134 -0
- package/vendor/node-addon-api/test/async_progress_worker.js +61 -0
- package/vendor/node-addon-api/test/async_worker.cc +106 -0
- package/vendor/node-addon-api/test/async_worker.js +179 -0
- package/vendor/node-addon-api/test/async_worker_nocallback.js +13 -0
- package/vendor/node-addon-api/test/async_worker_persistent.cc +63 -0
- package/vendor/node-addon-api/test/async_worker_persistent.js +24 -0
- package/vendor/node-addon-api/test/basic_types/array.cc +40 -0
- package/vendor/node-addon-api/test/basic_types/array.js +35 -0
- package/vendor/node-addon-api/test/basic_types/boolean.cc +38 -0
- package/vendor/node-addon-api/test/basic_types/boolean.js +35 -0
- package/vendor/node-addon-api/test/basic_types/number.cc +99 -0
- package/vendor/node-addon-api/test/basic_types/number.js +114 -0
- package/vendor/node-addon-api/test/basic_types/value.cc +120 -0
- package/vendor/node-addon-api/test/basic_types/value.js +133 -0
- package/vendor/node-addon-api/test/bigint.cc +91 -0
- package/vendor/node-addon-api/test/bigint.js +53 -0
- package/vendor/node-addon-api/test/binding-swallowexcept.cc +12 -0
- package/vendor/node-addon-api/test/binding.cc +173 -0
- package/vendor/node-addon-api/test/binding.gyp +124 -0
- package/vendor/node-addon-api/test/buffer.cc +183 -0
- package/vendor/node-addon-api/test/buffer.js +69 -0
- package/vendor/node-addon-api/test/callbackscope.cc +22 -0
- package/vendor/node-addon-api/test/callbackscope.js +49 -0
- package/vendor/node-addon-api/test/common/index.js +114 -0
- package/vendor/node-addon-api/test/common/test_helper.h +71 -0
- package/vendor/node-addon-api/test/dataview/dataview.cc +48 -0
- package/vendor/node-addon-api/test/dataview/dataview.js +35 -0
- package/vendor/node-addon-api/test/dataview/dataview_read_write.cc +115 -0
- package/vendor/node-addon-api/test/dataview/dataview_read_write.js +90 -0
- package/vendor/node-addon-api/test/date.cc +44 -0
- package/vendor/node-addon-api/test/date.js +18 -0
- package/vendor/node-addon-api/test/env_cleanup.cc +88 -0
- package/vendor/node-addon-api/test/env_cleanup.js +56 -0
- package/vendor/node-addon-api/test/error.cc +287 -0
- package/vendor/node-addon-api/test/error.js +81 -0
- package/vendor/node-addon-api/test/error_handling_for_primitives.cc +13 -0
- package/vendor/node-addon-api/test/error_handling_for_primitives.js +29 -0
- package/vendor/node-addon-api/test/error_terminating_environment.js +95 -0
- package/vendor/node-addon-api/test/external.cc +81 -0
- package/vendor/node-addon-api/test/external.js +88 -0
- package/vendor/node-addon-api/test/function.cc +324 -0
- package/vendor/node-addon-api/test/function.js +133 -0
- package/vendor/node-addon-api/test/function_reference.cc +202 -0
- package/vendor/node-addon-api/test/function_reference.js +157 -0
- package/vendor/node-addon-api/test/globalObject/global_object.cc +61 -0
- package/vendor/node-addon-api/test/globalObject/global_object_delete_property.cc +31 -0
- package/vendor/node-addon-api/test/globalObject/global_object_delete_property.js +61 -0
- package/vendor/node-addon-api/test/globalObject/global_object_get_property.cc +40 -0
- package/vendor/node-addon-api/test/globalObject/global_object_get_property.js +57 -0
- package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.cc +28 -0
- package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.js +48 -0
- package/vendor/node-addon-api/test/globalObject/global_object_set_property.cc +31 -0
- package/vendor/node-addon-api/test/globalObject/global_object_set_property.js +58 -0
- package/vendor/node-addon-api/test/handlescope.cc +60 -0
- package/vendor/node-addon-api/test/handlescope.js +14 -0
- package/vendor/node-addon-api/test/index.js +159 -0
- package/vendor/node-addon-api/test/maybe/check.cc +23 -0
- package/vendor/node-addon-api/test/maybe/index.js +38 -0
- package/vendor/node-addon-api/test/memory_management.cc +17 -0
- package/vendor/node-addon-api/test/memory_management.js +9 -0
- package/vendor/node-addon-api/test/movable_callbacks.cc +23 -0
- package/vendor/node-addon-api/test/movable_callbacks.js +21 -0
- package/vendor/node-addon-api/test/name.cc +108 -0
- package/vendor/node-addon-api/test/name.js +59 -0
- package/vendor/node-addon-api/test/napi_child.js +14 -0
- package/vendor/node-addon-api/test/object/delete_property.cc +38 -0
- package/vendor/node-addon-api/test/object/delete_property.js +41 -0
- package/vendor/node-addon-api/test/object/finalizer.cc +29 -0
- package/vendor/node-addon-api/test/object/finalizer.js +28 -0
- package/vendor/node-addon-api/test/object/get_property.cc +34 -0
- package/vendor/node-addon-api/test/object/get_property.js +40 -0
- package/vendor/node-addon-api/test/object/has_own_property.cc +34 -0
- package/vendor/node-addon-api/test/object/has_own_property.js +34 -0
- package/vendor/node-addon-api/test/object/has_property.cc +38 -0
- package/vendor/node-addon-api/test/object/has_property.js +37 -0
- package/vendor/node-addon-api/test/object/object.cc +350 -0
- package/vendor/node-addon-api/test/object/object.js +217 -0
- package/vendor/node-addon-api/test/object/object_deprecated.cc +66 -0
- package/vendor/node-addon-api/test/object/object_deprecated.js +47 -0
- package/vendor/node-addon-api/test/object/object_freeze_seal.cc +25 -0
- package/vendor/node-addon-api/test/object/object_freeze_seal.js +61 -0
- package/vendor/node-addon-api/test/object/set_property.cc +45 -0
- package/vendor/node-addon-api/test/object/set_property.js +30 -0
- package/vendor/node-addon-api/test/object/subscript_operator.cc +58 -0
- package/vendor/node-addon-api/test/object/subscript_operator.js +17 -0
- package/vendor/node-addon-api/test/object_reference.cc +219 -0
- package/vendor/node-addon-api/test/object_reference.js +259 -0
- package/vendor/node-addon-api/test/objectwrap.cc +268 -0
- package/vendor/node-addon-api/test/objectwrap.js +284 -0
- package/vendor/node-addon-api/test/objectwrap_constructor_exception.cc +26 -0
- package/vendor/node-addon-api/test/objectwrap_constructor_exception.js +18 -0
- package/vendor/node-addon-api/test/objectwrap_function.cc +45 -0
- package/vendor/node-addon-api/test/objectwrap_function.js +22 -0
- package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.cc +30 -0
- package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.js +13 -0
- package/vendor/node-addon-api/test/objectwrap_removewrap.cc +45 -0
- package/vendor/node-addon-api/test/objectwrap_removewrap.js +40 -0
- package/vendor/node-addon-api/test/objectwrap_worker_thread.js +19 -0
- package/vendor/node-addon-api/test/promise.cc +29 -0
- package/vendor/node-addon-api/test/promise.js +18 -0
- package/vendor/node-addon-api/test/reference.cc +24 -0
- package/vendor/node-addon-api/test/reference.js +14 -0
- package/vendor/node-addon-api/test/run_script.cc +56 -0
- package/vendor/node-addon-api/test/run_script.js +45 -0
- package/vendor/node-addon-api/test/symbol.cc +79 -0
- package/vendor/node-addon-api/test/symbol.js +73 -0
- package/vendor/node-addon-api/test/testUtil.js +54 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.cc +195 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.js +188 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.cc +63 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.js +12 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.cc +115 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.js +14 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.cc +26 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.js +7 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.cc +225 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.js +59 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.cc +42 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.js +53 -0
- package/vendor/node-addon-api/test/thunking_manual.cc +140 -0
- package/vendor/node-addon-api/test/thunking_manual.js +17 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.cc +215 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.js +188 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.cc +68 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.js +12 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.cc +127 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.js +14 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.cc +28 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.js +7 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.cc +237 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.js +59 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.cc +53 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.js +53 -0
- package/vendor/node-addon-api/test/typedarray-bigint.js +58 -0
- package/vendor/node-addon-api/test/typedarray.cc +216 -0
- package/vendor/node-addon-api/test/typedarray.js +69 -0
- package/vendor/node-addon-api/test/version_management.cc +27 -0
- package/vendor/node-addon-api/test/version_management.js +31 -0
- package/vendor/node-addon-api/unit-test/README.md +28 -0
- package/vendor/node-addon-api/unit-test/binding-file-template.js +39 -0
- package/vendor/node-addon-api/unit-test/binding.gyp +72 -0
- package/vendor/node-addon-api/unit-test/exceptions.js +32 -0
- package/vendor/node-addon-api/unit-test/generate-binding-cc.js +61 -0
- package/vendor/node-addon-api/unit-test/injectTestParams.js +101 -0
- package/vendor/node-addon-api/unit-test/listOfTestModules.js +88 -0
- package/vendor/node-addon-api/unit-test/matchModules.js +65 -0
- package/vendor/node-addon-api/unit-test/setup.js +13 -0
- package/vendor/node-addon-api/unit-test/spawnTask.js +26 -0
- package/vendor/node-addon-api/unit-test/test.js +30 -0
- package/build/qemu/1.1.0-beta.0/koffi_darwin_x64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.0/koffi_freebsd_arm64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.0/koffi_freebsd_ia32.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.0/koffi_freebsd_x64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.0/koffi_linux_arm.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.0/koffi_linux_arm64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.0/koffi_linux_ia32.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.0/koffi_linux_x64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.0/koffi_win32_ia32.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.0/koffi_win32_x64.tar.gz +0 -0
package/CMakeLists.txt
CHANGED
|
@@ -18,7 +18,11 @@ find_package(CNoke)
|
|
|
18
18
|
|
|
19
19
|
set(CMAKE_CXX_STANDARD 17)
|
|
20
20
|
if(MSVC)
|
|
21
|
+
add_compile_options(/W4 /wd4200 /wd4458 /wd4706 /wd4100 /wd4127 /wd4702)
|
|
21
22
|
enable_language(ASM_MASM)
|
|
23
|
+
else()
|
|
24
|
+
add_compile_options(-Wall -Wextra -Wno-missing-field-initializers
|
|
25
|
+
-Wno-unused-parameter -Wno-class-memaccess)
|
|
22
26
|
endif()
|
|
23
27
|
|
|
24
28
|
# ---- Koffi ----
|
package/README.md
CHANGED
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
- [Introduction](#introduction)
|
|
4
4
|
- [Get started](#get-started)
|
|
5
|
+
- [Extra features](#extra-features)
|
|
6
|
+
* [C arrays](#c-arrays)
|
|
7
|
+
* [Variadic functions](#variadic-functions)
|
|
8
|
+
* [Asynchronous calls](#asynchronous-calls)
|
|
9
|
+
* [Callbacks](#callbacks)
|
|
5
10
|
- [Benchmarks](#benchmarks)
|
|
6
11
|
* [atoi results](#atoi-results)
|
|
7
12
|
* [Raylib results](#raylib-results)
|
|
@@ -16,9 +21,8 @@ Koffi is a fast and easy-to-use FFI module for Node.js, with support for primiti
|
|
|
16
21
|
|
|
17
22
|
After the release of version 1.0, the following features are planned:
|
|
18
23
|
|
|
19
|
-
* 1.1: Asynchronous calls
|
|
20
|
-
* 1.2:
|
|
21
|
-
* 1.3: C to JS callbacks
|
|
24
|
+
* 1.1: Asynchronous calls and fixed-size array types
|
|
25
|
+
* 1.2: C to JS callbacks
|
|
22
26
|
|
|
23
27
|
The following platforms __are officially supported and tested__ at the moment:
|
|
24
28
|
|
|
@@ -214,12 +218,16 @@ while (!WindowShouldClose()) {
|
|
|
214
218
|
|
|
215
219
|
# Extra features
|
|
216
220
|
|
|
221
|
+
## C arrays
|
|
222
|
+
|
|
223
|
+
Fixed-size arrays are declared with `koffi.array(type, length)`. Just like in C, they cannot be passed
|
|
224
|
+
as functions parameters (they degenerate to pointers), or returned by value. You can however embed them in struct types.
|
|
225
|
+
|
|
217
226
|
## Variadic functions
|
|
218
227
|
|
|
219
228
|
Variadic functions are declared with an ellipsis as the last argument.
|
|
220
229
|
|
|
221
|
-
In order to call a variadic function, you must provide two Javascript arguments for each C parameter,
|
|
222
|
-
the first one is the expected type and the second one is the value.
|
|
230
|
+
In order to call a variadic function, you must provide two Javascript arguments for each C parameter, the first one is the expected type and the second one is the value.
|
|
223
231
|
|
|
224
232
|
```js
|
|
225
233
|
const printf = lib.func('printf', 'int', ['string', '...']);
|
|
@@ -229,9 +237,7 @@ printf('Integer %d, double %g, string %s', 'int', 6, 'double', 8.5, 'string', 'T
|
|
|
229
237
|
|
|
230
238
|
## Asynchronous calls
|
|
231
239
|
|
|
232
|
-
You can issue asynchronous calls by calling the function through its async member.
|
|
233
|
-
In this case, you need to provide a callback function as the last argument, with
|
|
234
|
-
`(err, res)` parameters.
|
|
240
|
+
You can issue asynchronous calls by calling the function through its async member. In this case, you need to provide a callback function as the last argument, with `(err, res)` parameters.
|
|
235
241
|
|
|
236
242
|
```js
|
|
237
243
|
const koffi = require('koffi');
|
|
@@ -247,14 +253,13 @@ console.log('Hello World!');
|
|
|
247
253
|
// This program will print "Hello World!", and then "Result: 1257"
|
|
248
254
|
```
|
|
249
255
|
|
|
250
|
-
You can easily convert this callback-style async function with `util.promisify()` from the
|
|
251
|
-
Node.js standard library.
|
|
256
|
+
You can easily convert this callback-style async function to a promise-based version with `util.promisify()` from the Node.js standard library.
|
|
252
257
|
|
|
253
258
|
Variadic functions do not support async.
|
|
254
259
|
|
|
255
260
|
## Callbacks
|
|
256
261
|
|
|
257
|
-
Koffi does not yet support passing JS functions as callbacks. This is planned for version 1.
|
|
262
|
+
Koffi does not yet support passing JS functions as callbacks. This is planned for version 1.2.
|
|
258
263
|
|
|
259
264
|
# Benchmarks
|
|
260
265
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
package/qemu/qemu.js
CHANGED
|
@@ -275,6 +275,7 @@ async function pack() {
|
|
|
275
275
|
let json = fs.readFileSync(root_dir + '/koffi/package.json', { encoding: 'utf-8' });
|
|
276
276
|
let version = JSON.parse(json).version;
|
|
277
277
|
|
|
278
|
+
console.log('>> Version:', version);
|
|
278
279
|
console.log('>> Checking build archives...');
|
|
279
280
|
for (let machine of machines) {
|
|
280
281
|
let needed = false;
|
package/src/abi_arm32.cc
CHANGED
|
@@ -37,28 +37,9 @@ extern "C" uint64_t ForwardCallXGG(const void *func, uint8_t *sp);
|
|
|
37
37
|
extern "C" float ForwardCallXF(const void *func, uint8_t *sp);
|
|
38
38
|
extern "C" HfaRet ForwardCallXDDDD(const void *func, uint8_t *sp);
|
|
39
39
|
|
|
40
|
-
static bool IsHFA(const TypeInfo *type)
|
|
41
|
-
{
|
|
42
|
-
if (type->primitive != PrimitiveKind::Record)
|
|
43
|
-
return false;
|
|
44
|
-
|
|
45
|
-
if (type->members.len < 1 || type->members.len > 4)
|
|
46
|
-
return false;
|
|
47
|
-
if (type->members[0].type->primitive != PrimitiveKind::Float32 &&
|
|
48
|
-
type->members[0].type->primitive != PrimitiveKind::Float64)
|
|
49
|
-
return false;
|
|
50
|
-
|
|
51
|
-
for (Size i = 1; i < type->members.len; i++) {
|
|
52
|
-
if (type->members[i].type != type->members[0].type)
|
|
53
|
-
return false;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
return true;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
40
|
bool AnalyseFunction(InstanceData *, FunctionInfo *func)
|
|
60
41
|
{
|
|
61
|
-
if (IsHFA(func->ret.type)) {
|
|
42
|
+
if (IsHFA(func->ret.type, 1, 4)) {
|
|
62
43
|
func->ret.vec_count = func->ret.type->members.len *
|
|
63
44
|
(func->ret.type->members[0].type->size / 4);
|
|
64
45
|
} else if (func->ret.type->primitive != PrimitiveKind::Record ||
|
|
@@ -93,7 +74,6 @@ bool AnalyseFunction(InstanceData *, FunctionInfo *func)
|
|
|
93
74
|
started_stack = true;
|
|
94
75
|
}
|
|
95
76
|
} break;
|
|
96
|
-
|
|
97
77
|
case PrimitiveKind::Int64:
|
|
98
78
|
case PrimitiveKind::UInt64: {
|
|
99
79
|
if (gpr_avail >= 2) {
|
|
@@ -103,31 +83,8 @@ bool AnalyseFunction(InstanceData *, FunctionInfo *func)
|
|
|
103
83
|
started_stack = true;
|
|
104
84
|
}
|
|
105
85
|
} break;
|
|
106
|
-
|
|
107
|
-
case PrimitiveKind::Float32:
|
|
108
|
-
case PrimitiveKind::Float64: {
|
|
109
|
-
Size need = param.type->size / 4;
|
|
110
|
-
bool vfp = !param.variadic;
|
|
111
|
-
|
|
112
|
-
if (vfp) {
|
|
113
|
-
if (need <= vec_avail) {
|
|
114
|
-
param.vec_count = need;
|
|
115
|
-
vec_avail -= need;
|
|
116
|
-
} else {
|
|
117
|
-
started_stack = true;
|
|
118
|
-
}
|
|
119
|
-
} else {
|
|
120
|
-
if (need <= gpr_avail) {
|
|
121
|
-
param.gpr_count = need;
|
|
122
|
-
gpr_avail -= need;
|
|
123
|
-
} else {
|
|
124
|
-
started_stack = true;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
} break;
|
|
128
|
-
|
|
129
86
|
case PrimitiveKind::Record: {
|
|
130
|
-
if (IsHFA(param.type)) {
|
|
87
|
+
if (IsHFA(param.type, 1, 4)) {
|
|
131
88
|
int vec_count = (int)(param.type->members.len *
|
|
132
89
|
param.type->members[0].type->size / 4);
|
|
133
90
|
|
|
@@ -152,6 +109,28 @@ bool AnalyseFunction(InstanceData *, FunctionInfo *func)
|
|
|
152
109
|
}
|
|
153
110
|
}
|
|
154
111
|
} break;
|
|
112
|
+
case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
|
|
113
|
+
case PrimitiveKind::Float32:
|
|
114
|
+
case PrimitiveKind::Float64: {
|
|
115
|
+
Size need = param.type->size / 4;
|
|
116
|
+
bool vfp = !param.variadic;
|
|
117
|
+
|
|
118
|
+
if (vfp) {
|
|
119
|
+
if (need <= vec_avail) {
|
|
120
|
+
param.vec_count = need;
|
|
121
|
+
vec_avail -= need;
|
|
122
|
+
} else {
|
|
123
|
+
started_stack = true;
|
|
124
|
+
}
|
|
125
|
+
} else {
|
|
126
|
+
if (need <= gpr_avail) {
|
|
127
|
+
param.gpr_count = need;
|
|
128
|
+
gpr_avail -= need;
|
|
129
|
+
} else {
|
|
130
|
+
started_stack = true;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
} break;
|
|
155
134
|
}
|
|
156
135
|
|
|
157
136
|
func->args_size += AlignLen(param.type->size, 16);
|
|
@@ -354,6 +333,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
354
333
|
args_ptr += AlignLen(param.type->size, 4);
|
|
355
334
|
}
|
|
356
335
|
} break;
|
|
336
|
+
case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
|
|
357
337
|
case PrimitiveKind::Float32: {
|
|
358
338
|
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
359
339
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
@@ -432,6 +412,7 @@ void CallData::Execute()
|
|
|
432
412
|
result.u64 = PERFORM_CALL(GG);
|
|
433
413
|
}
|
|
434
414
|
} break;
|
|
415
|
+
case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
|
|
435
416
|
case PrimitiveKind::Float32: { result.f = PERFORM_CALL(F); } break;
|
|
436
417
|
case PrimitiveKind::Float64: { result.d = PERFORM_CALL(DDDD).d0; } break;
|
|
437
418
|
}
|
|
@@ -472,6 +453,7 @@ Napi::Value CallData::Complete()
|
|
|
472
453
|
Napi::Object obj = PopObject(ptr, func->ret.type);
|
|
473
454
|
return obj;
|
|
474
455
|
} break;
|
|
456
|
+
case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
|
|
475
457
|
case PrimitiveKind::Float32: return Napi::Number::New(env, (double)result.f);
|
|
476
458
|
case PrimitiveKind::Float64: return Napi::Number::New(env, result.d);
|
|
477
459
|
}
|
package/src/abi_arm64.cc
CHANGED
|
@@ -41,28 +41,9 @@ extern "C" X0X1Ret ForwardCallXGG(const void *func, uint8_t *sp);
|
|
|
41
41
|
extern "C" float ForwardCallXF(const void *func, uint8_t *sp);
|
|
42
42
|
extern "C" HfaRet ForwardCallXDDDD(const void *func, uint8_t *sp);
|
|
43
43
|
|
|
44
|
-
static bool IsHFA(const TypeInfo *type)
|
|
45
|
-
{
|
|
46
|
-
if (type->primitive != PrimitiveKind::Record)
|
|
47
|
-
return false;
|
|
48
|
-
|
|
49
|
-
if (type->members.len < 1 || type->members.len > 4)
|
|
50
|
-
return false;
|
|
51
|
-
if (type->members[0].type->primitive != PrimitiveKind::Float32 &&
|
|
52
|
-
type->members[0].type->primitive != PrimitiveKind::Float64)
|
|
53
|
-
return false;
|
|
54
|
-
|
|
55
|
-
for (Size i = 1; i < type->members.len; i++) {
|
|
56
|
-
if (type->members[i].type != type->members[0].type)
|
|
57
|
-
return false;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return true;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
44
|
bool AnalyseFunction(InstanceData *, FunctionInfo *func)
|
|
64
45
|
{
|
|
65
|
-
if (IsHFA(func->ret.type)) {
|
|
46
|
+
if (IsHFA(func->ret.type, 1, 4)) {
|
|
66
47
|
func->ret.vec_count = func->ret.type->members.len;
|
|
67
48
|
} else if (func->ret.type->size <= 16) {
|
|
68
49
|
func->ret.gpr_count = (func->ret.type->size + 7) / 8;
|
|
@@ -99,20 +80,6 @@ bool AnalyseFunction(InstanceData *, FunctionInfo *func)
|
|
|
99
80
|
gpr_avail--;
|
|
100
81
|
}
|
|
101
82
|
} break;
|
|
102
|
-
|
|
103
|
-
case PrimitiveKind::Float32:
|
|
104
|
-
case PrimitiveKind::Float64: {
|
|
105
|
-
#ifdef __APPLE__
|
|
106
|
-
if (param.variadic)
|
|
107
|
-
break;
|
|
108
|
-
#endif
|
|
109
|
-
|
|
110
|
-
if (vec_avail) {
|
|
111
|
-
param.vec_count = 1;
|
|
112
|
-
vec_avail--;
|
|
113
|
-
}
|
|
114
|
-
} break;
|
|
115
|
-
|
|
116
83
|
case PrimitiveKind::Record: {
|
|
117
84
|
#ifdef __APPLE__
|
|
118
85
|
if (param.variadic) {
|
|
@@ -121,7 +88,7 @@ bool AnalyseFunction(InstanceData *, FunctionInfo *func)
|
|
|
121
88
|
}
|
|
122
89
|
#endif
|
|
123
90
|
|
|
124
|
-
if (IsHFA(param.type)) {
|
|
91
|
+
if (IsHFA(param.type, 1, 4)) {
|
|
125
92
|
int vec_count = (int)param.type->members.len;
|
|
126
93
|
|
|
127
94
|
if (vec_count <= vec_avail) {
|
|
@@ -148,6 +115,19 @@ bool AnalyseFunction(InstanceData *, FunctionInfo *func)
|
|
|
148
115
|
param.use_memory = true;
|
|
149
116
|
}
|
|
150
117
|
} break;
|
|
118
|
+
case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
|
|
119
|
+
case PrimitiveKind::Float32:
|
|
120
|
+
case PrimitiveKind::Float64: {
|
|
121
|
+
#ifdef __APPLE__
|
|
122
|
+
if (param.variadic)
|
|
123
|
+
break;
|
|
124
|
+
#endif
|
|
125
|
+
|
|
126
|
+
if (vec_avail) {
|
|
127
|
+
param.vec_count = 1;
|
|
128
|
+
vec_avail--;
|
|
129
|
+
}
|
|
130
|
+
} break;
|
|
151
131
|
}
|
|
152
132
|
}
|
|
153
133
|
|
|
@@ -157,62 +137,6 @@ bool AnalyseFunction(InstanceData *, FunctionInfo *func)
|
|
|
157
137
|
return true;
|
|
158
138
|
}
|
|
159
139
|
|
|
160
|
-
static bool PushHFA(const Napi::Object &obj, const TypeInfo *type, uint8_t *dest)
|
|
161
|
-
{
|
|
162
|
-
Napi::Env env = obj.Env();
|
|
163
|
-
InstanceData *instance = env.GetInstanceData<InstanceData>();
|
|
164
|
-
|
|
165
|
-
RG_ASSERT(IsObject(obj));
|
|
166
|
-
RG_ASSERT(IsHFA(type));
|
|
167
|
-
RG_ASSERT(type->primitive == PrimitiveKind::Record);
|
|
168
|
-
RG_ASSERT(AlignUp(dest, type->members[0].type->size) == dest);
|
|
169
|
-
|
|
170
|
-
bool float32 = (type->members[0].type->primitive == PrimitiveKind::Float32);
|
|
171
|
-
|
|
172
|
-
for (const RecordMember &member: type->members) {
|
|
173
|
-
Napi::Value value = obj.Get(member.name);
|
|
174
|
-
|
|
175
|
-
if (!value.IsNumber() && !value.IsBigInt()) {
|
|
176
|
-
ThrowError<Napi::TypeError>(env, "Unexpected value %1 for member '%2', expected number", GetValueType(instance, value), member.name);
|
|
177
|
-
return false;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
if (float32) {
|
|
181
|
-
*(float *)dest = CopyNumber<float>(value);
|
|
182
|
-
} else {
|
|
183
|
-
*(double *)dest = CopyNumber<double>(value);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
dest += 8;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
return true;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
static Napi::Object PopHFA(napi_env env, const uint8_t *ptr, const TypeInfo *type)
|
|
193
|
-
{
|
|
194
|
-
RG_ASSERT(type->primitive == PrimitiveKind::Record);
|
|
195
|
-
RG_ASSERT(IsHFA(type));
|
|
196
|
-
|
|
197
|
-
Napi::Object obj = Napi::Object::New(env);
|
|
198
|
-
|
|
199
|
-
bool float32 = (type->members[0].type->primitive == PrimitiveKind::Float32);
|
|
200
|
-
|
|
201
|
-
for (const RecordMember &member: type->members) {
|
|
202
|
-
if (float32) {
|
|
203
|
-
float f = *(float *)ptr;
|
|
204
|
-
obj.Set(member.name, Napi::Number::New(env, (double)f));
|
|
205
|
-
} else {
|
|
206
|
-
double d = *(double *)ptr;
|
|
207
|
-
obj.Set(member.name, Napi::Number::New(env, d));
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
ptr += 8;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
return obj;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
140
|
bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
217
141
|
{
|
|
218
142
|
uint8_t *args_ptr = nullptr;
|
|
@@ -288,42 +212,6 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
288
212
|
#endif
|
|
289
213
|
}
|
|
290
214
|
} break;
|
|
291
|
-
case PrimitiveKind::Float32: {
|
|
292
|
-
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
293
|
-
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
294
|
-
return false;
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
float f = CopyNumber<float>(value);
|
|
298
|
-
|
|
299
|
-
if (RG_LIKELY(param.vec_count)) {
|
|
300
|
-
memcpy(vec_ptr++, &f, 4);
|
|
301
|
-
} else {
|
|
302
|
-
args_ptr = AlignUp(args_ptr, 4);
|
|
303
|
-
memcpy(args_ptr, &f, 4);
|
|
304
|
-
#ifdef __APPLE__
|
|
305
|
-
args_ptr += 4;
|
|
306
|
-
#else
|
|
307
|
-
args_ptr += 8;
|
|
308
|
-
#endif
|
|
309
|
-
}
|
|
310
|
-
} break;
|
|
311
|
-
case PrimitiveKind::Float64: {
|
|
312
|
-
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
313
|
-
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
314
|
-
return false;
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
double d = CopyNumber<double>(value);
|
|
318
|
-
|
|
319
|
-
if (RG_LIKELY(param.vec_count)) {
|
|
320
|
-
memcpy(vec_ptr++, &d, 8);
|
|
321
|
-
} else {
|
|
322
|
-
args_ptr = AlignUp(args_ptr, 8);
|
|
323
|
-
memcpy(args_ptr, &d, 8);
|
|
324
|
-
args_ptr += 8;
|
|
325
|
-
}
|
|
326
|
-
} break;
|
|
327
215
|
case PrimitiveKind::String: {
|
|
328
216
|
const char *str;
|
|
329
217
|
if (RG_LIKELY(value.IsString())) {
|
|
@@ -405,7 +293,6 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
405
293
|
args_ptr += 8;
|
|
406
294
|
}
|
|
407
295
|
} break;
|
|
408
|
-
|
|
409
296
|
case PrimitiveKind::Record: {
|
|
410
297
|
if (RG_UNLIKELY(!IsObject(value))) {
|
|
411
298
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected object", GetValueType(instance, value), i + 1);
|
|
@@ -414,8 +301,8 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
414
301
|
|
|
415
302
|
Napi::Object obj = value.As<Napi::Object>();
|
|
416
303
|
|
|
417
|
-
if (param.vec_count) {
|
|
418
|
-
if (!
|
|
304
|
+
if (param.vec_count) { // HFA
|
|
305
|
+
if (!PushObject(obj, param.type, (uint8_t *)vec_ptr, 8))
|
|
419
306
|
return false;
|
|
420
307
|
vec_ptr += param.vec_count;
|
|
421
308
|
} else if (!param.use_memory) {
|
|
@@ -451,6 +338,43 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
451
338
|
return false;
|
|
452
339
|
}
|
|
453
340
|
} break;
|
|
341
|
+
case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
|
|
342
|
+
case PrimitiveKind::Float32: {
|
|
343
|
+
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
344
|
+
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
345
|
+
return false;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
float f = CopyNumber<float>(value);
|
|
349
|
+
|
|
350
|
+
if (RG_LIKELY(param.vec_count)) {
|
|
351
|
+
memcpy(vec_ptr++, &f, 4);
|
|
352
|
+
} else {
|
|
353
|
+
args_ptr = AlignUp(args_ptr, 4);
|
|
354
|
+
memcpy(args_ptr, &f, 4);
|
|
355
|
+
#ifdef __APPLE__
|
|
356
|
+
args_ptr += 4;
|
|
357
|
+
#else
|
|
358
|
+
args_ptr += 8;
|
|
359
|
+
#endif
|
|
360
|
+
}
|
|
361
|
+
} break;
|
|
362
|
+
case PrimitiveKind::Float64: {
|
|
363
|
+
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
364
|
+
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
365
|
+
return false;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
double d = CopyNumber<double>(value);
|
|
369
|
+
|
|
370
|
+
if (RG_LIKELY(param.vec_count)) {
|
|
371
|
+
memcpy(vec_ptr++, &d, 8);
|
|
372
|
+
} else {
|
|
373
|
+
args_ptr = AlignUp(args_ptr, 8);
|
|
374
|
+
memcpy(args_ptr, &d, 8);
|
|
375
|
+
args_ptr += 8;
|
|
376
|
+
}
|
|
377
|
+
} break;
|
|
454
378
|
}
|
|
455
379
|
}
|
|
456
380
|
|
|
@@ -495,6 +419,7 @@ void CallData::Execute()
|
|
|
495
419
|
PERFORM_CALL(GG);
|
|
496
420
|
}
|
|
497
421
|
} break;
|
|
422
|
+
case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
|
|
498
423
|
case PrimitiveKind::Float32: { result.f = PERFORM_CALL(F); } break;
|
|
499
424
|
case PrimitiveKind::Float64: { result.d = PERFORM_CALL(DDDD).d0; } break;
|
|
500
425
|
}
|
|
@@ -529,8 +454,8 @@ Napi::Value CallData::Complete()
|
|
|
529
454
|
return external;
|
|
530
455
|
} break;
|
|
531
456
|
case PrimitiveKind::Record: {
|
|
532
|
-
if (func->ret.vec_count) {
|
|
533
|
-
Napi::Object obj =
|
|
457
|
+
if (func->ret.vec_count) { // HFA
|
|
458
|
+
Napi::Object obj = PopObject((const uint8_t *)&result.buf, func->ret.type, 8);
|
|
534
459
|
return obj;
|
|
535
460
|
} else {
|
|
536
461
|
const uint8_t *ptr = return_ptr ? (const uint8_t *)return_ptr
|
|
@@ -540,6 +465,7 @@ Napi::Value CallData::Complete()
|
|
|
540
465
|
return obj;
|
|
541
466
|
}
|
|
542
467
|
} break;
|
|
468
|
+
case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
|
|
543
469
|
case PrimitiveKind::Float32: return Napi::Number::New(env, (double)result.f);
|
|
544
470
|
case PrimitiveKind::Float64: return Napi::Number::New(env, result.d);
|
|
545
471
|
}
|
package/src/abi_x64_sysv.cc
CHANGED
|
@@ -98,13 +98,6 @@ static Size ClassifyType(const TypeInfo *type, Size offset, Span<RegisterClass>
|
|
|
98
98
|
classes[0] = MergeClasses(classes[0], RegisterClass::Integer);
|
|
99
99
|
return 1;
|
|
100
100
|
} break;
|
|
101
|
-
|
|
102
|
-
case PrimitiveKind::Float32:
|
|
103
|
-
case PrimitiveKind::Float64: {
|
|
104
|
-
classes[0] = MergeClasses(classes[0], RegisterClass::SSE);
|
|
105
|
-
return 1;
|
|
106
|
-
} break;
|
|
107
|
-
|
|
108
101
|
case PrimitiveKind::Record: {
|
|
109
102
|
if (type->size > 64) {
|
|
110
103
|
classes[0] = MergeClasses(classes[0], RegisterClass::Memory);
|
|
@@ -119,6 +112,27 @@ static Size ClassifyType(const TypeInfo *type, Size offset, Span<RegisterClass>
|
|
|
119
112
|
|
|
120
113
|
return (offset + 7) / 8;
|
|
121
114
|
} break;
|
|
115
|
+
case PrimitiveKind::Array: {
|
|
116
|
+
if (type->size > 64) {
|
|
117
|
+
classes[0] = MergeClasses(classes[0], RegisterClass::Memory);
|
|
118
|
+
return 1;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
Size len = type->size / type->ref->size;
|
|
122
|
+
|
|
123
|
+
for (Size i = 0; i < len; i++) {
|
|
124
|
+
Size start = offset / 8;
|
|
125
|
+
ClassifyType(type->ref, offset % 8, classes.Take(start, classes.len - start));
|
|
126
|
+
offset += type->ref->size;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return (offset + 7) / 8;
|
|
130
|
+
} break;
|
|
131
|
+
case PrimitiveKind::Float32:
|
|
132
|
+
case PrimitiveKind::Float64: {
|
|
133
|
+
classes[0] = MergeClasses(classes[0], RegisterClass::SSE);
|
|
134
|
+
return 1;
|
|
135
|
+
} break;
|
|
122
136
|
}
|
|
123
137
|
|
|
124
138
|
RG_UNREACHABLE();
|
|
@@ -370,6 +384,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
370
384
|
args_ptr += AlignLen(param.type->size, 8);
|
|
371
385
|
}
|
|
372
386
|
} break;
|
|
387
|
+
case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
|
|
373
388
|
case PrimitiveKind::Float32: {
|
|
374
389
|
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
375
390
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
@@ -450,6 +465,7 @@ void CallData::Execute()
|
|
|
450
465
|
memcpy_safe(&result.buf, &ret, RG_SIZE(ret));
|
|
451
466
|
}
|
|
452
467
|
} break;
|
|
468
|
+
case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
|
|
453
469
|
case PrimitiveKind::Float32: { result.f = PERFORM_CALL(F); } break;
|
|
454
470
|
case PrimitiveKind::Float64: { result.d = PERFORM_CALL(DG).xmm0; } break;
|
|
455
471
|
}
|
|
@@ -490,6 +506,7 @@ Napi::Value CallData::Complete()
|
|
|
490
506
|
Napi::Object obj = PopObject(ptr, func->ret.type);
|
|
491
507
|
return obj;
|
|
492
508
|
} break;
|
|
509
|
+
case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
|
|
493
510
|
case PrimitiveKind::Float32: return Napi::Number::New(env, (double)result.f);
|
|
494
511
|
case PrimitiveKind::Float64: return Napi::Number::New(env, result.d);
|
|
495
512
|
}
|
package/src/abi_x64_win.cc
CHANGED
|
@@ -182,6 +182,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
182
182
|
if (!PushObject(obj, param.type, ptr))
|
|
183
183
|
return false;
|
|
184
184
|
} break;
|
|
185
|
+
case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
|
|
185
186
|
case PrimitiveKind::Float32: {
|
|
186
187
|
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
187
188
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
@@ -233,6 +234,7 @@ void CallData::Execute()
|
|
|
233
234
|
case PrimitiveKind::String16:
|
|
234
235
|
case PrimitiveKind::Pointer:
|
|
235
236
|
case PrimitiveKind::Record: { result.u64 = PERFORM_CALL(G); } break;
|
|
237
|
+
case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
|
|
236
238
|
case PrimitiveKind::Float32: { result.f = PERFORM_CALL(F); } break;
|
|
237
239
|
case PrimitiveKind::Float64: { result.d = PERFORM_CALL(D); } break;
|
|
238
240
|
}
|
|
@@ -273,6 +275,7 @@ Napi::Value CallData::Complete()
|
|
|
273
275
|
Napi::Object obj = PopObject(ptr, func->ret.type);
|
|
274
276
|
return obj;
|
|
275
277
|
} break;
|
|
278
|
+
case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
|
|
276
279
|
case PrimitiveKind::Float32: return Napi::Number::New(env, (double)result.f);
|
|
277
280
|
case PrimitiveKind::Float64: return Napi::Number::New(env, result.d);
|
|
278
281
|
}
|
package/src/abi_x86.cc
CHANGED
|
@@ -226,6 +226,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
226
226
|
args_ptr = (uint32_t *)AlignUp(ptr + param.type->size, 4);
|
|
227
227
|
}
|
|
228
228
|
} break;
|
|
229
|
+
case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
|
|
229
230
|
case PrimitiveKind::Float32: {
|
|
230
231
|
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
231
232
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
@@ -279,6 +280,7 @@ void CallData::Execute()
|
|
|
279
280
|
case PrimitiveKind::String16:
|
|
280
281
|
case PrimitiveKind::Pointer:
|
|
281
282
|
case PrimitiveKind::Record: { result.u64 = PERFORM_CALL(G); } break;
|
|
283
|
+
case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
|
|
282
284
|
case PrimitiveKind::Float32: { result.f = PERFORM_CALL(F); } break;
|
|
283
285
|
case PrimitiveKind::Float64: { result.d = PERFORM_CALL(D); } break;
|
|
284
286
|
}
|
|
@@ -319,6 +321,7 @@ Napi::Value CallData::Complete()
|
|
|
319
321
|
Napi::Object obj = PopObject(ptr, func->ret.type);
|
|
320
322
|
return obj;
|
|
321
323
|
} break;
|
|
324
|
+
case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
|
|
322
325
|
case PrimitiveKind::Float32: return Napi::Number::New(env, (double)result.f);
|
|
323
326
|
case PrimitiveKind::Float64: return Napi::Number::New(env, result.d);
|
|
324
327
|
}
|