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_arm64.cc
CHANGED
|
@@ -163,28 +163,24 @@ static bool PushHFA(const Napi::Object &obj, const TypeInfo *type, uint8_t *dest
|
|
|
163
163
|
InstanceData *instance = env.GetInstanceData<InstanceData>();
|
|
164
164
|
|
|
165
165
|
RG_ASSERT(IsObject(obj));
|
|
166
|
+
RG_ASSERT(IsHFA(type));
|
|
166
167
|
RG_ASSERT(type->primitive == PrimitiveKind::Record);
|
|
167
|
-
RG_ASSERT(AlignUp(dest,
|
|
168
|
+
RG_ASSERT(AlignUp(dest, type->members[0].type->size) == dest);
|
|
169
|
+
|
|
170
|
+
bool float32 = (type->members[0].type->primitive == PrimitiveKind::Float32);
|
|
168
171
|
|
|
169
172
|
for (const RecordMember &member: type->members) {
|
|
170
173
|
Napi::Value value = obj.Get(member.name);
|
|
171
174
|
|
|
172
|
-
if (
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
}
|
|
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
|
+
}
|
|
177
179
|
|
|
180
|
+
if (float32) {
|
|
178
181
|
*(float *)dest = CopyNumber<float>(value);
|
|
179
|
-
} else if (member.type->primitive == PrimitiveKind::Float64) {
|
|
180
|
-
if (!value.IsNumber() && !value.IsBigInt()) {
|
|
181
|
-
ThrowError<Napi::TypeError>(env, "Unexpected value %1 for member '%2', expected number", GetValueType(instance, value), member.name);
|
|
182
|
-
return false;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
*(double *)dest = CopyNumber<double>(value);
|
|
186
182
|
} else {
|
|
187
|
-
|
|
183
|
+
*(double *)dest = CopyNumber<double>(value);
|
|
188
184
|
}
|
|
189
185
|
|
|
190
186
|
dest += 8;
|
|
@@ -196,18 +192,19 @@ static bool PushHFA(const Napi::Object &obj, const TypeInfo *type, uint8_t *dest
|
|
|
196
192
|
static Napi::Object PopHFA(napi_env env, const uint8_t *ptr, const TypeInfo *type)
|
|
197
193
|
{
|
|
198
194
|
RG_ASSERT(type->primitive == PrimitiveKind::Record);
|
|
195
|
+
RG_ASSERT(IsHFA(type));
|
|
199
196
|
|
|
200
197
|
Napi::Object obj = Napi::Object::New(env);
|
|
201
198
|
|
|
199
|
+
bool float32 = (type->members[0].type->primitive == PrimitiveKind::Float32);
|
|
200
|
+
|
|
202
201
|
for (const RecordMember &member: type->members) {
|
|
203
|
-
if (
|
|
202
|
+
if (float32) {
|
|
204
203
|
float f = *(float *)ptr;
|
|
205
204
|
obj.Set(member.name, Napi::Number::New(env, (double)f));
|
|
206
|
-
} else
|
|
205
|
+
} else {
|
|
207
206
|
double d = *(double *)ptr;
|
|
208
207
|
obj.Set(member.name, Napi::Number::New(env, d));
|
|
209
|
-
} else {
|
|
210
|
-
RG_UNREACHABLE();
|
|
211
208
|
}
|
|
212
209
|
|
|
213
210
|
ptr += 8;
|
|
@@ -216,34 +213,25 @@ static Napi::Object PopHFA(napi_env env, const uint8_t *ptr, const TypeInfo *typ
|
|
|
216
213
|
return obj;
|
|
217
214
|
}
|
|
218
215
|
|
|
219
|
-
|
|
216
|
+
bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
220
217
|
{
|
|
221
|
-
// Sanity checks
|
|
222
|
-
if (info.Length() < (uint32_t)func->parameters.len) {
|
|
223
|
-
ThrowError<Napi::TypeError>(env, "Expected %1 arguments, got %2", func->parameters.len, info.Length());
|
|
224
|
-
return env.Null();
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
uint8_t *return_ptr = nullptr;
|
|
228
218
|
uint8_t *args_ptr = nullptr;
|
|
229
219
|
uint64_t *gpr_ptr = nullptr;
|
|
230
220
|
uint64_t *vec_ptr = nullptr;
|
|
231
221
|
|
|
232
222
|
// Return through registers unless it's too big
|
|
233
223
|
if (RG_UNLIKELY(!AllocStack(func->args_size, 16, &args_ptr)))
|
|
234
|
-
return
|
|
224
|
+
return false;
|
|
235
225
|
if (RG_UNLIKELY(!AllocStack(8 * 8, 8, &vec_ptr)))
|
|
236
|
-
return
|
|
226
|
+
return false;
|
|
237
227
|
if (RG_UNLIKELY(!AllocStack(9 * 8, 8, &gpr_ptr)))
|
|
238
|
-
return
|
|
228
|
+
return false;
|
|
239
229
|
if (func->ret.use_memory) {
|
|
240
230
|
if (RG_UNLIKELY(!AllocHeap(func->ret.type->size, 16, &return_ptr)))
|
|
241
|
-
return
|
|
231
|
+
return false;
|
|
242
232
|
gpr_ptr[8] = (uint64_t)return_ptr;
|
|
243
233
|
}
|
|
244
234
|
|
|
245
|
-
LocalArray<OutObject, MaxOutParameters> out_objects;
|
|
246
|
-
|
|
247
235
|
// Push arguments
|
|
248
236
|
for (Size i = 0; i < func->parameters.len; i++) {
|
|
249
237
|
const ParameterInfo ¶m = func->parameters[i];
|
|
@@ -257,7 +245,7 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
257
245
|
case PrimitiveKind::Bool: {
|
|
258
246
|
if (RG_UNLIKELY(!value.IsBoolean())) {
|
|
259
247
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected boolean", GetValueType(instance, value), i + 1);
|
|
260
|
-
return
|
|
248
|
+
return false;
|
|
261
249
|
}
|
|
262
250
|
|
|
263
251
|
bool b = value.As<Napi::Boolean>();
|
|
@@ -283,7 +271,7 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
283
271
|
case PrimitiveKind::UInt64: {
|
|
284
272
|
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
285
273
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
286
|
-
return
|
|
274
|
+
return false;
|
|
287
275
|
}
|
|
288
276
|
|
|
289
277
|
int64_t v = CopyNumber<int64_t>(value);
|
|
@@ -303,7 +291,7 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
303
291
|
case PrimitiveKind::Float32: {
|
|
304
292
|
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
305
293
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
306
|
-
return
|
|
294
|
+
return false;
|
|
307
295
|
}
|
|
308
296
|
|
|
309
297
|
float f = CopyNumber<float>(value);
|
|
@@ -323,7 +311,7 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
323
311
|
case PrimitiveKind::Float64: {
|
|
324
312
|
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
325
313
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
|
|
326
|
-
return
|
|
314
|
+
return false;
|
|
327
315
|
}
|
|
328
316
|
|
|
329
317
|
double d = CopyNumber<double>(value);
|
|
@@ -341,12 +329,12 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
341
329
|
if (RG_LIKELY(value.IsString())) {
|
|
342
330
|
str = PushString(value);
|
|
343
331
|
if (RG_UNLIKELY(!str))
|
|
344
|
-
return
|
|
332
|
+
return false;
|
|
345
333
|
} else if (IsNullOrUndefined(value)) {
|
|
346
334
|
str = nullptr;
|
|
347
335
|
} else {
|
|
348
336
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected string", GetValueType(instance, value), i + 1);
|
|
349
|
-
return
|
|
337
|
+
return false;
|
|
350
338
|
}
|
|
351
339
|
|
|
352
340
|
if (RG_LIKELY(param.gpr_count)) {
|
|
@@ -362,12 +350,12 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
362
350
|
if (RG_LIKELY(value.IsString())) {
|
|
363
351
|
str16 = PushString16(value);
|
|
364
352
|
if (RG_UNLIKELY(!str16))
|
|
365
|
-
return
|
|
353
|
+
return false;
|
|
366
354
|
} else if (IsNullOrUndefined(value)) {
|
|
367
355
|
str16 = nullptr;
|
|
368
356
|
} else {
|
|
369
357
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected string", GetValueType(instance, value), i + 1);
|
|
370
|
-
return
|
|
358
|
+
return false;
|
|
371
359
|
}
|
|
372
360
|
|
|
373
361
|
if (RG_LIKELY(param.gpr_count)) {
|
|
@@ -387,23 +375,26 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
387
375
|
Napi::Object obj = value.As<Napi::Object>();
|
|
388
376
|
|
|
389
377
|
if (RG_UNLIKELY(!AllocHeap(param.type->ref->size, 16, &ptr)))
|
|
390
|
-
return
|
|
378
|
+
return false;
|
|
391
379
|
|
|
392
380
|
if (param.directions & 1) {
|
|
393
381
|
if (!PushObject(obj, param.type->ref, ptr))
|
|
394
|
-
return
|
|
382
|
+
return false;
|
|
395
383
|
} else {
|
|
396
384
|
memset(ptr, 0, param.type->size);
|
|
397
385
|
}
|
|
398
386
|
if (param.directions & 2) {
|
|
399
|
-
OutObject out =
|
|
400
|
-
|
|
387
|
+
OutObject *out = out_objects.AppendDefault();
|
|
388
|
+
|
|
389
|
+
out->ref.Reset(obj, 1);
|
|
390
|
+
out->ptr = ptr;
|
|
391
|
+
out->type = param.type->ref;
|
|
401
392
|
}
|
|
402
393
|
} else if (IsNullOrUndefined(value)) {
|
|
403
394
|
ptr = nullptr;
|
|
404
395
|
} else {
|
|
405
396
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected %3", GetValueType(instance, value), i + 1, param.type->name);
|
|
406
|
-
return
|
|
397
|
+
return false;
|
|
407
398
|
}
|
|
408
399
|
|
|
409
400
|
if (RG_LIKELY(param.gpr_count)) {
|
|
@@ -418,32 +409,32 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
418
409
|
case PrimitiveKind::Record: {
|
|
419
410
|
if (RG_UNLIKELY(!IsObject(value))) {
|
|
420
411
|
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected object", GetValueType(instance, value), i + 1);
|
|
421
|
-
return
|
|
412
|
+
return false;
|
|
422
413
|
}
|
|
423
414
|
|
|
424
415
|
Napi::Object obj = value.As<Napi::Object>();
|
|
425
416
|
|
|
426
417
|
if (param.vec_count) {
|
|
427
418
|
if (!PushHFA(obj, param.type, (uint8_t *)vec_ptr))
|
|
428
|
-
return
|
|
419
|
+
return false;
|
|
429
420
|
vec_ptr += param.vec_count;
|
|
430
421
|
} else if (!param.use_memory) {
|
|
431
422
|
if (param.gpr_count) {
|
|
432
423
|
RG_ASSERT(param.type->align <= 8);
|
|
433
424
|
|
|
434
425
|
if (!PushObject(obj, param.type, (uint8_t *)gpr_ptr))
|
|
435
|
-
return
|
|
426
|
+
return false;
|
|
436
427
|
gpr_ptr += param.gpr_count;
|
|
437
428
|
} else if (param.type->size) {
|
|
438
429
|
args_ptr = AlignUp(args_ptr, 8);
|
|
439
430
|
if (!PushObject(obj, param.type, args_ptr))
|
|
440
|
-
return
|
|
431
|
+
return false;
|
|
441
432
|
args_ptr += AlignLen(param.type->size, 8);
|
|
442
433
|
}
|
|
443
434
|
} else {
|
|
444
435
|
uint8_t *ptr;
|
|
445
436
|
if (RG_UNLIKELY(!AllocHeap(param.type->size, 16, &ptr)))
|
|
446
|
-
return
|
|
437
|
+
return false;
|
|
447
438
|
|
|
448
439
|
if (param.gpr_count) {
|
|
449
440
|
RG_ASSERT(param.gpr_count == 1);
|
|
@@ -457,107 +448,102 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
|
|
|
457
448
|
}
|
|
458
449
|
|
|
459
450
|
if (!PushObject(obj, param.type, ptr))
|
|
460
|
-
return
|
|
451
|
+
return false;
|
|
461
452
|
}
|
|
462
453
|
} break;
|
|
463
454
|
}
|
|
464
455
|
}
|
|
465
456
|
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
}
|
|
457
|
+
stack = MakeSpan(mem->stack.end(), old_stack_mem.end() - mem->stack.end());
|
|
458
|
+
heap = MakeSpan(old_heap_mem.ptr, mem->heap.ptr - old_heap_mem.ptr);
|
|
469
459
|
|
|
460
|
+
return true;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
void CallData::Execute()
|
|
464
|
+
{
|
|
470
465
|
#define PERFORM_CALL(Suffix) \
|
|
471
466
|
([&]() { \
|
|
472
|
-
auto ret = (func->forward_fp ? ForwardCallX ## Suffix(func->func,
|
|
473
|
-
: ForwardCall ## Suffix(func->func,
|
|
474
|
-
PopOutArguments(out_objects); \
|
|
467
|
+
auto ret = (func->forward_fp ? ForwardCallX ## Suffix(func->func, stack.ptr) \
|
|
468
|
+
: ForwardCall ## Suffix(func->func, stack.ptr)); \
|
|
475
469
|
return ret; \
|
|
476
470
|
})()
|
|
477
471
|
|
|
478
472
|
// Execute and convert return value
|
|
479
473
|
switch (func->ret.type->primitive) {
|
|
480
|
-
case PrimitiveKind::Void:
|
|
481
|
-
|
|
482
|
-
return env.Null();
|
|
483
|
-
} break;
|
|
484
|
-
case PrimitiveKind::Bool: {
|
|
485
|
-
X0X1Ret ret = PERFORM_CALL(GG);
|
|
486
|
-
return Napi::Boolean::New(env, ret.x0);
|
|
487
|
-
} break;
|
|
474
|
+
case PrimitiveKind::Void:
|
|
475
|
+
case PrimitiveKind::Bool:
|
|
488
476
|
case PrimitiveKind::Int8:
|
|
489
477
|
case PrimitiveKind::UInt8:
|
|
490
478
|
case PrimitiveKind::Int16:
|
|
491
479
|
case PrimitiveKind::UInt16:
|
|
492
480
|
case PrimitiveKind::Int32:
|
|
493
|
-
case PrimitiveKind::UInt32:
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
case PrimitiveKind::
|
|
498
|
-
|
|
499
|
-
return Napi::BigInt::New(env, (int64_t)ret.x0);
|
|
500
|
-
} break;
|
|
501
|
-
case PrimitiveKind::UInt64: {
|
|
502
|
-
X0X1Ret ret = PERFORM_CALL(GG);
|
|
503
|
-
return Napi::BigInt::New(env, ret.x0);
|
|
504
|
-
} break;
|
|
505
|
-
case PrimitiveKind::Float32: {
|
|
506
|
-
float f = PERFORM_CALL(F);
|
|
507
|
-
return Napi::Number::New(env, (double)f);
|
|
508
|
-
} break;
|
|
509
|
-
case PrimitiveKind::Float64: {
|
|
510
|
-
HfaRet ret = PERFORM_CALL(DDDD);
|
|
511
|
-
return Napi::Number::New(env, (double)ret.d0);
|
|
512
|
-
} break;
|
|
513
|
-
case PrimitiveKind::String: {
|
|
514
|
-
X0X1Ret ret = PERFORM_CALL(GG);
|
|
515
|
-
return Napi::String::New(env, (const char *)ret.x0);
|
|
516
|
-
} break;
|
|
517
|
-
case PrimitiveKind::String16: {
|
|
518
|
-
X0X1Ret ret = PERFORM_CALL(GG);
|
|
519
|
-
return Napi::String::New(env, (const char16_t *)ret.x0);
|
|
520
|
-
} break;
|
|
521
|
-
case PrimitiveKind::Pointer: {
|
|
522
|
-
X0X1Ret ret = PERFORM_CALL(GG);
|
|
523
|
-
void *ptr = (void *)ret.x0;
|
|
524
|
-
|
|
525
|
-
Napi::External<void> external = Napi::External<void>::New(env, ptr);
|
|
526
|
-
SetValueTag(instance, external, func->ret.type);
|
|
527
|
-
|
|
528
|
-
return external;
|
|
529
|
-
} break;
|
|
530
|
-
|
|
481
|
+
case PrimitiveKind::UInt32:
|
|
482
|
+
case PrimitiveKind::Int64:
|
|
483
|
+
case PrimitiveKind::UInt64:
|
|
484
|
+
case PrimitiveKind::String:
|
|
485
|
+
case PrimitiveKind::String16:
|
|
486
|
+
case PrimitiveKind::Pointer: { result.u64 = PERFORM_CALL(GG).x0; } break;
|
|
531
487
|
case PrimitiveKind::Record: {
|
|
532
488
|
if (func->ret.gpr_count) {
|
|
533
489
|
X0X1Ret ret = PERFORM_CALL(GG);
|
|
534
|
-
|
|
535
|
-
Napi::Object obj = PopObject(env, (const uint8_t *)&ret, func->ret.type);
|
|
536
|
-
return obj;
|
|
490
|
+
memcpy_safe(&result.buf, &ret, RG_SIZE(ret));
|
|
537
491
|
} else if (func->ret.vec_count) {
|
|
538
492
|
HfaRet ret = PERFORM_CALL(DDDD);
|
|
493
|
+
memcpy_safe(&result.buf, &ret, RG_SIZE(ret));
|
|
494
|
+
} else {
|
|
495
|
+
PERFORM_CALL(GG);
|
|
496
|
+
}
|
|
497
|
+
} break;
|
|
498
|
+
case PrimitiveKind::Float32: { result.f = PERFORM_CALL(F); } break;
|
|
499
|
+
case PrimitiveKind::Float64: { result.d = PERFORM_CALL(DDDD).d0; } break;
|
|
500
|
+
}
|
|
539
501
|
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
} else if (func->ret.type->size) {
|
|
543
|
-
RG_ASSERT(return_ptr);
|
|
502
|
+
#undef PERFORM_CALL
|
|
503
|
+
}
|
|
544
504
|
|
|
545
|
-
|
|
546
|
-
|
|
505
|
+
Napi::Value CallData::Complete()
|
|
506
|
+
{
|
|
507
|
+
for (const OutObject &out: out_objects) {
|
|
508
|
+
Napi::Object obj = out.ref.Value().As<Napi::Object>();
|
|
509
|
+
PopObject(obj, out.ptr, out.type);
|
|
510
|
+
}
|
|
547
511
|
|
|
548
|
-
|
|
512
|
+
switch (func->ret.type->primitive) {
|
|
513
|
+
case PrimitiveKind::Void: return env.Null();
|
|
514
|
+
case PrimitiveKind::Bool: return Napi::Boolean::New(env, result.u32);
|
|
515
|
+
case PrimitiveKind::Int8:
|
|
516
|
+
case PrimitiveKind::UInt8:
|
|
517
|
+
case PrimitiveKind::Int16:
|
|
518
|
+
case PrimitiveKind::UInt16:
|
|
519
|
+
case PrimitiveKind::Int32:
|
|
520
|
+
case PrimitiveKind::UInt32: return Napi::Number::New(env, (double)result.u32);
|
|
521
|
+
case PrimitiveKind::Int64: return Napi::BigInt::New(env, (int64_t)result.u64);
|
|
522
|
+
case PrimitiveKind::UInt64: return Napi::BigInt::New(env, result.u64);
|
|
523
|
+
case PrimitiveKind::String: return Napi::String::New(env, (const char *)result.ptr);
|
|
524
|
+
case PrimitiveKind::String16: return Napi::String::New(env, (const char16_t *)result.ptr);
|
|
525
|
+
case PrimitiveKind::Pointer: {
|
|
526
|
+
Napi::External<void> external = Napi::External<void>::New(env, result.ptr);
|
|
527
|
+
SetValueTag(instance, external, func->ret.type);
|
|
528
|
+
|
|
529
|
+
return external;
|
|
530
|
+
} break;
|
|
531
|
+
case PrimitiveKind::Record: {
|
|
532
|
+
if (func->ret.vec_count) {
|
|
533
|
+
Napi::Object obj = PopHFA(env, (const uint8_t *)&result.buf, func->ret.type);
|
|
549
534
|
return obj;
|
|
550
535
|
} else {
|
|
551
|
-
|
|
536
|
+
const uint8_t *ptr = return_ptr ? (const uint8_t *)return_ptr
|
|
537
|
+
: (const uint8_t *)&result.buf;
|
|
552
538
|
|
|
553
|
-
Napi::Object obj =
|
|
539
|
+
Napi::Object obj = PopObject(ptr, func->ret.type);
|
|
554
540
|
return obj;
|
|
555
541
|
}
|
|
556
542
|
} break;
|
|
543
|
+
case PrimitiveKind::Float32: return Napi::Number::New(env, (double)result.f);
|
|
544
|
+
case PrimitiveKind::Float64: return Napi::Number::New(env, result.d);
|
|
557
545
|
}
|
|
558
546
|
|
|
559
|
-
#undef PERFORM_CALL
|
|
560
|
-
|
|
561
547
|
RG_UNREACHABLE();
|
|
562
548
|
}
|
|
563
549
|
|