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_sysv.cc
CHANGED
|
@@ -181,34 +181,25 @@ bool AnalyseFunction(InstanceData *, FunctionInfo *func)
|
|
|
181
181
|
return true;
|
|
182
182
|
}
|
|
183
183
|
|
|
184
|
-
|
|
184
|
+
bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
185
185
|
{
|
|
186
|
-
// Sanity checks
|
|
187
|
-
if (info.Length() < (uint32_t)func->parameters.len) {
|
|
188
|
-
ThrowError<Napi::TypeError>(env, "Expected %1 arguments, got %2", func->parameters.len, info.Length());
|
|
189
|
-
return env.Null();
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
uint8_t *return_ptr = nullptr;
|
|
193
186
|
uint8_t *args_ptr = nullptr;
|
|
194
187
|
uint64_t *gpr_ptr = nullptr;
|
|
195
188
|
uint64_t *xmm_ptr = nullptr;
|
|
196
189
|
|
|
197
190
|
// Return through registers unless it's too big
|
|
198
191
|
if (RG_UNLIKELY(!AllocStack(func->args_size, 16, &args_ptr)))
|
|
199
|
-
return
|
|
192
|
+
return false;
|
|
200
193
|
if (RG_UNLIKELY(!AllocStack(8 * 8, 8, &xmm_ptr)))
|
|
201
|
-
return
|
|
194
|
+
return false;
|
|
202
195
|
if (RG_UNLIKELY(!AllocStack(6 * 8, 8, &gpr_ptr)))
|
|
203
|
-
return
|
|
196
|
+
return false;
|
|
204
197
|
if (func->ret.use_memory) {
|
|
205
198
|
if (RG_UNLIKELY(!AllocHeap(func->ret.type->size, 16, &return_ptr)))
|
|
206
|
-
return
|
|
199
|
+
return false;
|
|
207
200
|
*(uint8_t **)(gpr_ptr++) = return_ptr;
|
|
208
201
|
}
|
|
209
202
|
|
|
210
|
-
LocalArray<OutObject, MaxOutParameters> out_objects;
|
|
211
|
-
|
|
212
203
|
// Push arguments
|
|
213
204
|
for (Size i = 0; i < func->parameters.len; i++) {
|
|
214
205
|
const ParameterInfo ¶m = func->parameters[i];
|
|
@@ -222,7 +213,7 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
222
213
|
case PrimitiveKind::Bool: {
|
|
223
214
|
if (RG_UNLIKELY(!value.IsBoolean())) {
|
|
224
215
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argmument %2, expected boolean", GetValueType(instance, value), i + 1);
|
|
225
|
-
return
|
|
216
|
+
return false;
|
|
226
217
|
}
|
|
227
218
|
|
|
228
219
|
bool b = value.As<Napi::Boolean>();
|
|
@@ -244,7 +235,7 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
244
235
|
case PrimitiveKind::UInt64: {
|
|
245
236
|
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
246
237
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
247
|
-
return
|
|
238
|
+
return false;
|
|
248
239
|
}
|
|
249
240
|
|
|
250
241
|
int64_t v = CopyNumber<int64_t>(value);
|
|
@@ -257,49 +248,17 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
257
248
|
args_ptr += 8;
|
|
258
249
|
}
|
|
259
250
|
} break;
|
|
260
|
-
case PrimitiveKind::Float32: {
|
|
261
|
-
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
262
|
-
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
263
|
-
return env.Null();
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
float f = CopyNumber<float>(value);
|
|
267
|
-
|
|
268
|
-
if (RG_LIKELY(param.xmm_count)) {
|
|
269
|
-
memcpy(xmm_ptr++, &f, 4);
|
|
270
|
-
} else {
|
|
271
|
-
args_ptr = AlignUp(args_ptr, 4);
|
|
272
|
-
memcpy(args_ptr, &f, 4);
|
|
273
|
-
args_ptr += 8;
|
|
274
|
-
}
|
|
275
|
-
} break;
|
|
276
|
-
case PrimitiveKind::Float64: {
|
|
277
|
-
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
278
|
-
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
279
|
-
return env.Null();
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
double d = CopyNumber<double>(value);
|
|
283
|
-
|
|
284
|
-
if (RG_LIKELY(param.xmm_count)) {
|
|
285
|
-
memcpy(xmm_ptr++, &d, 8);
|
|
286
|
-
} else {
|
|
287
|
-
args_ptr = AlignUp(args_ptr, 8);
|
|
288
|
-
memcpy(args_ptr, &d, 8);
|
|
289
|
-
args_ptr += 8;
|
|
290
|
-
}
|
|
291
|
-
} break;
|
|
292
251
|
case PrimitiveKind::String: {
|
|
293
252
|
const char *str;
|
|
294
253
|
if (RG_LIKELY(value.IsString())) {
|
|
295
254
|
str = PushString(value);
|
|
296
255
|
if (RG_UNLIKELY(!str))
|
|
297
|
-
return
|
|
256
|
+
return false;
|
|
298
257
|
} else if (IsNullOrUndefined(value)) {
|
|
299
258
|
str = nullptr;
|
|
300
259
|
} else {
|
|
301
260
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected string", GetValueType(instance, value), i + 1);
|
|
302
|
-
return
|
|
261
|
+
return false;
|
|
303
262
|
}
|
|
304
263
|
|
|
305
264
|
if (RG_LIKELY(param.gpr_count)) {
|
|
@@ -315,12 +274,12 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
315
274
|
if (RG_LIKELY(value.IsString())) {
|
|
316
275
|
str16 = PushString16(value);
|
|
317
276
|
if (RG_UNLIKELY(!str16))
|
|
318
|
-
return
|
|
277
|
+
return false;
|
|
319
278
|
} else if (IsNullOrUndefined(value)) {
|
|
320
279
|
str16 = nullptr;
|
|
321
280
|
} else {
|
|
322
281
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected string", GetValueType(instance, value), i + 1);
|
|
323
|
-
return
|
|
282
|
+
return false;
|
|
324
283
|
}
|
|
325
284
|
|
|
326
285
|
if (RG_LIKELY(param.gpr_count)) {
|
|
@@ -340,23 +299,26 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
340
299
|
Napi::Object obj = value.As<Napi::Object>();
|
|
341
300
|
|
|
342
301
|
if (RG_UNLIKELY(!AllocHeap(param.type->ref->size, 16, &ptr)))
|
|
343
|
-
return
|
|
302
|
+
return false;
|
|
344
303
|
|
|
345
304
|
if (param.directions & 1) {
|
|
346
305
|
if (!PushObject(obj, param.type->ref, ptr))
|
|
347
|
-
return
|
|
306
|
+
return false;
|
|
348
307
|
} else {
|
|
349
308
|
memset(ptr, 0, param.type->size);
|
|
350
309
|
}
|
|
351
310
|
if (param.directions & 2) {
|
|
352
|
-
OutObject out =
|
|
353
|
-
|
|
311
|
+
OutObject *out = out_objects.AppendDefault();
|
|
312
|
+
|
|
313
|
+
out->ref.Reset(obj, 1);
|
|
314
|
+
out->ptr = ptr;
|
|
315
|
+
out->type = param.type->ref;
|
|
354
316
|
}
|
|
355
317
|
} else if (IsNullOrUndefined(value)) {
|
|
356
318
|
ptr = nullptr;
|
|
357
319
|
} else {
|
|
358
320
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected %3", GetValueType(instance, value), i + 1, param.type->name);
|
|
359
|
-
return
|
|
321
|
+
return false;
|
|
360
322
|
}
|
|
361
323
|
|
|
362
324
|
if (RG_LIKELY(param.gpr_count)) {
|
|
@@ -367,11 +329,10 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
367
329
|
args_ptr += 8;
|
|
368
330
|
}
|
|
369
331
|
} break;
|
|
370
|
-
|
|
371
332
|
case PrimitiveKind::Record: {
|
|
372
333
|
if (RG_UNLIKELY(!IsObject(value))) {
|
|
373
334
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected object", GetValueType(instance, value), i + 1);
|
|
374
|
-
return
|
|
335
|
+
return false;
|
|
375
336
|
}
|
|
376
337
|
|
|
377
338
|
Napi::Object obj = value.As<Napi::Object>();
|
|
@@ -381,7 +342,7 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
381
342
|
|
|
382
343
|
uint64_t buf[2] = {};
|
|
383
344
|
if (!PushObject(obj, param.type, (uint8_t *)buf))
|
|
384
|
-
return
|
|
345
|
+
return false;
|
|
385
346
|
|
|
386
347
|
if (param.gpr_first) {
|
|
387
348
|
uint64_t *ptr = buf;
|
|
@@ -405,112 +366,133 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
405
366
|
} else if (param.use_memory) {
|
|
406
367
|
args_ptr = AlignUp(args_ptr, param.type->align);
|
|
407
368
|
if (!PushObject(obj, param.type, args_ptr))
|
|
408
|
-
return
|
|
369
|
+
return false;
|
|
409
370
|
args_ptr += AlignLen(param.type->size, 8);
|
|
410
371
|
}
|
|
411
372
|
} break;
|
|
373
|
+
case PrimitiveKind::Float32: {
|
|
374
|
+
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
375
|
+
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
376
|
+
return false;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
float f = CopyNumber<float>(value);
|
|
380
|
+
|
|
381
|
+
if (RG_LIKELY(param.xmm_count)) {
|
|
382
|
+
memcpy(xmm_ptr++, &f, 4);
|
|
383
|
+
} else {
|
|
384
|
+
args_ptr = AlignUp(args_ptr, 4);
|
|
385
|
+
memcpy(args_ptr, &f, 4);
|
|
386
|
+
args_ptr += 8;
|
|
387
|
+
}
|
|
388
|
+
} break;
|
|
389
|
+
case PrimitiveKind::Float64: {
|
|
390
|
+
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
391
|
+
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
392
|
+
return false;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
double d = CopyNumber<double>(value);
|
|
396
|
+
|
|
397
|
+
if (RG_LIKELY(param.xmm_count)) {
|
|
398
|
+
memcpy(xmm_ptr++, &d, 8);
|
|
399
|
+
} else {
|
|
400
|
+
args_ptr = AlignUp(args_ptr, 8);
|
|
401
|
+
memcpy(args_ptr, &d, 8);
|
|
402
|
+
args_ptr += 8;
|
|
403
|
+
}
|
|
404
|
+
} break;
|
|
412
405
|
}
|
|
413
406
|
}
|
|
414
407
|
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
}
|
|
408
|
+
stack = MakeSpan(mem->stack.end(), old_stack_mem.end() - mem->stack.end());
|
|
409
|
+
heap = MakeSpan(old_heap_mem.ptr, mem->heap.ptr - old_heap_mem.ptr);
|
|
418
410
|
|
|
411
|
+
return true;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
void CallData::Execute()
|
|
415
|
+
{
|
|
419
416
|
#define PERFORM_CALL(Suffix) \
|
|
420
417
|
([&]() { \
|
|
421
|
-
auto ret = (func->forward_fp ? ForwardCallX ## Suffix(func->func,
|
|
422
|
-
: ForwardCall ## Suffix(func->func,
|
|
423
|
-
PopOutArguments(out_objects); \
|
|
418
|
+
auto ret = (func->forward_fp ? ForwardCallX ## Suffix(func->func, stack.ptr) \
|
|
419
|
+
: ForwardCall ## Suffix(func->func, stack.ptr)); \
|
|
424
420
|
return ret; \
|
|
425
421
|
})()
|
|
426
422
|
|
|
427
423
|
// Execute and convert return value
|
|
428
424
|
switch (func->ret.type->primitive) {
|
|
429
|
-
case PrimitiveKind::Void:
|
|
430
|
-
|
|
431
|
-
return env.Null();
|
|
432
|
-
} break;
|
|
433
|
-
case PrimitiveKind::Bool: {
|
|
434
|
-
RaxRdxRet ret = PERFORM_CALL(GG);
|
|
435
|
-
return Napi::Boolean::New(env, ret.rax);
|
|
436
|
-
} break;
|
|
425
|
+
case PrimitiveKind::Void:
|
|
426
|
+
case PrimitiveKind::Bool:
|
|
437
427
|
case PrimitiveKind::Int8:
|
|
438
428
|
case PrimitiveKind::UInt8:
|
|
439
429
|
case PrimitiveKind::Int16:
|
|
440
430
|
case PrimitiveKind::UInt16:
|
|
441
431
|
case PrimitiveKind::Int32:
|
|
442
|
-
case PrimitiveKind::UInt32:
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
case PrimitiveKind::
|
|
447
|
-
|
|
448
|
-
return Napi::BigInt::New(env, (int64_t)ret.rax);
|
|
449
|
-
} break;
|
|
450
|
-
case PrimitiveKind::UInt64: {
|
|
451
|
-
RaxRdxRet ret = PERFORM_CALL(GG);
|
|
452
|
-
return Napi::BigInt::New(env, ret.rax);
|
|
453
|
-
} break;
|
|
454
|
-
case PrimitiveKind::Float32: {
|
|
455
|
-
float f = PERFORM_CALL(F);
|
|
456
|
-
return Napi::Number::New(env, (double)f);
|
|
457
|
-
} break;
|
|
458
|
-
case PrimitiveKind::Float64: {
|
|
459
|
-
Xmm0RaxRet ret = PERFORM_CALL(DG);
|
|
460
|
-
return Napi::Number::New(env, ret.xmm0);
|
|
461
|
-
} break;
|
|
462
|
-
case PrimitiveKind::String: {
|
|
463
|
-
RaxRdxRet ret = PERFORM_CALL(GG);
|
|
464
|
-
return Napi::String::New(env, (const char *)ret.rax);
|
|
465
|
-
} break;
|
|
466
|
-
case PrimitiveKind::String16: {
|
|
467
|
-
RaxRdxRet ret = PERFORM_CALL(GG);
|
|
468
|
-
return Napi::String::New(env, (const char16_t *)ret.rax);
|
|
469
|
-
} break;
|
|
470
|
-
case PrimitiveKind::Pointer: {
|
|
471
|
-
RaxRdxRet ret = PERFORM_CALL(GG);
|
|
472
|
-
void *ptr = (void *)ret.rax;
|
|
473
|
-
|
|
474
|
-
Napi::External<void> external = Napi::External<void>::New(env, ptr);
|
|
475
|
-
SetValueTag(instance, external, func->ret.type);
|
|
476
|
-
|
|
477
|
-
return external;
|
|
478
|
-
} break;
|
|
479
|
-
|
|
432
|
+
case PrimitiveKind::UInt32:
|
|
433
|
+
case PrimitiveKind::Int64:
|
|
434
|
+
case PrimitiveKind::UInt64:
|
|
435
|
+
case PrimitiveKind::String:
|
|
436
|
+
case PrimitiveKind::String16:
|
|
437
|
+
case PrimitiveKind::Pointer: { result.u64 = PERFORM_CALL(GG).rax; } break;
|
|
480
438
|
case PrimitiveKind::Record: {
|
|
481
439
|
if (func->ret.gpr_first && !func->ret.xmm_count) {
|
|
482
440
|
RaxRdxRet ret = PERFORM_CALL(GG);
|
|
483
|
-
|
|
484
|
-
Napi::Object obj = PopObject(env, (const uint8_t *)&ret, func->ret.type);
|
|
485
|
-
return obj;
|
|
441
|
+
memcpy_safe(&result.buf, &ret, RG_SIZE(ret));
|
|
486
442
|
} else if (func->ret.gpr_first) {
|
|
487
443
|
RaxXmm0Ret ret = PERFORM_CALL(GD);
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
444
|
+
memcpy_safe(&result.buf, &ret, RG_SIZE(ret));
|
|
445
|
+
} else if (func->ret.xmm_count == 2) {
|
|
446
|
+
Xmm0Xmm1Ret ret = PERFORM_CALL(DD);
|
|
447
|
+
memcpy_safe(&result.buf, &ret, RG_SIZE(ret));
|
|
448
|
+
} else {
|
|
492
449
|
Xmm0RaxRet ret = PERFORM_CALL(DG);
|
|
450
|
+
memcpy_safe(&result.buf, &ret, RG_SIZE(ret));
|
|
451
|
+
}
|
|
452
|
+
} break;
|
|
453
|
+
case PrimitiveKind::Float32: { result.f = PERFORM_CALL(F); } break;
|
|
454
|
+
case PrimitiveKind::Float64: { result.d = PERFORM_CALL(DG).xmm0; } break;
|
|
455
|
+
}
|
|
493
456
|
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
} else if (func->ret.type->size) {
|
|
497
|
-
RG_ASSERT(return_ptr);
|
|
457
|
+
#undef PERFORM_CALL
|
|
458
|
+
}
|
|
498
459
|
|
|
499
|
-
|
|
500
|
-
|
|
460
|
+
Napi::Value CallData::Complete()
|
|
461
|
+
{
|
|
462
|
+
for (const OutObject &out: out_objects) {
|
|
463
|
+
Napi::Object obj = out.ref.Value().As<Napi::Object>();
|
|
464
|
+
PopObject(obj, out.ptr, out.type);
|
|
465
|
+
}
|
|
501
466
|
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
467
|
+
switch (func->ret.type->primitive) {
|
|
468
|
+
case PrimitiveKind::Void: return env.Null();
|
|
469
|
+
case PrimitiveKind::Bool: return Napi::Boolean::New(env, result.u32);
|
|
470
|
+
case PrimitiveKind::Int8:
|
|
471
|
+
case PrimitiveKind::UInt8:
|
|
472
|
+
case PrimitiveKind::Int16:
|
|
473
|
+
case PrimitiveKind::UInt16:
|
|
474
|
+
case PrimitiveKind::Int32:
|
|
475
|
+
case PrimitiveKind::UInt32: return Napi::Number::New(env, (double)result.u32);
|
|
476
|
+
case PrimitiveKind::Int64: return Napi::BigInt::New(env, (int64_t)result.u64);
|
|
477
|
+
case PrimitiveKind::UInt64: return Napi::BigInt::New(env, result.u64);
|
|
478
|
+
case PrimitiveKind::String: return Napi::String::New(env, (const char *)result.ptr);
|
|
479
|
+
case PrimitiveKind::String16: return Napi::String::New(env, (const char16_t *)result.ptr);
|
|
480
|
+
case PrimitiveKind::Pointer: {
|
|
481
|
+
Napi::External<void> external = Napi::External<void>::New(env, result.ptr);
|
|
482
|
+
SetValueTag(instance, external, func->ret.type);
|
|
506
483
|
|
|
507
|
-
|
|
508
|
-
return obj;
|
|
509
|
-
}
|
|
484
|
+
return external;
|
|
510
485
|
} break;
|
|
511
|
-
|
|
486
|
+
case PrimitiveKind::Record: {
|
|
487
|
+
const uint8_t *ptr = return_ptr ? (const uint8_t *)return_ptr
|
|
488
|
+
: (const uint8_t *)&result.buf;
|
|
512
489
|
|
|
513
|
-
|
|
490
|
+
Napi::Object obj = PopObject(ptr, func->ret.type);
|
|
491
|
+
return obj;
|
|
492
|
+
} break;
|
|
493
|
+
case PrimitiveKind::Float32: return Napi::Number::New(env, (double)result.f);
|
|
494
|
+
case PrimitiveKind::Float64: return Napi::Number::New(env, result.d);
|
|
495
|
+
}
|
|
514
496
|
|
|
515
497
|
RG_UNREACHABLE();
|
|
516
498
|
}
|