koffi 1.1.0-beta.1 → 1.1.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CMakeLists.txt +4 -0
- package/README.md +20 -11
- package/build/qemu/1.1.0-beta.4/koffi_darwin_x64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.4/koffi_freebsd_arm64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.4/koffi_freebsd_ia32.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.4/koffi_freebsd_x64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.4/koffi_linux_arm.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.4/koffi_linux_arm64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.4/koffi_linux_ia32.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.4/koffi_linux_x64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.4/koffi_win32_ia32.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.4/koffi_win32_x64.tar.gz +0 -0
- package/package.json +1 -1
- package/qemu/qemu.js +1 -0
- package/src/abi_arm32.cc +27 -45
- package/src/abi_arm64.cc +58 -132
- package/src/abi_x64_sysv.cc +24 -7
- package/src/abi_x64_win.cc +3 -0
- package/src/abi_x86.cc +3 -0
- package/src/call.cc +540 -33
- package/src/call.hh +5 -3
- package/src/ffi.cc +129 -4
- package/src/ffi.hh +5 -1
- package/src/parser.cc +7 -2
- package/src/util.cc +72 -0
- package/src/util.hh +2 -0
- package/test/misc.c +14 -8
- package/vendor/node-addon-api/CODE_OF_CONDUCT.md +4 -0
- package/vendor/node-addon-api/CONTRIBUTING.md +93 -0
- package/vendor/node-addon-api/appveyor.yml +37 -0
- package/vendor/node-addon-api/benchmark/README.md +47 -0
- package/vendor/node-addon-api/benchmark/binding.gyp +25 -0
- package/vendor/node-addon-api/benchmark/function_args.cc +217 -0
- package/vendor/node-addon-api/benchmark/function_args.js +60 -0
- package/vendor/node-addon-api/benchmark/index.js +34 -0
- package/vendor/node-addon-api/benchmark/property_descriptor.cc +91 -0
- package/vendor/node-addon-api/benchmark/property_descriptor.js +37 -0
- package/vendor/node-addon-api/doc/addon.md +163 -0
- package/vendor/node-addon-api/doc/array.md +81 -0
- package/vendor/node-addon-api/doc/array_buffer.md +155 -0
- package/vendor/node-addon-api/doc/async_context.md +86 -0
- package/vendor/node-addon-api/doc/async_operations.md +31 -0
- package/vendor/node-addon-api/doc/async_worker.md +427 -0
- package/vendor/node-addon-api/doc/async_worker_variants.md +557 -0
- package/vendor/node-addon-api/doc/bigint.md +97 -0
- package/vendor/node-addon-api/doc/boolean.md +68 -0
- package/vendor/node-addon-api/doc/buffer.md +150 -0
- package/vendor/node-addon-api/doc/callback_scope.md +54 -0
- package/vendor/node-addon-api/doc/callbackinfo.md +97 -0
- package/vendor/node-addon-api/doc/checker-tool.md +32 -0
- package/vendor/node-addon-api/doc/class_property_descriptor.md +123 -0
- package/vendor/node-addon-api/doc/cmake-js.md +68 -0
- package/vendor/node-addon-api/doc/conversion-tool.md +28 -0
- package/vendor/node-addon-api/doc/creating_a_release.md +62 -0
- package/vendor/node-addon-api/doc/dataview.md +248 -0
- package/vendor/node-addon-api/doc/date.md +68 -0
- package/vendor/node-addon-api/doc/env.md +196 -0
- package/vendor/node-addon-api/doc/error.md +120 -0
- package/vendor/node-addon-api/doc/error_handling.md +254 -0
- package/vendor/node-addon-api/doc/escapable_handle_scope.md +80 -0
- package/vendor/node-addon-api/doc/external.md +63 -0
- package/vendor/node-addon-api/doc/function.md +402 -0
- package/vendor/node-addon-api/doc/function_reference.md +238 -0
- package/vendor/node-addon-api/doc/generator.md +13 -0
- package/vendor/node-addon-api/doc/handle_scope.md +63 -0
- package/vendor/node-addon-api/doc/hierarchy.md +91 -0
- package/vendor/node-addon-api/doc/instance_wrap.md +408 -0
- package/vendor/node-addon-api/doc/maybe.md +76 -0
- package/vendor/node-addon-api/doc/memory_management.md +27 -0
- package/vendor/node-addon-api/doc/name.md +29 -0
- package/vendor/node-addon-api/doc/node-gyp.md +82 -0
- package/vendor/node-addon-api/doc/number.md +163 -0
- package/vendor/node-addon-api/doc/object.md +411 -0
- package/vendor/node-addon-api/doc/object_lifetime_management.md +83 -0
- package/vendor/node-addon-api/doc/object_reference.md +117 -0
- package/vendor/node-addon-api/doc/object_wrap.md +588 -0
- package/vendor/node-addon-api/doc/prebuild_tools.md +16 -0
- package/vendor/node-addon-api/doc/promises.md +79 -0
- package/vendor/node-addon-api/doc/property_descriptor.md +286 -0
- package/vendor/node-addon-api/doc/propertylvalue.md +50 -0
- package/vendor/node-addon-api/doc/range_error.md +59 -0
- package/vendor/node-addon-api/doc/reference.md +113 -0
- package/vendor/node-addon-api/doc/setup.md +110 -0
- package/vendor/node-addon-api/doc/string.md +93 -0
- package/vendor/node-addon-api/doc/symbol.md +61 -0
- package/vendor/node-addon-api/doc/threadsafe.md +121 -0
- package/vendor/node-addon-api/doc/threadsafe_function.md +290 -0
- package/vendor/node-addon-api/doc/type_error.md +59 -0
- package/vendor/node-addon-api/doc/typed_array.md +78 -0
- package/vendor/node-addon-api/doc/typed_array_of.md +137 -0
- package/vendor/node-addon-api/doc/typed_threadsafe_function.md +306 -0
- package/vendor/node-addon-api/doc/value.md +340 -0
- package/vendor/node-addon-api/doc/version_management.md +43 -0
- package/vendor/node-addon-api/package.json +415 -0
- package/vendor/node-addon-api/test/README.md +91 -0
- package/vendor/node-addon-api/test/addon.cc +36 -0
- package/vendor/node-addon-api/test/addon.js +11 -0
- package/vendor/node-addon-api/test/addon_build/index.js +49 -0
- package/vendor/node-addon-api/test/addon_build/tpl/addon.cc +17 -0
- package/vendor/node-addon-api/test/addon_build/tpl/binding.gyp +62 -0
- package/vendor/node-addon-api/test/addon_build/tpl/index.js +9 -0
- package/vendor/node-addon-api/test/addon_build/tpl/package.json +11 -0
- package/vendor/node-addon-api/test/addon_data.cc +99 -0
- package/vendor/node-addon-api/test/addon_data.js +46 -0
- package/vendor/node-addon-api/test/array_buffer.cc +243 -0
- package/vendor/node-addon-api/test/array_buffer.js +69 -0
- package/vendor/node-addon-api/test/async_context.cc +36 -0
- package/vendor/node-addon-api/test/async_context.js +122 -0
- package/vendor/node-addon-api/test/async_progress_queue_worker.cc +83 -0
- package/vendor/node-addon-api/test/async_progress_queue_worker.js +46 -0
- package/vendor/node-addon-api/test/async_progress_worker.cc +134 -0
- package/vendor/node-addon-api/test/async_progress_worker.js +61 -0
- package/vendor/node-addon-api/test/async_worker.cc +106 -0
- package/vendor/node-addon-api/test/async_worker.js +179 -0
- package/vendor/node-addon-api/test/async_worker_nocallback.js +13 -0
- package/vendor/node-addon-api/test/async_worker_persistent.cc +63 -0
- package/vendor/node-addon-api/test/async_worker_persistent.js +24 -0
- package/vendor/node-addon-api/test/basic_types/array.cc +40 -0
- package/vendor/node-addon-api/test/basic_types/array.js +35 -0
- package/vendor/node-addon-api/test/basic_types/boolean.cc +38 -0
- package/vendor/node-addon-api/test/basic_types/boolean.js +35 -0
- package/vendor/node-addon-api/test/basic_types/number.cc +99 -0
- package/vendor/node-addon-api/test/basic_types/number.js +114 -0
- package/vendor/node-addon-api/test/basic_types/value.cc +120 -0
- package/vendor/node-addon-api/test/basic_types/value.js +133 -0
- package/vendor/node-addon-api/test/bigint.cc +91 -0
- package/vendor/node-addon-api/test/bigint.js +53 -0
- package/vendor/node-addon-api/test/binding-swallowexcept.cc +12 -0
- package/vendor/node-addon-api/test/binding.cc +173 -0
- package/vendor/node-addon-api/test/binding.gyp +124 -0
- package/vendor/node-addon-api/test/buffer.cc +183 -0
- package/vendor/node-addon-api/test/buffer.js +69 -0
- package/vendor/node-addon-api/test/callbackscope.cc +22 -0
- package/vendor/node-addon-api/test/callbackscope.js +49 -0
- package/vendor/node-addon-api/test/common/index.js +114 -0
- package/vendor/node-addon-api/test/common/test_helper.h +71 -0
- package/vendor/node-addon-api/test/dataview/dataview.cc +48 -0
- package/vendor/node-addon-api/test/dataview/dataview.js +35 -0
- package/vendor/node-addon-api/test/dataview/dataview_read_write.cc +115 -0
- package/vendor/node-addon-api/test/dataview/dataview_read_write.js +90 -0
- package/vendor/node-addon-api/test/date.cc +44 -0
- package/vendor/node-addon-api/test/date.js +18 -0
- package/vendor/node-addon-api/test/env_cleanup.cc +88 -0
- package/vendor/node-addon-api/test/env_cleanup.js +56 -0
- package/vendor/node-addon-api/test/error.cc +287 -0
- package/vendor/node-addon-api/test/error.js +81 -0
- package/vendor/node-addon-api/test/error_handling_for_primitives.cc +13 -0
- package/vendor/node-addon-api/test/error_handling_for_primitives.js +29 -0
- package/vendor/node-addon-api/test/error_terminating_environment.js +95 -0
- package/vendor/node-addon-api/test/external.cc +81 -0
- package/vendor/node-addon-api/test/external.js +88 -0
- package/vendor/node-addon-api/test/function.cc +324 -0
- package/vendor/node-addon-api/test/function.js +133 -0
- package/vendor/node-addon-api/test/function_reference.cc +202 -0
- package/vendor/node-addon-api/test/function_reference.js +157 -0
- package/vendor/node-addon-api/test/globalObject/global_object.cc +61 -0
- package/vendor/node-addon-api/test/globalObject/global_object_delete_property.cc +31 -0
- package/vendor/node-addon-api/test/globalObject/global_object_delete_property.js +61 -0
- package/vendor/node-addon-api/test/globalObject/global_object_get_property.cc +40 -0
- package/vendor/node-addon-api/test/globalObject/global_object_get_property.js +57 -0
- package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.cc +28 -0
- package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.js +48 -0
- package/vendor/node-addon-api/test/globalObject/global_object_set_property.cc +31 -0
- package/vendor/node-addon-api/test/globalObject/global_object_set_property.js +58 -0
- package/vendor/node-addon-api/test/handlescope.cc +60 -0
- package/vendor/node-addon-api/test/handlescope.js +14 -0
- package/vendor/node-addon-api/test/index.js +159 -0
- package/vendor/node-addon-api/test/maybe/check.cc +23 -0
- package/vendor/node-addon-api/test/maybe/index.js +38 -0
- package/vendor/node-addon-api/test/memory_management.cc +17 -0
- package/vendor/node-addon-api/test/memory_management.js +9 -0
- package/vendor/node-addon-api/test/movable_callbacks.cc +23 -0
- package/vendor/node-addon-api/test/movable_callbacks.js +21 -0
- package/vendor/node-addon-api/test/name.cc +108 -0
- package/vendor/node-addon-api/test/name.js +59 -0
- package/vendor/node-addon-api/test/napi_child.js +14 -0
- package/vendor/node-addon-api/test/object/delete_property.cc +38 -0
- package/vendor/node-addon-api/test/object/delete_property.js +41 -0
- package/vendor/node-addon-api/test/object/finalizer.cc +29 -0
- package/vendor/node-addon-api/test/object/finalizer.js +28 -0
- package/vendor/node-addon-api/test/object/get_property.cc +34 -0
- package/vendor/node-addon-api/test/object/get_property.js +40 -0
- package/vendor/node-addon-api/test/object/has_own_property.cc +34 -0
- package/vendor/node-addon-api/test/object/has_own_property.js +34 -0
- package/vendor/node-addon-api/test/object/has_property.cc +38 -0
- package/vendor/node-addon-api/test/object/has_property.js +37 -0
- package/vendor/node-addon-api/test/object/object.cc +350 -0
- package/vendor/node-addon-api/test/object/object.js +217 -0
- package/vendor/node-addon-api/test/object/object_deprecated.cc +66 -0
- package/vendor/node-addon-api/test/object/object_deprecated.js +47 -0
- package/vendor/node-addon-api/test/object/object_freeze_seal.cc +25 -0
- package/vendor/node-addon-api/test/object/object_freeze_seal.js +61 -0
- package/vendor/node-addon-api/test/object/set_property.cc +45 -0
- package/vendor/node-addon-api/test/object/set_property.js +30 -0
- package/vendor/node-addon-api/test/object/subscript_operator.cc +58 -0
- package/vendor/node-addon-api/test/object/subscript_operator.js +17 -0
- package/vendor/node-addon-api/test/object_reference.cc +219 -0
- package/vendor/node-addon-api/test/object_reference.js +259 -0
- package/vendor/node-addon-api/test/objectwrap.cc +268 -0
- package/vendor/node-addon-api/test/objectwrap.js +284 -0
- package/vendor/node-addon-api/test/objectwrap_constructor_exception.cc +26 -0
- package/vendor/node-addon-api/test/objectwrap_constructor_exception.js +18 -0
- package/vendor/node-addon-api/test/objectwrap_function.cc +45 -0
- package/vendor/node-addon-api/test/objectwrap_function.js +22 -0
- package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.cc +30 -0
- package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.js +13 -0
- package/vendor/node-addon-api/test/objectwrap_removewrap.cc +45 -0
- package/vendor/node-addon-api/test/objectwrap_removewrap.js +40 -0
- package/vendor/node-addon-api/test/objectwrap_worker_thread.js +19 -0
- package/vendor/node-addon-api/test/promise.cc +29 -0
- package/vendor/node-addon-api/test/promise.js +18 -0
- package/vendor/node-addon-api/test/reference.cc +24 -0
- package/vendor/node-addon-api/test/reference.js +14 -0
- package/vendor/node-addon-api/test/run_script.cc +56 -0
- package/vendor/node-addon-api/test/run_script.js +45 -0
- package/vendor/node-addon-api/test/symbol.cc +79 -0
- package/vendor/node-addon-api/test/symbol.js +73 -0
- package/vendor/node-addon-api/test/testUtil.js +54 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.cc +195 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.js +188 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.cc +63 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.js +12 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.cc +115 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.js +14 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.cc +26 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.js +7 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.cc +225 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.js +59 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.cc +42 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.js +53 -0
- package/vendor/node-addon-api/test/thunking_manual.cc +140 -0
- package/vendor/node-addon-api/test/thunking_manual.js +17 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.cc +215 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.js +188 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.cc +68 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.js +12 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.cc +127 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.js +14 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.cc +28 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.js +7 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.cc +237 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.js +59 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.cc +53 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.js +53 -0
- package/vendor/node-addon-api/test/typedarray-bigint.js +58 -0
- package/vendor/node-addon-api/test/typedarray.cc +216 -0
- package/vendor/node-addon-api/test/typedarray.js +69 -0
- package/vendor/node-addon-api/test/version_management.cc +27 -0
- package/vendor/node-addon-api/test/version_management.js +31 -0
- package/vendor/node-addon-api/unit-test/README.md +28 -0
- package/vendor/node-addon-api/unit-test/binding-file-template.js +39 -0
- package/vendor/node-addon-api/unit-test/binding.gyp +72 -0
- package/vendor/node-addon-api/unit-test/exceptions.js +32 -0
- package/vendor/node-addon-api/unit-test/generate-binding-cc.js +61 -0
- package/vendor/node-addon-api/unit-test/injectTestParams.js +101 -0
- package/vendor/node-addon-api/unit-test/listOfTestModules.js +88 -0
- package/vendor/node-addon-api/unit-test/matchModules.js +65 -0
- package/vendor/node-addon-api/unit-test/setup.js +13 -0
- package/vendor/node-addon-api/unit-test/spawnTask.js +26 -0
- package/vendor/node-addon-api/unit-test/test.js +30 -0
- package/build/qemu/1.1.0-beta.1/koffi_darwin_x64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.1/koffi_freebsd_arm64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.1/koffi_freebsd_ia32.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.1/koffi_freebsd_x64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.1/koffi_linux_arm.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.1/koffi_linux_arm64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.1/koffi_linux_ia32.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.1/koffi_linux_x64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.1/koffi_win32_ia32.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.1/koffi_win32_x64.tar.gz +0 -0
package/src/call.cc
CHANGED
|
@@ -114,7 +114,7 @@ const char16_t *CallData::PushString16(const Napi::Value &value)
|
|
|
114
114
|
return buf.ptr;
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
-
bool CallData::PushObject(const Napi::Object &obj, const TypeInfo *type, uint8_t *dest)
|
|
117
|
+
bool CallData::PushObject(const Napi::Object &obj, const TypeInfo *type, uint8_t *dest, int16_t realign)
|
|
118
118
|
{
|
|
119
119
|
RG_ASSERT(IsObject(obj));
|
|
120
120
|
RG_ASSERT(type->primitive == PrimitiveKind::Record);
|
|
@@ -127,21 +127,21 @@ bool CallData::PushObject(const Napi::Object &obj, const TypeInfo *type, uint8_t
|
|
|
127
127
|
return false;
|
|
128
128
|
}
|
|
129
129
|
|
|
130
|
-
|
|
130
|
+
int16_t align = std::max(member.align, realign);
|
|
131
|
+
dest = AlignUp(dest, align);
|
|
131
132
|
|
|
132
133
|
switch (member.type->primitive) {
|
|
133
134
|
case PrimitiveKind::Void: { RG_UNREACHABLE(); } break;
|
|
134
135
|
|
|
135
136
|
case PrimitiveKind::Bool: {
|
|
136
137
|
if (RG_UNLIKELY(!value.IsBoolean())) {
|
|
137
|
-
ThrowError<Napi::TypeError>(env, "Unexpected
|
|
138
|
+
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for member '%2', expected boolean", GetValueType(instance, value), member.name);
|
|
138
139
|
return false;
|
|
139
140
|
}
|
|
140
141
|
|
|
141
142
|
bool b = value.As<Napi::Boolean>();
|
|
142
143
|
*(bool *)dest = b;
|
|
143
144
|
} break;
|
|
144
|
-
|
|
145
145
|
case PrimitiveKind::Int8:
|
|
146
146
|
case PrimitiveKind::UInt8:
|
|
147
147
|
case PrimitiveKind::Int16:
|
|
@@ -151,7 +151,7 @@ bool CallData::PushObject(const Napi::Object &obj, const TypeInfo *type, uint8_t
|
|
|
151
151
|
case PrimitiveKind::Int64:
|
|
152
152
|
case PrimitiveKind::UInt64: {
|
|
153
153
|
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
154
|
-
ThrowError<Napi::TypeError>(env, "Unexpected
|
|
154
|
+
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for member '%2', expected number", GetValueType(instance, value), member.name);
|
|
155
155
|
return false;
|
|
156
156
|
}
|
|
157
157
|
|
|
@@ -160,7 +160,7 @@ bool CallData::PushObject(const Napi::Object &obj, const TypeInfo *type, uint8_t
|
|
|
160
160
|
} break;
|
|
161
161
|
case PrimitiveKind::String: {
|
|
162
162
|
if (RG_UNLIKELY(!value.IsString())) {
|
|
163
|
-
ThrowError<Napi::TypeError>(env, "Unexpected
|
|
163
|
+
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for member '%2', expected string", GetValueType(instance, value), member.name);
|
|
164
164
|
return false;
|
|
165
165
|
}
|
|
166
166
|
|
|
@@ -171,7 +171,7 @@ bool CallData::PushObject(const Napi::Object &obj, const TypeInfo *type, uint8_t
|
|
|
171
171
|
} break;
|
|
172
172
|
case PrimitiveKind::String16: {
|
|
173
173
|
if (RG_UNLIKELY(!value.IsString())) {
|
|
174
|
-
ThrowError<Napi::TypeError>(env, "Unexpected
|
|
174
|
+
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for member '%2', expected string", GetValueType(instance, value), member.name);
|
|
175
175
|
return false;
|
|
176
176
|
}
|
|
177
177
|
|
|
@@ -192,31 +192,41 @@ bool CallData::PushObject(const Napi::Object &obj, const TypeInfo *type, uint8_t
|
|
|
192
192
|
} break;
|
|
193
193
|
case PrimitiveKind::Record: {
|
|
194
194
|
if (RG_UNLIKELY(!IsObject(value))) {
|
|
195
|
-
ThrowError<Napi::TypeError>(env, "Unexpected
|
|
195
|
+
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for member '%2', expected object", GetValueType(instance, value), member.name);
|
|
196
196
|
return false;
|
|
197
197
|
}
|
|
198
198
|
|
|
199
199
|
Napi::Object obj = value.As<Napi::Object>();
|
|
200
|
-
if (!PushObject(obj, member.type, dest))
|
|
200
|
+
if (!PushObject(obj, member.type, dest, realign))
|
|
201
|
+
return false;
|
|
202
|
+
} break;
|
|
203
|
+
case PrimitiveKind::Array: {
|
|
204
|
+
if (RG_UNLIKELY(!value.IsArray() && !value.IsTypedArray())) {
|
|
205
|
+
ThrowError<Napi::TypeError>(env, "Unexpected value %1 for member '%2', expected array", GetValueType(instance, value), member.name);
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
Napi::Array array = value.As<Napi::Array>();
|
|
210
|
+
if (!PushArray(array, member.type, dest, realign))
|
|
201
211
|
return false;
|
|
202
212
|
} break;
|
|
203
213
|
case PrimitiveKind::Float32: {
|
|
204
214
|
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
205
|
-
ThrowError<Napi::TypeError>(env, "Unexpected
|
|
215
|
+
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for member '%2', expected number", GetValueType(instance, value), member.name);
|
|
206
216
|
return false;
|
|
207
217
|
}
|
|
208
218
|
|
|
209
219
|
float f = CopyNumber<float>(value);
|
|
210
|
-
|
|
220
|
+
*(float *)dest = f;
|
|
211
221
|
} break;
|
|
212
222
|
case PrimitiveKind::Float64: {
|
|
213
223
|
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
214
|
-
ThrowError<Napi::TypeError>(env, "Unexpected
|
|
224
|
+
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for member '%2', expected number", GetValueType(instance, value), member.name);
|
|
215
225
|
return false;
|
|
216
226
|
}
|
|
217
227
|
|
|
218
228
|
double d = CopyNumber<double>(value);
|
|
219
|
-
|
|
229
|
+
*(double *)dest = d;
|
|
220
230
|
} break;
|
|
221
231
|
}
|
|
222
232
|
|
|
@@ -226,62 +236,297 @@ bool CallData::PushObject(const Napi::Object &obj, const TypeInfo *type, uint8_t
|
|
|
226
236
|
return true;
|
|
227
237
|
}
|
|
228
238
|
|
|
229
|
-
|
|
239
|
+
bool CallData::PushArray(const Napi::Object &obj, const TypeInfo *type, uint8_t *dest, int16_t realign)
|
|
240
|
+
{
|
|
241
|
+
RG_ASSERT(obj.IsArray() || obj.IsTypedArray());
|
|
242
|
+
RG_ASSERT(type->primitive == PrimitiveKind::Array);
|
|
243
|
+
|
|
244
|
+
uint32_t len = type->size / type->ref->size;
|
|
245
|
+
|
|
246
|
+
if (obj.IsArray()) {
|
|
247
|
+
Napi::Array array = obj.As<Napi::Array>();
|
|
248
|
+
|
|
249
|
+
if (array.Length() != len) {
|
|
250
|
+
ThrowError<Napi::Error>(env, "Expected array of length %1, got %2", len, array.Length());
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
switch (type->ref->primitive) {
|
|
255
|
+
case PrimitiveKind::Void: { RG_UNREACHABLE(); } break;
|
|
256
|
+
|
|
257
|
+
case PrimitiveKind::Bool: {
|
|
258
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
259
|
+
Napi::Value value = array[i];
|
|
260
|
+
|
|
261
|
+
int16_t align = std::max(type->ref->align, realign);
|
|
262
|
+
dest = AlignUp(dest, align);
|
|
263
|
+
|
|
264
|
+
if (RG_UNLIKELY(!value.IsBoolean())) {
|
|
265
|
+
ThrowError<Napi::TypeError>(env, "Unexpected value %1 in array, expected boolean", GetValueType(instance, value));
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
bool b = value.As<Napi::Boolean>();
|
|
270
|
+
*(bool *)dest = b;
|
|
271
|
+
|
|
272
|
+
dest += type->ref->size;
|
|
273
|
+
}
|
|
274
|
+
} break;
|
|
275
|
+
case PrimitiveKind::Int8:
|
|
276
|
+
case PrimitiveKind::UInt8:
|
|
277
|
+
case PrimitiveKind::Int16:
|
|
278
|
+
case PrimitiveKind::UInt16:
|
|
279
|
+
case PrimitiveKind::Int32:
|
|
280
|
+
case PrimitiveKind::UInt32:
|
|
281
|
+
case PrimitiveKind::Int64:
|
|
282
|
+
case PrimitiveKind::UInt64: {
|
|
283
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
284
|
+
Napi::Value value = array[i];
|
|
285
|
+
|
|
286
|
+
int16_t align = std::max(type->ref->align, realign);
|
|
287
|
+
dest = AlignUp(dest, align);
|
|
288
|
+
|
|
289
|
+
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
290
|
+
ThrowError<Napi::TypeError>(env, "Unexpected value %1 in array, expected number", GetValueType(instance, value));
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
int64_t v = CopyNumber<int64_t>(value);
|
|
295
|
+
memcpy(dest, &v, type->ref->size); // Little Endian
|
|
296
|
+
|
|
297
|
+
dest += type->ref->size;
|
|
298
|
+
}
|
|
299
|
+
} break;
|
|
300
|
+
case PrimitiveKind::String: {
|
|
301
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
302
|
+
Napi::Value value = array[i];
|
|
303
|
+
|
|
304
|
+
int16_t align = std::max(type->ref->align, realign);
|
|
305
|
+
dest = AlignUp(dest, align);
|
|
306
|
+
|
|
307
|
+
if (RG_UNLIKELY(!value.IsString())) {
|
|
308
|
+
ThrowError<Napi::TypeError>(env, "Unexpected value %1 in array, expected string", GetValueType(instance, value));
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
const char *str = PushString(value);
|
|
313
|
+
if (RG_UNLIKELY(!str))
|
|
314
|
+
return false;
|
|
315
|
+
*(const char **)dest = str;
|
|
316
|
+
|
|
317
|
+
dest += type->ref->size;
|
|
318
|
+
}
|
|
319
|
+
} break;
|
|
320
|
+
case PrimitiveKind::String16: {
|
|
321
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
322
|
+
Napi::Value value = array[i];
|
|
323
|
+
|
|
324
|
+
int16_t align = std::max(type->ref->align, realign);
|
|
325
|
+
dest = AlignUp(dest, align);
|
|
326
|
+
|
|
327
|
+
if (RG_UNLIKELY(!value.IsString())) {
|
|
328
|
+
ThrowError<Napi::TypeError>(env, "Unexpected value %1 in array, expected string", GetValueType(instance, value));
|
|
329
|
+
return false;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
const char16_t *str16 = PushString16(value);
|
|
333
|
+
if (RG_UNLIKELY(!str16))
|
|
334
|
+
return false;
|
|
335
|
+
*(const char16_t **)dest = str16;
|
|
336
|
+
|
|
337
|
+
dest += type->ref->size;
|
|
338
|
+
}
|
|
339
|
+
} break;
|
|
340
|
+
case PrimitiveKind::Pointer: {
|
|
341
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
342
|
+
Napi::Value value = array[i];
|
|
343
|
+
|
|
344
|
+
int16_t align = std::max(type->ref->align, realign);
|
|
345
|
+
dest = AlignUp(dest, align);
|
|
346
|
+
|
|
347
|
+
if (RG_UNLIKELY(!CheckValueTag(instance, value, type->ref))) {
|
|
348
|
+
ThrowError<Napi::TypeError>(env, "Unexpected value %1 in array, expected %2", GetValueType(instance, value), type->ref->name);
|
|
349
|
+
return false;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
Napi::External external = value.As<Napi::External<void>>();
|
|
353
|
+
*(void **)dest = external.Data();
|
|
354
|
+
|
|
355
|
+
dest += type->ref->size;
|
|
356
|
+
}
|
|
357
|
+
} break;
|
|
358
|
+
case PrimitiveKind::Record: {
|
|
359
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
360
|
+
Napi::Value value = array[i];
|
|
361
|
+
|
|
362
|
+
int16_t align = std::max(type->ref->align, realign);
|
|
363
|
+
dest = AlignUp(dest, align);
|
|
364
|
+
|
|
365
|
+
if (RG_UNLIKELY(!IsObject(value))) {
|
|
366
|
+
ThrowError<Napi::TypeError>(env, "Unexpected value %1 in array, expected object", GetValueType(instance, value));
|
|
367
|
+
return false;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
Napi::Object obj = value.As<Napi::Object>();
|
|
371
|
+
if (!PushObject(obj, type->ref, dest, realign))
|
|
372
|
+
return false;
|
|
373
|
+
|
|
374
|
+
dest += type->ref->size;
|
|
375
|
+
}
|
|
376
|
+
} break;
|
|
377
|
+
case PrimitiveKind::Array: {
|
|
378
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
379
|
+
Napi::Value value = array[i];
|
|
380
|
+
|
|
381
|
+
int16_t align = std::max(type->ref->align, realign);
|
|
382
|
+
dest = AlignUp(dest, align);
|
|
383
|
+
|
|
384
|
+
if (RG_UNLIKELY(!value.IsArray() && !value.IsTypedArray())) {
|
|
385
|
+
ThrowError<Napi::TypeError>(env, "Unexpected value %1 in array, expected array", GetValueType(instance, value));
|
|
386
|
+
return false;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
Napi::Array array = value.As<Napi::Array>();
|
|
390
|
+
if (!PushArray(array, type->ref, dest, realign))
|
|
391
|
+
return false;
|
|
392
|
+
|
|
393
|
+
dest += type->ref->size;
|
|
394
|
+
}
|
|
395
|
+
} break;
|
|
396
|
+
case PrimitiveKind::Float32: {
|
|
397
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
398
|
+
Napi::Value value = array[i];
|
|
399
|
+
|
|
400
|
+
int16_t align = std::max(type->ref->align, realign);
|
|
401
|
+
dest = AlignUp(dest, align);
|
|
402
|
+
|
|
403
|
+
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
404
|
+
ThrowError<Napi::TypeError>(env, "Unexpected value %1 in array, expected number", GetValueType(instance, value));
|
|
405
|
+
return false;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
float f = CopyNumber<float>(value);
|
|
409
|
+
*(float *)dest = f;
|
|
410
|
+
|
|
411
|
+
dest += type->ref->size;
|
|
412
|
+
}
|
|
413
|
+
} break;
|
|
414
|
+
case PrimitiveKind::Float64: {
|
|
415
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
416
|
+
Napi::Value value = array[i];
|
|
417
|
+
|
|
418
|
+
int16_t align = std::max(type->ref->align, realign);
|
|
419
|
+
dest = AlignUp(dest, align);
|
|
420
|
+
|
|
421
|
+
if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
|
|
422
|
+
ThrowError<Napi::TypeError>(env, "Unexpected value %1 in array, expected number", GetValueType(instance, value));
|
|
423
|
+
return false;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
double d = CopyNumber<double>(value);
|
|
427
|
+
*(double *)dest = d;
|
|
428
|
+
|
|
429
|
+
dest += type->ref->size;
|
|
430
|
+
}
|
|
431
|
+
} break;
|
|
432
|
+
}
|
|
433
|
+
} else {
|
|
434
|
+
Napi::TypedArray array = obj.As<Napi::TypedArray>();
|
|
435
|
+
const uint8_t *buf = (const uint8_t *)array.ArrayBuffer().Data();
|
|
436
|
+
|
|
437
|
+
if (array.ElementLength() != len) {
|
|
438
|
+
ThrowError<Napi::Error>(env, "Expected array of length %1, got %2", len, array.ElementLength());
|
|
439
|
+
return false;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
bool match;
|
|
443
|
+
switch (type->ref->primitive) {
|
|
444
|
+
case PrimitiveKind::Int8: { match = (array.TypedArrayType() == napi_int8_array); } break;
|
|
445
|
+
case PrimitiveKind::UInt8: { match = (array.TypedArrayType() == napi_uint8_array); } break;
|
|
446
|
+
case PrimitiveKind::Int16: { match = (array.TypedArrayType() == napi_int16_array); } break;
|
|
447
|
+
case PrimitiveKind::UInt16: { match = (array.TypedArrayType() == napi_uint16_array); } break;
|
|
448
|
+
case PrimitiveKind::Int32: { match = (array.TypedArrayType() == napi_int32_array); } break;
|
|
449
|
+
case PrimitiveKind::UInt32: { match = (array.TypedArrayType() == napi_uint32_array); } break;
|
|
450
|
+
case PrimitiveKind::Float32: { match = (array.TypedArrayType() == napi_float32_array); } break;
|
|
451
|
+
case PrimitiveKind::Float64: { match = (array.TypedArrayType() == napi_float64_array); } break;
|
|
452
|
+
|
|
453
|
+
default: { match = false; } break;
|
|
454
|
+
}
|
|
455
|
+
if (!match) {
|
|
456
|
+
ThrowError<Napi::TypeError>(env, "TypedArray is not approriate for %1 array", type->ref->name);
|
|
457
|
+
return false;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
461
|
+
int16_t align = std::max(type->ref->align, realign);
|
|
462
|
+
dest = AlignUp(dest, align);
|
|
463
|
+
|
|
464
|
+
memcpy(dest, buf + i * type->ref->size, type->ref->size);
|
|
465
|
+
|
|
466
|
+
dest += type->ref->size;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
return true;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
void CallData::PopObject(Napi::Object obj, const uint8_t *src, const TypeInfo *type, int16_t realign)
|
|
230
474
|
{
|
|
231
475
|
RG_ASSERT(type->primitive == PrimitiveKind::Record);
|
|
232
476
|
|
|
233
477
|
for (const RecordMember &member: type->members) {
|
|
234
|
-
|
|
478
|
+
int16_t align = std::max(realign, member.align);
|
|
479
|
+
src = AlignUp(src, align);
|
|
235
480
|
|
|
236
481
|
switch (member.type->primitive) {
|
|
237
482
|
case PrimitiveKind::Void: { RG_UNREACHABLE(); } break;
|
|
238
483
|
|
|
239
484
|
case PrimitiveKind::Bool: {
|
|
240
|
-
bool b = *(bool *)
|
|
485
|
+
bool b = *(bool *)src;
|
|
241
486
|
obj.Set(member.name, Napi::Boolean::New(env, b));
|
|
242
487
|
} break;
|
|
243
488
|
case PrimitiveKind::Int8: {
|
|
244
|
-
double d = (double)*(int8_t *)
|
|
489
|
+
double d = (double)*(int8_t *)src;
|
|
245
490
|
obj.Set(member.name, Napi::Number::New(env, d));
|
|
246
491
|
} break;
|
|
247
492
|
case PrimitiveKind::UInt8: {
|
|
248
|
-
double d = (double)*(uint8_t *)
|
|
493
|
+
double d = (double)*(uint8_t *)src;
|
|
249
494
|
obj.Set(member.name, Napi::Number::New(env, d));
|
|
250
495
|
} break;
|
|
251
496
|
case PrimitiveKind::Int16: {
|
|
252
|
-
double d = (double)*(int16_t *)
|
|
497
|
+
double d = (double)*(int16_t *)src;
|
|
253
498
|
obj.Set(member.name, Napi::Number::New(env, d));
|
|
254
499
|
} break;
|
|
255
500
|
case PrimitiveKind::UInt16: {
|
|
256
|
-
double d = (double)*(uint16_t *)
|
|
501
|
+
double d = (double)*(uint16_t *)src;
|
|
257
502
|
obj.Set(member.name, Napi::Number::New(env, d));
|
|
258
503
|
} break;
|
|
259
504
|
case PrimitiveKind::Int32: {
|
|
260
|
-
double d = (double)*(int32_t *)
|
|
505
|
+
double d = (double)*(int32_t *)src;
|
|
261
506
|
obj.Set(member.name, Napi::Number::New(env, d));
|
|
262
507
|
} break;
|
|
263
508
|
case PrimitiveKind::UInt32: {
|
|
264
|
-
double d = (double)*(uint32_t *)
|
|
509
|
+
double d = (double)*(uint32_t *)src;
|
|
265
510
|
obj.Set(member.name, Napi::Number::New(env, d));
|
|
266
511
|
} break;
|
|
267
512
|
case PrimitiveKind::Int64: {
|
|
268
|
-
int64_t v = *(int64_t *)
|
|
513
|
+
int64_t v = *(int64_t *)src;
|
|
269
514
|
obj.Set(member.name, Napi::BigInt::New(env, v));
|
|
270
515
|
} break;
|
|
271
516
|
case PrimitiveKind::UInt64: {
|
|
272
|
-
uint64_t v = *(uint64_t *)
|
|
517
|
+
uint64_t v = *(uint64_t *)src;
|
|
273
518
|
obj.Set(member.name, Napi::BigInt::New(env, v));
|
|
274
519
|
} break;
|
|
275
520
|
case PrimitiveKind::String: {
|
|
276
|
-
const char *str = *(const char **)
|
|
521
|
+
const char *str = *(const char **)src;
|
|
277
522
|
obj.Set(member.name, Napi::String::New(env, str));
|
|
278
523
|
} break;
|
|
279
524
|
case PrimitiveKind::String16: {
|
|
280
|
-
const char16_t *str16 = *(const char16_t **)
|
|
525
|
+
const char16_t *str16 = *(const char16_t **)src;
|
|
281
526
|
obj.Set(member.name, Napi::String::New(env, str16));
|
|
282
527
|
} break;
|
|
283
528
|
case PrimitiveKind::Pointer: {
|
|
284
|
-
void *ptr2 = *(void **)
|
|
529
|
+
void *ptr2 = *(void **)src;
|
|
285
530
|
|
|
286
531
|
Napi::External<void> external = Napi::External<void>::New(env, ptr2);
|
|
287
532
|
SetValueTag(instance, external, member.type);
|
|
@@ -289,32 +534,294 @@ void CallData::PopObject(Napi::Object obj, const uint8_t *ptr, const TypeInfo *t
|
|
|
289
534
|
obj.Set(member.name, external);
|
|
290
535
|
} break;
|
|
291
536
|
case PrimitiveKind::Record: {
|
|
292
|
-
Napi::Object obj2 = PopObject(
|
|
537
|
+
Napi::Object obj2 = PopObject(src, member.type, realign);
|
|
538
|
+
obj.Set(member.name, obj2);
|
|
539
|
+
} break;
|
|
540
|
+
case PrimitiveKind::Array: {
|
|
541
|
+
Napi::Object obj2 = PopArray(src, member.type, realign);
|
|
293
542
|
obj.Set(member.name, obj2);
|
|
294
543
|
} break;
|
|
295
544
|
case PrimitiveKind::Float32: {
|
|
296
545
|
float f;
|
|
297
|
-
memcpy(&f,
|
|
546
|
+
memcpy(&f, src, 4);
|
|
298
547
|
obj.Set(member.name, Napi::Number::New(env, (double)f));
|
|
299
548
|
} break;
|
|
300
549
|
case PrimitiveKind::Float64: {
|
|
301
550
|
double d;
|
|
302
|
-
memcpy(&d,
|
|
551
|
+
memcpy(&d, src, 8);
|
|
303
552
|
obj.Set(member.name, Napi::Number::New(env, d));
|
|
304
553
|
} break;
|
|
305
554
|
}
|
|
306
555
|
|
|
307
|
-
|
|
556
|
+
src += member.type->size;
|
|
308
557
|
}
|
|
309
558
|
}
|
|
310
559
|
|
|
311
|
-
Napi::Object CallData::PopObject(const uint8_t *
|
|
560
|
+
Napi::Object CallData::PopObject(const uint8_t *src, const TypeInfo *type, int16_t realign)
|
|
312
561
|
{
|
|
313
562
|
Napi::Object obj = Napi::Object::New(env);
|
|
314
|
-
PopObject(obj,
|
|
563
|
+
PopObject(obj, src, type, realign);
|
|
315
564
|
return obj;
|
|
316
565
|
}
|
|
317
566
|
|
|
567
|
+
Napi::Object CallData::PopArray(const uint8_t *src, const TypeInfo *type, int16_t realign)
|
|
568
|
+
{
|
|
569
|
+
RG_ASSERT(type->primitive == PrimitiveKind::Array);
|
|
570
|
+
|
|
571
|
+
uint32_t len = type->size / type->ref->size;
|
|
572
|
+
|
|
573
|
+
switch (type->ref->primitive) {
|
|
574
|
+
case PrimitiveKind::Void: { RG_UNREACHABLE(); } break;
|
|
575
|
+
|
|
576
|
+
case PrimitiveKind::Bool: {
|
|
577
|
+
Napi::Array array = Napi::Array::New(env);
|
|
578
|
+
|
|
579
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
580
|
+
int16_t align = std::max(realign, type->ref->align);
|
|
581
|
+
src = AlignUp(src, align);
|
|
582
|
+
|
|
583
|
+
bool b = *(bool *)src;
|
|
584
|
+
array.Set(i, Napi::Boolean::New(env, b));
|
|
585
|
+
|
|
586
|
+
src += type->ref->size;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
return array;
|
|
590
|
+
} break;
|
|
591
|
+
case PrimitiveKind::Int8: {
|
|
592
|
+
Napi::Int8Array array = Napi::Int8Array::New(env, len);
|
|
593
|
+
|
|
594
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
595
|
+
int16_t align = std::max(realign, type->ref->align);
|
|
596
|
+
src = AlignUp(src, align);
|
|
597
|
+
|
|
598
|
+
int8_t v = *(int8_t *)src;
|
|
599
|
+
array[i] = v;
|
|
600
|
+
|
|
601
|
+
src += type->ref->size;
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
return array;
|
|
605
|
+
} break;
|
|
606
|
+
case PrimitiveKind::UInt8: {
|
|
607
|
+
Napi::Uint8Array array = Napi::Uint8Array::New(env, len);
|
|
608
|
+
|
|
609
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
610
|
+
int16_t align = std::max(realign, type->ref->align);
|
|
611
|
+
src = AlignUp(src, align);
|
|
612
|
+
|
|
613
|
+
uint8_t v = *(uint8_t *)src;
|
|
614
|
+
array[i] = v;
|
|
615
|
+
|
|
616
|
+
src += type->ref->size;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
return array;
|
|
620
|
+
} break;
|
|
621
|
+
case PrimitiveKind::Int16: {
|
|
622
|
+
Napi::Int16Array array = Napi::Int16Array::New(env, len);
|
|
623
|
+
|
|
624
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
625
|
+
int16_t align = std::max(realign, type->ref->align);
|
|
626
|
+
src = AlignUp(src, align);
|
|
627
|
+
|
|
628
|
+
int16_t v = *(int16_t *)src;
|
|
629
|
+
array[i] = v;
|
|
630
|
+
|
|
631
|
+
src += type->ref->size;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
return array;
|
|
635
|
+
} break;
|
|
636
|
+
case PrimitiveKind::UInt16: {
|
|
637
|
+
Napi::Uint16Array array = Napi::Uint16Array::New(env, len);
|
|
638
|
+
|
|
639
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
640
|
+
int16_t align = std::max(realign, type->ref->align);
|
|
641
|
+
src = AlignUp(src, align);
|
|
642
|
+
|
|
643
|
+
uint16_t v = *(uint16_t *)src;
|
|
644
|
+
array[i] = v;
|
|
645
|
+
|
|
646
|
+
src += type->ref->size;
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
return array;
|
|
650
|
+
} break;
|
|
651
|
+
case PrimitiveKind::Int32: {
|
|
652
|
+
Napi::Int32Array array = Napi::Int32Array::New(env, len);
|
|
653
|
+
|
|
654
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
655
|
+
int16_t align = std::max(realign, type->ref->align);
|
|
656
|
+
src = AlignUp(src, align);
|
|
657
|
+
|
|
658
|
+
int32_t v = *(int32_t *)src;
|
|
659
|
+
array[i] = v;
|
|
660
|
+
|
|
661
|
+
src += type->ref->size;
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
return array;
|
|
665
|
+
} break;
|
|
666
|
+
case PrimitiveKind::UInt32: {
|
|
667
|
+
Napi::Uint32Array array = Napi::Uint32Array::New(env, len);
|
|
668
|
+
|
|
669
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
670
|
+
int16_t align = std::max(realign, type->ref->align);
|
|
671
|
+
src = AlignUp(src, align);
|
|
672
|
+
|
|
673
|
+
uint32_t v = *(uint32_t *)src;
|
|
674
|
+
array[i] = v;
|
|
675
|
+
|
|
676
|
+
src += type->ref->size;
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
return array;
|
|
680
|
+
} break;
|
|
681
|
+
case PrimitiveKind::Int64: {
|
|
682
|
+
Napi::Array array = Napi::Array::New(env);
|
|
683
|
+
|
|
684
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
685
|
+
int16_t align = std::max(realign, type->ref->align);
|
|
686
|
+
src = AlignUp(src, align);
|
|
687
|
+
|
|
688
|
+
int64_t v = *(int64_t *)src;
|
|
689
|
+
array.Set(i, Napi::BigInt::New(env, v));
|
|
690
|
+
|
|
691
|
+
src += type->ref->size;
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
return array;
|
|
695
|
+
} break;
|
|
696
|
+
case PrimitiveKind::UInt64: {
|
|
697
|
+
Napi::Array array = Napi::Array::New(env);
|
|
698
|
+
|
|
699
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
700
|
+
int16_t align = std::max(realign, type->ref->align);
|
|
701
|
+
src = AlignUp(src, align);
|
|
702
|
+
|
|
703
|
+
uint64_t v = *(uint64_t *)src;
|
|
704
|
+
array.Set(i, Napi::BigInt::New(env, v));
|
|
705
|
+
|
|
706
|
+
src += type->ref->size;
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
return array;
|
|
710
|
+
} break;
|
|
711
|
+
case PrimitiveKind::String: {
|
|
712
|
+
Napi::Array array = Napi::Array::New(env);
|
|
713
|
+
|
|
714
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
715
|
+
int16_t align = std::max(realign, type->ref->align);
|
|
716
|
+
src = AlignUp(src, align);
|
|
717
|
+
|
|
718
|
+
const char *str = *(const char **)src;
|
|
719
|
+
array.Set(i, Napi::String::New(env, str));
|
|
720
|
+
|
|
721
|
+
src += type->ref->size;
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
return array;
|
|
725
|
+
} break;
|
|
726
|
+
case PrimitiveKind::String16: {
|
|
727
|
+
Napi::Array array = Napi::Array::New(env);
|
|
728
|
+
|
|
729
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
730
|
+
int16_t align = std::max(realign, type->ref->align);
|
|
731
|
+
src = AlignUp(src, align);
|
|
732
|
+
|
|
733
|
+
const char16_t *str16 = *(const char16_t **)src;
|
|
734
|
+
array.Set(i, Napi::String::New(env, str16));
|
|
735
|
+
|
|
736
|
+
src += type->ref->size;
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
return array;
|
|
740
|
+
} break;
|
|
741
|
+
case PrimitiveKind::Pointer: {
|
|
742
|
+
Napi::Array array = Napi::Array::New(env);
|
|
743
|
+
|
|
744
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
745
|
+
int16_t align = std::max(realign, type->ref->align);
|
|
746
|
+
src = AlignUp(src, align);
|
|
747
|
+
|
|
748
|
+
void *ptr2 = *(void **)src;
|
|
749
|
+
|
|
750
|
+
Napi::External<void> external = Napi::External<void>::New(env, ptr2);
|
|
751
|
+
SetValueTag(instance, external, type->ref);
|
|
752
|
+
|
|
753
|
+
array.Set(i, external);
|
|
754
|
+
|
|
755
|
+
src += type->ref->size;
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
return array;
|
|
759
|
+
} break;
|
|
760
|
+
case PrimitiveKind::Record: {
|
|
761
|
+
Napi::Array array = Napi::Array::New(env);
|
|
762
|
+
|
|
763
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
764
|
+
int16_t align = std::max(realign, type->ref->align);
|
|
765
|
+
src = AlignUp(src, align);
|
|
766
|
+
|
|
767
|
+
Napi::Object obj = PopObject(src, type->ref, realign);
|
|
768
|
+
array.Set(i, obj);
|
|
769
|
+
|
|
770
|
+
src += type->ref->size;
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
return array;
|
|
774
|
+
} break;
|
|
775
|
+
case PrimitiveKind::Array: {
|
|
776
|
+
Napi::Array array = Napi::Array::New(env);
|
|
777
|
+
|
|
778
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
779
|
+
int16_t align = std::max(realign, type->ref->align);
|
|
780
|
+
src = AlignUp(src, align);
|
|
781
|
+
|
|
782
|
+
Napi::Object obj = PopArray(src, type->ref, realign);
|
|
783
|
+
array.Set(i, obj);
|
|
784
|
+
|
|
785
|
+
src += type->ref->size;
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
return array;
|
|
789
|
+
} break;
|
|
790
|
+
case PrimitiveKind::Float32: {
|
|
791
|
+
Napi::Float32Array array = Napi::Float32Array::New(env, len);
|
|
792
|
+
|
|
793
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
794
|
+
int16_t align = std::max(realign, type->ref->align);
|
|
795
|
+
src = AlignUp(src, align);
|
|
796
|
+
|
|
797
|
+
float f = *(float *)src;
|
|
798
|
+
array[i] = f;
|
|
799
|
+
|
|
800
|
+
src += type->ref->size;
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
return array;
|
|
804
|
+
} break;
|
|
805
|
+
case PrimitiveKind::Float64: {
|
|
806
|
+
Napi::Float64Array array = Napi::Float64Array::New(env, len);
|
|
807
|
+
|
|
808
|
+
for (uint32_t i = 0; i < len; i++) {
|
|
809
|
+
int16_t align = std::max(realign, type->ref->align);
|
|
810
|
+
src = AlignUp(src, align);
|
|
811
|
+
|
|
812
|
+
double d = *(double *)src;
|
|
813
|
+
array[i] = d;
|
|
814
|
+
|
|
815
|
+
src += type->ref->size;
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
return array;
|
|
819
|
+
} break;
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
RG_UNREACHABLE();
|
|
823
|
+
}
|
|
824
|
+
|
|
318
825
|
static void DumpMemory(const char *type, Span<const uint8_t> bytes)
|
|
319
826
|
{
|
|
320
827
|
if (bytes.len) {
|