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