koffi 1.0.3 → 1.1.0-beta.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/README.md +48 -22
- 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/package.json +1 -1
- package/qemu/qemu.js +11 -5
- package/qemu/registry/machines.json +20 -10
- package/src/abi_arm32.cc +130 -215
- package/src/abi_arm64.cc +103 -117
- package/src/abi_x64_sysv.cc +117 -135
- package/src/abi_x64_win.cc +89 -98
- package/src/abi_x86.cc +91 -99
- package/src/call.cc +164 -40
- package/src/call.hh +53 -31
- package/src/ffi.cc +163 -19
- package/src/ffi.hh +30 -22
- package/src/util.cc +0 -127
- package/src/util.hh +0 -16
- package/test/misc.c +68 -2
- package/vendor/libcc/libcc.hh +1 -1
- package/build/qemu/1.0.3/koffi_darwin_x64.tar.gz +0 -0
- package/build/qemu/1.0.3/koffi_freebsd_arm64.tar.gz +0 -0
- package/build/qemu/1.0.3/koffi_freebsd_ia32.tar.gz +0 -0
- package/build/qemu/1.0.3/koffi_freebsd_x64.tar.gz +0 -0
- package/build/qemu/1.0.3/koffi_linux_arm.tar.gz +0 -0
- package/build/qemu/1.0.3/koffi_linux_arm64.tar.gz +0 -0
- package/build/qemu/1.0.3/koffi_linux_ia32.tar.gz +0 -0
- package/build/qemu/1.0.3/koffi_linux_x64.tar.gz +0 -0
- package/build/qemu/1.0.3/koffi_win32_ia32.tar.gz +0 -0
- package/build/qemu/1.0.3/koffi_win32_x64.tar.gz +0 -0
- package/test/misc.js +0 -180
- package/vendor/node-addon-api/CODE_OF_CONDUCT.md +0 -4
- package/vendor/node-addon-api/CONTRIBUTING.md +0 -93
- 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 -217
- 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 -91
- package/vendor/node-addon-api/benchmark/property_descriptor.js +0 -37
- 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 -155
- 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 -427
- package/vendor/node-addon-api/doc/async_worker_variants.md +0 -557
- 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 -150
- 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 -68
- package/vendor/node-addon-api/doc/conversion-tool.md +0 -28
- package/vendor/node-addon-api/doc/creating_a_release.md +0 -62
- 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 -196
- package/vendor/node-addon-api/doc/error.md +0 -120
- package/vendor/node-addon-api/doc/error_handling.md +0 -254
- package/vendor/node-addon-api/doc/escapable_handle_scope.md +0 -80
- package/vendor/node-addon-api/doc/external.md +0 -63
- 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 -63
- package/vendor/node-addon-api/doc/hierarchy.md +0 -91
- 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 -588
- package/vendor/node-addon-api/doc/prebuild_tools.md +0 -16
- package/vendor/node-addon-api/doc/promises.md +0 -79
- 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 -110
- 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/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/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 -340
- package/vendor/node-addon-api/doc/version_management.md +0 -43
- package/vendor/node-addon-api/package.json +0 -415
- package/vendor/node-addon-api/test/README.md +0 -91
- package/vendor/node-addon-api/test/addon.cc +0 -36
- package/vendor/node-addon-api/test/addon.js +0 -11
- package/vendor/node-addon-api/test/addon_build/index.js +0 -49
- package/vendor/node-addon-api/test/addon_build/tpl/addon.cc +0 -17
- package/vendor/node-addon-api/test/addon_build/tpl/binding.gyp +0 -62
- 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 -99
- package/vendor/node-addon-api/test/addon_data.js +0 -46
- package/vendor/node-addon-api/test/array_buffer.cc +0 -243
- package/vendor/node-addon-api/test/array_buffer.js +0 -69
- 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 -83
- package/vendor/node-addon-api/test/async_progress_queue_worker.js +0 -46
- package/vendor/node-addon-api/test/async_progress_worker.cc +0 -134
- package/vendor/node-addon-api/test/async_progress_worker.js +0 -61
- package/vendor/node-addon-api/test/async_worker.cc +0 -106
- package/vendor/node-addon-api/test/async_worker.js +0 -179
- package/vendor/node-addon-api/test/async_worker_nocallback.js +0 -13
- 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 -35
- package/vendor/node-addon-api/test/basic_types/boolean.cc +0 -38
- package/vendor/node-addon-api/test/basic_types/boolean.js +0 -35
- package/vendor/node-addon-api/test/basic_types/number.cc +0 -99
- package/vendor/node-addon-api/test/basic_types/number.js +0 -114
- package/vendor/node-addon-api/test/basic_types/value.cc +0 -120
- package/vendor/node-addon-api/test/basic_types/value.js +0 -133
- 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 -173
- package/vendor/node-addon-api/test/binding.gyp +0 -124
- package/vendor/node-addon-api/test/buffer.cc +0 -183
- package/vendor/node-addon-api/test/buffer.js +0 -69
- package/vendor/node-addon-api/test/callbackscope.cc +0 -22
- package/vendor/node-addon-api/test/callbackscope.js +0 -49
- package/vendor/node-addon-api/test/common/index.js +0 -114
- 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 -90
- package/vendor/node-addon-api/test/date.cc +0 -44
- package/vendor/node-addon-api/test/date.js +0 -18
- package/vendor/node-addon-api/test/env_cleanup.cc +0 -88
- package/vendor/node-addon-api/test/env_cleanup.js +0 -56
- package/vendor/node-addon-api/test/error.cc +0 -287
- package/vendor/node-addon-api/test/error.js +0 -81
- 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 -95
- package/vendor/node-addon-api/test/external.cc +0 -81
- package/vendor/node-addon-api/test/external.js +0 -88
- package/vendor/node-addon-api/test/function.cc +0 -324
- package/vendor/node-addon-api/test/function.js +0 -133
- package/vendor/node-addon-api/test/function_reference.cc +0 -202
- 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 -61
- 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 -57
- 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 -48
- 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 -58
- package/vendor/node-addon-api/test/handlescope.cc +0 -60
- package/vendor/node-addon-api/test/handlescope.js +0 -14
- package/vendor/node-addon-api/test/index.js +0 -159
- package/vendor/node-addon-api/test/maybe/check.cc +0 -23
- package/vendor/node-addon-api/test/maybe/index.js +0 -38
- package/vendor/node-addon-api/test/memory_management.cc +0 -17
- 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 -108
- 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 -29
- 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 -350
- package/vendor/node-addon-api/test/object/object.js +0 -217
- package/vendor/node-addon-api/test/object/object_deprecated.cc +0 -66
- package/vendor/node-addon-api/test/object/object_deprecated.js +0 -47
- 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 -219
- package/vendor/node-addon-api/test/object_reference.js +0 -259
- package/vendor/node-addon-api/test/objectwrap.cc +0 -268
- package/vendor/node-addon-api/test/objectwrap.js +0 -284
- 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 -45
- package/vendor/node-addon-api/test/objectwrap_function.js +0 -22
- 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 -40
- package/vendor/node-addon-api/test/objectwrap_worker_thread.js +0 -19
- package/vendor/node-addon-api/test/promise.cc +0 -29
- package/vendor/node-addon-api/test/promise.js +0 -18
- package/vendor/node-addon-api/test/reference.cc +0 -24
- package/vendor/node-addon-api/test/reference.js +0 -14
- 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 -73
- package/vendor/node-addon-api/test/testUtil.js +0 -54
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.cc +0 -195
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.js +0 -188
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.cc +0 -63
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.js +0 -12
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.cc +0 -115
- 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 -26
- 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 -225
- 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 -42
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.js +0 -53
- package/vendor/node-addon-api/test/thunking_manual.cc +0 -140
- package/vendor/node-addon-api/test/thunking_manual.js +0 -17
- 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 -68
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.js +0 -12
- 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 -28
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.js +0 -7
- 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 -53
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.js +0 -53
- package/vendor/node-addon-api/test/typedarray-bigint.js +0 -58
- package/vendor/node-addon-api/test/typedarray.cc +0 -216
- package/vendor/node-addon-api/test/typedarray.js +0 -69
- package/vendor/node-addon-api/test/version_management.cc +0 -27
- package/vendor/node-addon-api/test/version_management.js +0 -31
- 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/src/abi_x64_win.cc
CHANGED
|
@@ -51,28 +51,19 @@ bool AnalyseFunction(InstanceData *, FunctionInfo *func)
|
|
|
51
51
|
return true;
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
55
55
|
{
|
|
56
|
-
// Sanity checks
|
|
57
|
-
if (info.Length() < (uint32_t)func->parameters.len) {
|
|
58
|
-
ThrowError<Napi::TypeError>(env, "Expected %1 arguments, got %2", func->parameters.len, info.Length());
|
|
59
|
-
return env.Null();
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
uint8_t *return_ptr = nullptr;
|
|
63
56
|
uint64_t *args_ptr = nullptr;
|
|
64
57
|
|
|
65
58
|
// Pass return value in register or through memory
|
|
66
59
|
if (RG_UNLIKELY(!AllocStack(func->args_size, 16, &args_ptr)))
|
|
67
|
-
return
|
|
60
|
+
return false;
|
|
68
61
|
if (!func->ret.regular) {
|
|
69
62
|
if (RG_UNLIKELY(!AllocHeap(func->ret.type->size, 16, &return_ptr)))
|
|
70
|
-
return
|
|
63
|
+
return false;
|
|
71
64
|
*(uint8_t **)(args_ptr++) = return_ptr;
|
|
72
65
|
}
|
|
73
66
|
|
|
74
|
-
LocalArray<OutObject, MaxOutParameters> out_objects;
|
|
75
|
-
|
|
76
67
|
// Push arguments
|
|
77
68
|
for (Size i = 0; i < func->parameters.len; i++) {
|
|
78
69
|
const ParameterInfo ¶m = func->parameters[i];
|
|
@@ -86,7 +77,7 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
86
77
|
case PrimitiveKind::Bool: {
|
|
87
78
|
if (RG_UNLIKELY(!value.IsBoolean())) {
|
|
88
79
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected boolean", GetValueType(instance, value), i + 1);
|
|
89
|
-
return
|
|
80
|
+
return false;
|
|
90
81
|
}
|
|
91
82
|
|
|
92
83
|
bool b = value.As<Napi::Boolean>();
|
|
@@ -103,41 +94,23 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
103
94
|
case PrimitiveKind::UInt64: {
|
|
104
95
|
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
105
96
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
106
|
-
return
|
|
97
|
+
return false;
|
|
107
98
|
}
|
|
108
99
|
|
|
109
100
|
int64_t v = CopyNumber<int64_t>(value);
|
|
110
101
|
*(args_ptr++) = (uint64_t)v;
|
|
111
102
|
} break;
|
|
112
|
-
case PrimitiveKind::Float32: {
|
|
113
|
-
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
114
|
-
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
115
|
-
return env.Null();
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
float f = CopyNumber<float>(value);
|
|
119
|
-
*(float *)(args_ptr++) = f;
|
|
120
|
-
} break;
|
|
121
|
-
case PrimitiveKind::Float64: {
|
|
122
|
-
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
123
|
-
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
124
|
-
return env.Null();
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
double d = CopyNumber<double>(value);
|
|
128
|
-
*(double *)(args_ptr++) = d;
|
|
129
|
-
} break;
|
|
130
103
|
case PrimitiveKind::String: {
|
|
131
104
|
const char *str;
|
|
132
105
|
if (RG_LIKELY(value.IsString())) {
|
|
133
106
|
str = PushString(value);
|
|
134
107
|
if (RG_UNLIKELY(!str))
|
|
135
|
-
return
|
|
108
|
+
return false;
|
|
136
109
|
} else if (IsNullOrUndefined(value)) {
|
|
137
110
|
str = nullptr;
|
|
138
111
|
} else {
|
|
139
112
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected string", GetValueType(instance, value), i + 1);
|
|
140
|
-
return
|
|
113
|
+
return false;
|
|
141
114
|
}
|
|
142
115
|
|
|
143
116
|
*(const char **)(args_ptr++) = str;
|
|
@@ -147,12 +120,12 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
147
120
|
if (RG_LIKELY(value.IsString())) {
|
|
148
121
|
str16 = PushString16(value);
|
|
149
122
|
if (RG_UNLIKELY(!str16))
|
|
150
|
-
return
|
|
123
|
+
return false;
|
|
151
124
|
} else if (IsNullOrUndefined(value)) {
|
|
152
125
|
str16 = nullptr;
|
|
153
126
|
} else {
|
|
154
127
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected string", GetValueType(instance, value), i + 1);
|
|
155
|
-
return
|
|
128
|
+
return false;
|
|
156
129
|
}
|
|
157
130
|
|
|
158
131
|
*(const char16_t **)(args_ptr++) = str16;
|
|
@@ -166,32 +139,34 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
166
139
|
Napi::Object obj = value.As<Napi::Object>();
|
|
167
140
|
|
|
168
141
|
if (RG_UNLIKELY(!AllocHeap(param.type->ref->size, 16, &ptr)))
|
|
169
|
-
return
|
|
142
|
+
return false;
|
|
170
143
|
|
|
171
144
|
if (param.directions & 1) {
|
|
172
145
|
if (!PushObject(obj, param.type->ref, ptr))
|
|
173
|
-
return
|
|
146
|
+
return false;
|
|
174
147
|
} else {
|
|
175
148
|
memset(ptr, 0, param.type->size);
|
|
176
149
|
}
|
|
177
150
|
if (param.directions & 2) {
|
|
178
|
-
OutObject out =
|
|
179
|
-
|
|
151
|
+
OutObject *out = out_objects.AppendDefault();
|
|
152
|
+
|
|
153
|
+
out->ref.Reset(obj, 1);
|
|
154
|
+
out->ptr = ptr;
|
|
155
|
+
out->type = param.type->ref;
|
|
180
156
|
}
|
|
181
157
|
} else if (IsNullOrUndefined(value)) {
|
|
182
158
|
ptr = nullptr;
|
|
183
159
|
} else {
|
|
184
160
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected %3", GetValueType(instance, value), i + 1, param.type->name);
|
|
185
|
-
return
|
|
161
|
+
return false;
|
|
186
162
|
}
|
|
187
163
|
|
|
188
164
|
*(uint8_t **)(args_ptr++) = ptr;
|
|
189
165
|
} break;
|
|
190
|
-
|
|
191
166
|
case PrimitiveKind::Record: {
|
|
192
167
|
if (RG_UNLIKELY(!IsObject(value))) {
|
|
193
168
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected object", GetValueType(instance, value), i + 1);
|
|
194
|
-
return
|
|
169
|
+
return false;
|
|
195
170
|
}
|
|
196
171
|
|
|
197
172
|
uint8_t *ptr;
|
|
@@ -199,93 +174,109 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
199
174
|
ptr = (uint8_t *)(args_ptr++);
|
|
200
175
|
} else {
|
|
201
176
|
if (RG_UNLIKELY(!AllocHeap(param.type->size, 16, &ptr)))
|
|
202
|
-
return
|
|
177
|
+
return false;
|
|
203
178
|
*(uint8_t **)(args_ptr++) = ptr;
|
|
204
179
|
}
|
|
205
180
|
|
|
206
181
|
Napi::Object obj = value.As<Napi::Object>();
|
|
207
182
|
if (!PushObject(obj, param.type, ptr))
|
|
208
|
-
return
|
|
183
|
+
return false;
|
|
184
|
+
} break;
|
|
185
|
+
case PrimitiveKind::Float32: {
|
|
186
|
+
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
187
|
+
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
float f = CopyNumber<float>(value);
|
|
192
|
+
*(float *)(args_ptr++) = f;
|
|
193
|
+
} break;
|
|
194
|
+
case PrimitiveKind::Float64: {
|
|
195
|
+
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
196
|
+
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
double d = CopyNumber<double>(value);
|
|
201
|
+
*(double *)(args_ptr++) = d;
|
|
209
202
|
} break;
|
|
210
203
|
}
|
|
211
204
|
}
|
|
212
205
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
}
|
|
206
|
+
stack = MakeSpan(mem->stack.end(), old_stack_mem.end() - mem->stack.end());
|
|
207
|
+
heap = MakeSpan(old_heap_mem.ptr, mem->heap.ptr - old_heap_mem.ptr);
|
|
216
208
|
|
|
209
|
+
return true;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
void CallData::Execute()
|
|
213
|
+
{
|
|
217
214
|
#define PERFORM_CALL(Suffix) \
|
|
218
215
|
([&]() { \
|
|
219
|
-
auto ret = (func->forward_fp ? ForwardCallX ## Suffix(func->func,
|
|
220
|
-
: ForwardCall ## Suffix(func->func,
|
|
221
|
-
PopOutArguments(out_objects); \
|
|
216
|
+
auto ret = (func->forward_fp ? ForwardCallX ## Suffix(func->func, stack.ptr) \
|
|
217
|
+
: ForwardCall ## Suffix(func->func, stack.ptr)); \
|
|
222
218
|
return ret; \
|
|
223
219
|
})()
|
|
224
220
|
|
|
225
|
-
// Execute and convert return value
|
|
226
221
|
switch (func->ret.type->primitive) {
|
|
227
|
-
case PrimitiveKind::Void:
|
|
228
|
-
|
|
229
|
-
return env.Null();
|
|
230
|
-
} break;
|
|
231
|
-
case PrimitiveKind::Bool: {
|
|
232
|
-
uint64_t rax = PERFORM_CALL(G);
|
|
233
|
-
return Napi::Boolean::New(env, rax);
|
|
234
|
-
} break;
|
|
222
|
+
case PrimitiveKind::Void:
|
|
223
|
+
case PrimitiveKind::Bool:
|
|
235
224
|
case PrimitiveKind::Int8:
|
|
236
225
|
case PrimitiveKind::UInt8:
|
|
237
226
|
case PrimitiveKind::Int16:
|
|
238
227
|
case PrimitiveKind::UInt16:
|
|
239
228
|
case PrimitiveKind::Int32:
|
|
240
|
-
case PrimitiveKind::UInt32:
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
case PrimitiveKind::
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
} break;
|
|
248
|
-
case PrimitiveKind::
|
|
249
|
-
|
|
250
|
-
return Napi::BigInt::New(env, rax);
|
|
251
|
-
} break;
|
|
252
|
-
case PrimitiveKind::Float32: {
|
|
253
|
-
float f = PERFORM_CALL(F);
|
|
254
|
-
return Napi::Number::New(env, (double)f);
|
|
255
|
-
} break;
|
|
256
|
-
case PrimitiveKind::Float64: {
|
|
257
|
-
double d = PERFORM_CALL(D);
|
|
258
|
-
return Napi::Number::New(env, d);
|
|
259
|
-
} break;
|
|
260
|
-
case PrimitiveKind::String: {
|
|
261
|
-
uint64_t rax = PERFORM_CALL(G);
|
|
262
|
-
return Napi::String::New(env, (const char *)rax);
|
|
263
|
-
} break;
|
|
264
|
-
case PrimitiveKind::String16: {
|
|
265
|
-
uint64_t rax = PERFORM_CALL(G);
|
|
266
|
-
return Napi::String::New(env, (const char16_t *)rax);
|
|
267
|
-
} break;
|
|
268
|
-
case PrimitiveKind::Pointer: {
|
|
269
|
-
uint64_t rax = PERFORM_CALL(G);
|
|
270
|
-
void *ptr = (void *)rax;
|
|
229
|
+
case PrimitiveKind::UInt32:
|
|
230
|
+
case PrimitiveKind::Int64:
|
|
231
|
+
case PrimitiveKind::UInt64:
|
|
232
|
+
case PrimitiveKind::String:
|
|
233
|
+
case PrimitiveKind::String16:
|
|
234
|
+
case PrimitiveKind::Pointer:
|
|
235
|
+
case PrimitiveKind::Record: { result.u64 = PERFORM_CALL(G); } break;
|
|
236
|
+
case PrimitiveKind::Float32: { result.f = PERFORM_CALL(F); } break;
|
|
237
|
+
case PrimitiveKind::Float64: { result.d = PERFORM_CALL(D); } break;
|
|
238
|
+
}
|
|
271
239
|
|
|
272
|
-
|
|
240
|
+
#undef PERFORM_CALL
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
Napi::Value CallData::Complete()
|
|
244
|
+
{
|
|
245
|
+
for (const OutObject &out: out_objects) {
|
|
246
|
+
Napi::Object obj = out.ref.Value().As<Napi::Object>();
|
|
247
|
+
PopObject(obj, out.ptr, out.type);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
switch (func->ret.type->primitive) {
|
|
251
|
+
case PrimitiveKind::Void: return env.Null();
|
|
252
|
+
case PrimitiveKind::Bool: return Napi::Boolean::New(env, result.u32);
|
|
253
|
+
case PrimitiveKind::Int8:
|
|
254
|
+
case PrimitiveKind::UInt8:
|
|
255
|
+
case PrimitiveKind::Int16:
|
|
256
|
+
case PrimitiveKind::UInt16:
|
|
257
|
+
case PrimitiveKind::Int32:
|
|
258
|
+
case PrimitiveKind::UInt32: return Napi::Number::New(env, (double)result.u32);
|
|
259
|
+
case PrimitiveKind::Int64: return Napi::BigInt::New(env, (int64_t)result.u64);
|
|
260
|
+
case PrimitiveKind::UInt64: return Napi::BigInt::New(env, result.u64);
|
|
261
|
+
case PrimitiveKind::String: return Napi::String::New(env, (const char *)result.ptr);
|
|
262
|
+
case PrimitiveKind::String16: return Napi::String::New(env, (const char16_t *)result.ptr);
|
|
263
|
+
case PrimitiveKind::Pointer: {
|
|
264
|
+
Napi::External<void> external = Napi::External<void>::New(env, result.ptr);
|
|
273
265
|
SetValueTag(instance, external, func->ret.type);
|
|
274
266
|
|
|
275
267
|
return external;
|
|
276
268
|
} break;
|
|
277
|
-
|
|
278
269
|
case PrimitiveKind::Record: {
|
|
279
|
-
|
|
280
|
-
|
|
270
|
+
const uint8_t *ptr = return_ptr ? (const uint8_t *)return_ptr
|
|
271
|
+
: (const uint8_t *)&result.buf;
|
|
281
272
|
|
|
282
|
-
Napi::Object obj = PopObject(
|
|
273
|
+
Napi::Object obj = PopObject(ptr, func->ret.type);
|
|
283
274
|
return obj;
|
|
284
275
|
} break;
|
|
276
|
+
case PrimitiveKind::Float32: return Napi::Number::New(env, (double)result.f);
|
|
277
|
+
case PrimitiveKind::Float64: return Napi::Number::New(env, result.d);
|
|
285
278
|
}
|
|
286
279
|
|
|
287
|
-
#undef PERFORM_CALL
|
|
288
|
-
|
|
289
280
|
RG_UNREACHABLE();
|
|
290
281
|
}
|
|
291
282
|
|
package/src/abi_x86.cc
CHANGED
|
@@ -82,33 +82,24 @@ bool AnalyseFunction(InstanceData *instance, FunctionInfo *func)
|
|
|
82
82
|
return true;
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
-
|
|
85
|
+
bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
86
86
|
{
|
|
87
|
-
// Sanity checks
|
|
88
|
-
if (info.Length() < (uint32_t)func->parameters.len) {
|
|
89
|
-
ThrowError<Napi::TypeError>(env, "Expected %1 arguments, got %2", func->parameters.len, info.Length());
|
|
90
|
-
return env.Null();
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
uint8_t *return_ptr = nullptr;
|
|
94
87
|
uint32_t *args_ptr = nullptr;
|
|
95
88
|
uint32_t *fast_ptr = nullptr;
|
|
96
89
|
|
|
97
90
|
// Pass return value in register or through memory
|
|
98
91
|
if (RG_UNLIKELY(!AllocStack(func->args_size, 16, &args_ptr)))
|
|
99
|
-
return
|
|
92
|
+
return false;
|
|
100
93
|
if (func->convention == CallConvention::Fastcall) {
|
|
101
94
|
fast_ptr = args_ptr;
|
|
102
95
|
args_ptr += 4;
|
|
103
96
|
}
|
|
104
97
|
if (!func->ret.trivial) {
|
|
105
98
|
if (RG_UNLIKELY(!AllocHeap(func->ret.type->size, 16, &return_ptr)))
|
|
106
|
-
return
|
|
99
|
+
return false;
|
|
107
100
|
*((func->ret.fast ? fast_ptr : args_ptr)++) = (uint32_t)return_ptr;
|
|
108
101
|
}
|
|
109
102
|
|
|
110
|
-
LocalArray<OutObject, MaxOutParameters> out_objects;
|
|
111
|
-
|
|
112
103
|
// Push arguments
|
|
113
104
|
for (Size i = 0; i < func->parameters.len; i++) {
|
|
114
105
|
const ParameterInfo ¶m = func->parameters[i];
|
|
@@ -122,7 +113,7 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
122
113
|
case PrimitiveKind::Bool: {
|
|
123
114
|
if (RG_UNLIKELY(!value.IsBoolean())) {
|
|
124
115
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected boolean", GetValueType(instance, value), i + 1);
|
|
125
|
-
return
|
|
116
|
+
return false;
|
|
126
117
|
}
|
|
127
118
|
|
|
128
119
|
bool b = value.As<Napi::Boolean>();
|
|
@@ -136,7 +127,7 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
136
127
|
case PrimitiveKind::UInt32: {
|
|
137
128
|
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
138
129
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
139
|
-
return
|
|
130
|
+
return false;
|
|
140
131
|
}
|
|
141
132
|
|
|
142
133
|
int32_t v = CopyNumber<int32_t>(value);
|
|
@@ -146,43 +137,24 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
146
137
|
case PrimitiveKind::UInt64: {
|
|
147
138
|
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
148
139
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
149
|
-
return
|
|
140
|
+
return false;
|
|
150
141
|
}
|
|
151
142
|
|
|
152
143
|
int64_t v = CopyNumber<int64_t>(value);
|
|
153
144
|
*(uint64_t *)args_ptr = (uint64_t)v;
|
|
154
145
|
args_ptr += 2;
|
|
155
146
|
} break;
|
|
156
|
-
case PrimitiveKind::Float32: {
|
|
157
|
-
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
158
|
-
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
159
|
-
return env.Null();
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
float f = CopyNumber<float>(value);
|
|
163
|
-
*(float *)((param.fast ? fast_ptr : args_ptr)++) = f;
|
|
164
|
-
} break;
|
|
165
|
-
case PrimitiveKind::Float64: {
|
|
166
|
-
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
167
|
-
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
168
|
-
return env.Null();
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
double d = CopyNumber<double>(value);
|
|
172
|
-
*(double *)args_ptr = d;
|
|
173
|
-
args_ptr += 2;
|
|
174
|
-
} break;
|
|
175
147
|
case PrimitiveKind::String: {
|
|
176
148
|
const char *str;
|
|
177
149
|
if (RG_LIKELY(value.IsString())) {
|
|
178
150
|
str = PushString(value);
|
|
179
151
|
if (RG_UNLIKELY(!str))
|
|
180
|
-
return
|
|
152
|
+
return false;
|
|
181
153
|
} else if (IsNullOrUndefined(value)) {
|
|
182
154
|
str = nullptr;
|
|
183
155
|
} else {
|
|
184
156
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected string", GetValueType(instance, value), i + 1);
|
|
185
|
-
return
|
|
157
|
+
return false;
|
|
186
158
|
}
|
|
187
159
|
|
|
188
160
|
*(const char **)((param.fast ? fast_ptr : args_ptr)++) = str;
|
|
@@ -192,12 +164,12 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
192
164
|
if (RG_LIKELY(value.IsString())) {
|
|
193
165
|
str16 = PushString16(value);
|
|
194
166
|
if (RG_UNLIKELY(!str16))
|
|
195
|
-
return
|
|
167
|
+
return false;
|
|
196
168
|
} else if (IsNullOrUndefined(value)) {
|
|
197
169
|
str16 = nullptr;
|
|
198
170
|
} else {
|
|
199
171
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected string", GetValueType(instance, value), i + 1);
|
|
200
|
-
return
|
|
172
|
+
return false;
|
|
201
173
|
}
|
|
202
174
|
|
|
203
175
|
*(const char16_t **)((param.fast ? fast_ptr : args_ptr)++) = str16;
|
|
@@ -211,32 +183,34 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
211
183
|
Napi::Object obj = value.As<Napi::Object>();
|
|
212
184
|
|
|
213
185
|
if (RG_UNLIKELY(!AllocHeap(param.type->ref->size, 16, &ptr)))
|
|
214
|
-
return
|
|
186
|
+
return false;
|
|
215
187
|
|
|
216
188
|
if (param.directions & 1) {
|
|
217
189
|
if (!PushObject(obj, param.type->ref, ptr))
|
|
218
|
-
return
|
|
190
|
+
return false;
|
|
219
191
|
} else {
|
|
220
192
|
memset(ptr, 0, param.type->size);
|
|
221
193
|
}
|
|
222
194
|
if (param.directions & 2) {
|
|
223
|
-
OutObject out =
|
|
224
|
-
|
|
195
|
+
OutObject *out = out_objects.AppendDefault();
|
|
196
|
+
|
|
197
|
+
out->ref.Reset(obj, 1);
|
|
198
|
+
out->ptr = ptr;
|
|
199
|
+
out->type = param.type->ref;
|
|
225
200
|
}
|
|
226
201
|
} else if (IsNullOrUndefined(value)) {
|
|
227
202
|
ptr = nullptr;
|
|
228
203
|
} else {
|
|
229
204
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected %3", GetValueType(instance, value), i + 1, param.type->name);
|
|
230
|
-
return
|
|
205
|
+
return false;
|
|
231
206
|
}
|
|
232
207
|
|
|
233
208
|
*(uint8_t **)((param.fast ? fast_ptr : args_ptr)++) = ptr;
|
|
234
209
|
} break;
|
|
235
|
-
|
|
236
210
|
case PrimitiveKind::Record: {
|
|
237
211
|
if (RG_UNLIKELY(!IsObject(value))) {
|
|
238
212
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected object", GetValueType(instance, value), i + 1);
|
|
239
|
-
return
|
|
213
|
+
return false;
|
|
240
214
|
}
|
|
241
215
|
|
|
242
216
|
Napi::Object obj = value.As<Napi::Object>();
|
|
@@ -244,93 +218,111 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
244
218
|
if (param.fast) {
|
|
245
219
|
uint8_t *ptr = (uint8_t *)(fast_ptr++);
|
|
246
220
|
if (!PushObject(obj, param.type, ptr))
|
|
247
|
-
return
|
|
221
|
+
return false;
|
|
248
222
|
} else {
|
|
249
223
|
uint8_t *ptr = (uint8_t *)AlignUp(args_ptr, param.type->align);
|
|
250
224
|
if (!PushObject(obj, param.type, ptr))
|
|
251
|
-
return
|
|
225
|
+
return false;
|
|
252
226
|
args_ptr = (uint32_t *)AlignUp(ptr + param.type->size, 4);
|
|
253
227
|
}
|
|
254
228
|
} break;
|
|
229
|
+
case PrimitiveKind::Float32: {
|
|
230
|
+
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
231
|
+
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
float f = CopyNumber<float>(value);
|
|
236
|
+
*(float *)((param.fast ? fast_ptr : args_ptr)++) = f;
|
|
237
|
+
} break;
|
|
238
|
+
case PrimitiveKind::Float64: {
|
|
239
|
+
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
240
|
+
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
double d = CopyNumber<double>(value);
|
|
245
|
+
*(double *)args_ptr = d;
|
|
246
|
+
args_ptr += 2;
|
|
247
|
+
} break;
|
|
255
248
|
}
|
|
256
249
|
}
|
|
257
250
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
}
|
|
251
|
+
stack = MakeSpan(mem->stack.end(), old_stack_mem.end() - mem->stack.end());
|
|
252
|
+
heap = MakeSpan(old_heap_mem.ptr, mem->heap.ptr - old_heap_mem.ptr);
|
|
261
253
|
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
void CallData::Execute()
|
|
258
|
+
{
|
|
262
259
|
#define PERFORM_CALL(Suffix) \
|
|
263
260
|
([&]() { \
|
|
264
|
-
auto ret = (func->convention == CallConvention::Fastcall ? ForwardCallR ## Suffix(func->func,
|
|
265
|
-
: ForwardCall ## Suffix(func->func,
|
|
266
|
-
PopOutArguments(out_objects); \
|
|
261
|
+
auto ret = (func->convention == CallConvention::Fastcall ? ForwardCallR ## Suffix(func->func, stack.ptr) \
|
|
262
|
+
: ForwardCall ## Suffix(func->func, stack.ptr)); \
|
|
267
263
|
return ret; \
|
|
268
264
|
})()
|
|
269
265
|
|
|
270
266
|
// Execute and convert return value
|
|
271
267
|
switch (func->ret.type->primitive) {
|
|
272
|
-
case PrimitiveKind::Void:
|
|
273
|
-
|
|
274
|
-
return env.Null();
|
|
275
|
-
} break;
|
|
276
|
-
case PrimitiveKind::Bool: {
|
|
277
|
-
uint32_t rax = (uint32_t)PERFORM_CALL(G);
|
|
278
|
-
return Napi::Boolean::New(env, rax);
|
|
279
|
-
} break;
|
|
268
|
+
case PrimitiveKind::Void:
|
|
269
|
+
case PrimitiveKind::Bool:
|
|
280
270
|
case PrimitiveKind::Int8:
|
|
281
271
|
case PrimitiveKind::UInt8:
|
|
282
272
|
case PrimitiveKind::Int16:
|
|
283
273
|
case PrimitiveKind::UInt16:
|
|
284
274
|
case PrimitiveKind::Int32:
|
|
285
|
-
case PrimitiveKind::UInt32:
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
case PrimitiveKind::
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
} break;
|
|
293
|
-
case PrimitiveKind::
|
|
294
|
-
|
|
295
|
-
return Napi::BigInt::New(env, ret);
|
|
296
|
-
} break;
|
|
297
|
-
case PrimitiveKind::Float32: {
|
|
298
|
-
float f = PERFORM_CALL(F);
|
|
299
|
-
return Napi::Number::New(env, (double)f);
|
|
300
|
-
} break;
|
|
301
|
-
case PrimitiveKind::Float64: {
|
|
302
|
-
double d = PERFORM_CALL(D);
|
|
303
|
-
return Napi::Number::New(env, d);
|
|
304
|
-
} break;
|
|
305
|
-
case PrimitiveKind::String: {
|
|
306
|
-
uint32_t rax = (uint32_t)PERFORM_CALL(G);
|
|
307
|
-
return Napi::String::New(env, (const char *)rax);
|
|
308
|
-
} break;
|
|
309
|
-
case PrimitiveKind::String16: {
|
|
310
|
-
uint32_t rax = (uint32_t)PERFORM_CALL(G);
|
|
311
|
-
return Napi::String::New(env, (const char16_t *)rax);
|
|
312
|
-
} break;
|
|
313
|
-
case PrimitiveKind::Pointer: {
|
|
314
|
-
uint32_t rax = (uint32_t)PERFORM_CALL(G);
|
|
315
|
-
void *ptr = (void *)rax;
|
|
275
|
+
case PrimitiveKind::UInt32:
|
|
276
|
+
case PrimitiveKind::Int64:
|
|
277
|
+
case PrimitiveKind::UInt64:
|
|
278
|
+
case PrimitiveKind::String:
|
|
279
|
+
case PrimitiveKind::String16:
|
|
280
|
+
case PrimitiveKind::Pointer:
|
|
281
|
+
case PrimitiveKind::Record: { result.u64 = PERFORM_CALL(G); } break;
|
|
282
|
+
case PrimitiveKind::Float32: { result.f = PERFORM_CALL(F); } break;
|
|
283
|
+
case PrimitiveKind::Float64: { result.d = PERFORM_CALL(D); } break;
|
|
284
|
+
}
|
|
316
285
|
|
|
317
|
-
|
|
286
|
+
#undef PERFORM_CALL
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
Napi::Value CallData::Complete()
|
|
290
|
+
{
|
|
291
|
+
for (const OutObject &out: out_objects) {
|
|
292
|
+
Napi::Object obj = out.ref.Value().As<Napi::Object>();
|
|
293
|
+
PopObject(obj, out.ptr, out.type);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
switch (func->ret.type->primitive) {
|
|
297
|
+
case PrimitiveKind::Void: return env.Null();
|
|
298
|
+
case PrimitiveKind::Bool: return Napi::Boolean::New(env, result.u32);
|
|
299
|
+
case PrimitiveKind::Int8:
|
|
300
|
+
case PrimitiveKind::UInt8:
|
|
301
|
+
case PrimitiveKind::Int16:
|
|
302
|
+
case PrimitiveKind::UInt16:
|
|
303
|
+
case PrimitiveKind::Int32:
|
|
304
|
+
case PrimitiveKind::UInt32: return Napi::Number::New(env, (double)result.u32);
|
|
305
|
+
case PrimitiveKind::Int64: return Napi::BigInt::New(env, (int64_t)result.u64);
|
|
306
|
+
case PrimitiveKind::UInt64: return Napi::BigInt::New(env, result.u64);
|
|
307
|
+
case PrimitiveKind::String: return Napi::String::New(env, (const char *)result.ptr);
|
|
308
|
+
case PrimitiveKind::String16: return Napi::String::New(env, (const char16_t *)result.ptr);
|
|
309
|
+
case PrimitiveKind::Pointer: {
|
|
310
|
+
Napi::External<void> external = Napi::External<void>::New(env, result.ptr);
|
|
318
311
|
SetValueTag(instance, external, func->ret.type);
|
|
319
312
|
|
|
320
313
|
return external;
|
|
321
314
|
} break;
|
|
322
|
-
|
|
323
315
|
case PrimitiveKind::Record: {
|
|
324
|
-
|
|
325
|
-
|
|
316
|
+
const uint8_t *ptr = return_ptr ? (const uint8_t *)return_ptr
|
|
317
|
+
: (const uint8_t *)&result.buf;
|
|
326
318
|
|
|
327
|
-
Napi::Object obj = PopObject(
|
|
319
|
+
Napi::Object obj = PopObject(ptr, func->ret.type);
|
|
328
320
|
return obj;
|
|
329
321
|
} break;
|
|
322
|
+
case PrimitiveKind::Float32: return Napi::Number::New(env, (double)result.f);
|
|
323
|
+
case PrimitiveKind::Float64: return Napi::Number::New(env, result.d);
|
|
330
324
|
}
|
|
331
325
|
|
|
332
|
-
#undef PERFORM_CALL
|
|
333
|
-
|
|
334
326
|
RG_UNREACHABLE();
|
|
335
327
|
}
|
|
336
328
|
|