koffi 1.0.4 → 1.1.0-beta.1
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 +51 -22
- 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/package.json +1 -1
- package/qemu/qemu.js +11 -5
- package/qemu/registry/machines.json +20 -10
- package/src/abi_arm32.cc +13 -6
- package/src/abi_arm64.cc +13 -6
- package/src/abi_x64_sysv.cc +13 -6
- package/src/abi_x64_win.cc +13 -6
- package/src/abi_x86.cc +13 -6
- package/src/call.cc +25 -26
- package/src/call.hh +27 -41
- package/src/ffi.cc +152 -17
- package/src/ffi.hh +24 -10
- package/test/misc.c +2 -2
- package/build/qemu/1.0.4/koffi_darwin_x64.tar.gz +0 -0
- package/build/qemu/1.0.4/koffi_freebsd_arm64.tar.gz +0 -0
- package/build/qemu/1.0.4/koffi_freebsd_ia32.tar.gz +0 -0
- package/build/qemu/1.0.4/koffi_freebsd_x64.tar.gz +0 -0
- package/build/qemu/1.0.4/koffi_linux_arm.tar.gz +0 -0
- package/build/qemu/1.0.4/koffi_linux_arm64.tar.gz +0 -0
- package/build/qemu/1.0.4/koffi_linux_ia32.tar.gz +0 -0
- package/build/qemu/1.0.4/koffi_linux_x64.tar.gz +0 -0
- package/build/qemu/1.0.4/koffi_win32_ia32.tar.gz +0 -0
- package/build/qemu/1.0.4/koffi_win32_x64.tar.gz +0 -0
- package/test/misc.js +0 -227
- 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/call.hh
CHANGED
|
@@ -24,24 +24,27 @@ namespace RG {
|
|
|
24
24
|
bool AnalyseFunction(InstanceData *instance, FunctionInfo *func);
|
|
25
25
|
|
|
26
26
|
class CallData {
|
|
27
|
-
Napi::Env env;
|
|
28
|
-
InstanceData *instance;
|
|
29
|
-
const FunctionInfo *func;
|
|
30
|
-
|
|
31
27
|
struct OutObject {
|
|
32
|
-
Napi::
|
|
28
|
+
Napi::ObjectReference ref;
|
|
33
29
|
const uint8_t *ptr;
|
|
34
30
|
const TypeInfo *type;
|
|
35
31
|
};
|
|
36
32
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
33
|
+
Napi::Env env;
|
|
34
|
+
InstanceData *instance;
|
|
35
|
+
const FunctionInfo *func;
|
|
36
|
+
|
|
37
|
+
bool debug;
|
|
41
38
|
|
|
39
|
+
InstanceMemory *mem;
|
|
42
40
|
Span<uint8_t> old_stack_mem;
|
|
43
41
|
Span<uint8_t> old_heap_mem;
|
|
44
42
|
|
|
43
|
+
LocalArray<OutObject, MaxOutParameters> out_objects;
|
|
44
|
+
|
|
45
|
+
Span<uint8_t> heap;
|
|
46
|
+
Span<uint8_t> stack;
|
|
47
|
+
|
|
45
48
|
union {
|
|
46
49
|
uint32_t u32;
|
|
47
50
|
uint64_t u64;
|
|
@@ -53,26 +56,9 @@ class CallData {
|
|
|
53
56
|
uint8_t *return_ptr = nullptr;
|
|
54
57
|
|
|
55
58
|
public:
|
|
56
|
-
CallData(Napi::Env env,
|
|
59
|
+
CallData(Napi::Env env, const FunctionInfo *func, InstanceMemory *mem, bool debug);
|
|
57
60
|
~CallData();
|
|
58
61
|
|
|
59
|
-
Span<uint8_t> GetStack() const
|
|
60
|
-
{
|
|
61
|
-
uint8_t *sp = stack_mem->end();
|
|
62
|
-
Size len = old_stack_mem.end() - sp;
|
|
63
|
-
|
|
64
|
-
return MakeSpan(sp, len);
|
|
65
|
-
}
|
|
66
|
-
uint8_t *GetSP() const { return stack_mem->end(); };
|
|
67
|
-
|
|
68
|
-
Span<uint8_t> GetHeap() const
|
|
69
|
-
{
|
|
70
|
-
uint8_t *ptr = old_heap_mem.ptr;
|
|
71
|
-
Size len = heap_mem->ptr - ptr;
|
|
72
|
-
|
|
73
|
-
return MakeSpan(ptr, len);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
62
|
bool Prepare(const Napi::CallbackInfo &info);
|
|
77
63
|
void Execute();
|
|
78
64
|
Napi::Value Complete();
|
|
@@ -82,11 +68,11 @@ public:
|
|
|
82
68
|
if (!RG_UNLIKELY(Prepare(info)))
|
|
83
69
|
return env.Null();
|
|
84
70
|
|
|
85
|
-
if (
|
|
71
|
+
if (debug) {
|
|
86
72
|
DumpDebug();
|
|
87
73
|
}
|
|
88
|
-
|
|
89
74
|
Execute();
|
|
75
|
+
|
|
90
76
|
return Complete();
|
|
91
77
|
}
|
|
92
78
|
|
|
@@ -109,19 +95,19 @@ private:
|
|
|
109
95
|
template <typename T>
|
|
110
96
|
bool CallData::AllocStack(Size size, Size align, T **out_ptr)
|
|
111
97
|
{
|
|
112
|
-
uint8_t *ptr = AlignDown(
|
|
113
|
-
Size delta =
|
|
98
|
+
uint8_t *ptr = AlignDown(mem->stack.end() - size, align);
|
|
99
|
+
Size delta = mem->stack.end() - ptr;
|
|
114
100
|
|
|
115
|
-
if (RG_UNLIKELY(
|
|
101
|
+
if (RG_UNLIKELY(mem->stack.len < delta)) {
|
|
116
102
|
ThrowError<Napi::Error>(env, "FFI call is taking up too much memory");
|
|
117
103
|
return false;
|
|
118
104
|
}
|
|
119
105
|
|
|
120
|
-
if (
|
|
106
|
+
if (debug) {
|
|
121
107
|
memset(ptr, 0, delta);
|
|
122
108
|
}
|
|
123
109
|
|
|
124
|
-
|
|
110
|
+
mem->stack.len -= delta;
|
|
125
111
|
|
|
126
112
|
if (out_ptr) {
|
|
127
113
|
*out_ptr = (T *)ptr;
|
|
@@ -132,20 +118,20 @@ bool CallData::AllocStack(Size size, Size align, T **out_ptr)
|
|
|
132
118
|
template <typename T>
|
|
133
119
|
bool CallData::AllocHeap(Size size, Size align, T **out_ptr)
|
|
134
120
|
{
|
|
135
|
-
uint8_t *ptr = AlignUp(
|
|
136
|
-
Size delta = size + (ptr -
|
|
121
|
+
uint8_t *ptr = AlignUp(mem->heap.ptr, align);
|
|
122
|
+
Size delta = size + (ptr - mem->heap.ptr);
|
|
137
123
|
|
|
138
|
-
if (RG_UNLIKELY(delta >
|
|
124
|
+
if (RG_UNLIKELY(delta > mem->heap.len)) {
|
|
139
125
|
ThrowError<Napi::Error>(env, "FFI call is taking up too much memory");
|
|
140
126
|
return false;
|
|
141
127
|
}
|
|
142
128
|
|
|
143
|
-
if (
|
|
144
|
-
memset(
|
|
129
|
+
if (debug) {
|
|
130
|
+
memset(mem->heap.ptr, 0, (size_t)delta);
|
|
145
131
|
}
|
|
146
132
|
|
|
147
|
-
|
|
148
|
-
|
|
133
|
+
mem->heap.ptr += delta;
|
|
134
|
+
mem->heap.len -= delta;
|
|
149
135
|
|
|
150
136
|
if (out_ptr) {
|
|
151
137
|
*out_ptr = (T *)ptr;
|
package/src/ffi.cc
CHANGED
|
@@ -241,6 +241,42 @@ static Napi::Value MarkInOut(const Napi::CallbackInfo &info)
|
|
|
241
241
|
return EncodePointerDirection(info, 3);
|
|
242
242
|
}
|
|
243
243
|
|
|
244
|
+
static Span<uint8_t> AllocateAndAlign16(Allocator *alloc, Size size)
|
|
245
|
+
{
|
|
246
|
+
RG_ASSERT(AlignLen(size, 16) == size);
|
|
247
|
+
RG_ASSERT(size >= Kibibytes(1));
|
|
248
|
+
|
|
249
|
+
// Account for allocator overhead
|
|
250
|
+
size -= 256;
|
|
251
|
+
|
|
252
|
+
uint8_t *ptr = (uint8_t *)Allocator::Allocate(alloc, size);
|
|
253
|
+
uint8_t *aligned = AlignUp(ptr, 16);
|
|
254
|
+
Size delta = AlignLen(aligned - ptr, 16);
|
|
255
|
+
|
|
256
|
+
return MakeSpan(aligned, size - delta);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
static InstanceMemory *AllocateCallMemory(InstanceData *instance)
|
|
260
|
+
{
|
|
261
|
+
for (InstanceMemory *mem: instance->memories) {
|
|
262
|
+
if (!mem->depth)
|
|
263
|
+
return mem;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
InstanceMemory *mem = new InstanceMemory();
|
|
267
|
+
|
|
268
|
+
mem->stack = AllocateAndAlign16(&mem->mem_alloc, Mebibytes(1));
|
|
269
|
+
mem->heap = AllocateAndAlign16(&mem->mem_alloc, Mebibytes(2));
|
|
270
|
+
|
|
271
|
+
if (instance->memories.Available()) {
|
|
272
|
+
instance->memories.Append(mem);
|
|
273
|
+
} else {
|
|
274
|
+
mem->temporary = true;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
return mem;
|
|
278
|
+
}
|
|
279
|
+
|
|
244
280
|
static Napi::Value TranslateNormalCall(const Napi::CallbackInfo &info)
|
|
245
281
|
{
|
|
246
282
|
Napi::Env env = info.Env();
|
|
@@ -252,7 +288,9 @@ static Napi::Value TranslateNormalCall(const Napi::CallbackInfo &info)
|
|
|
252
288
|
return env.Null();
|
|
253
289
|
}
|
|
254
290
|
|
|
255
|
-
|
|
291
|
+
InstanceMemory *mem = AllocateCallMemory(instance);
|
|
292
|
+
CallData call(env, func, mem, instance->debug);
|
|
293
|
+
|
|
256
294
|
return call.Run(info);
|
|
257
295
|
}
|
|
258
296
|
|
|
@@ -309,10 +347,93 @@ static Napi::Value TranslateVariadicCall(const Napi::CallbackInfo &info)
|
|
|
309
347
|
if (!AnalyseFunction(instance, &func))
|
|
310
348
|
return env.Null();
|
|
311
349
|
|
|
312
|
-
|
|
350
|
+
InstanceMemory *mem = AllocateCallMemory(instance);
|
|
351
|
+
CallData call(env, &func, mem, instance->debug);
|
|
352
|
+
|
|
313
353
|
return call.Run(info);
|
|
314
354
|
}
|
|
315
355
|
|
|
356
|
+
class AsyncCall: public Napi::AsyncWorker {
|
|
357
|
+
Napi::Env env;
|
|
358
|
+
const FunctionInfo *func;
|
|
359
|
+
|
|
360
|
+
CallData call;
|
|
361
|
+
bool prepared = false;
|
|
362
|
+
|
|
363
|
+
public:
|
|
364
|
+
AsyncCall(Napi::Env env, InstanceMemory *mem, FunctionInfo *func, bool debug,
|
|
365
|
+
Napi::Function &callback)
|
|
366
|
+
: Napi::AsyncWorker(callback), env(env), func(func->Ref()),
|
|
367
|
+
call(env, func, mem, debug) {}
|
|
368
|
+
~AsyncCall() { func->Unref(); }
|
|
369
|
+
|
|
370
|
+
bool Prepare(const Napi::CallbackInfo &info) {
|
|
371
|
+
prepared = call.Prepare(info);
|
|
372
|
+
|
|
373
|
+
if (!prepared) {
|
|
374
|
+
Napi::Error err = env.GetAndClearPendingException();
|
|
375
|
+
SetError(err.Message());
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
return prepared;
|
|
379
|
+
}
|
|
380
|
+
void DumpDebug() { call.DumpDebug(); }
|
|
381
|
+
|
|
382
|
+
void Execute() override;
|
|
383
|
+
void OnOK() override;
|
|
384
|
+
};
|
|
385
|
+
|
|
386
|
+
void AsyncCall::Execute()
|
|
387
|
+
{
|
|
388
|
+
if (prepared) {
|
|
389
|
+
call.Execute();
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
void AsyncCall::OnOK()
|
|
394
|
+
{
|
|
395
|
+
RG_ASSERT(prepared);
|
|
396
|
+
|
|
397
|
+
Napi::FunctionReference &callback = Callback();
|
|
398
|
+
|
|
399
|
+
Napi::Value self = env.Null();
|
|
400
|
+
napi_value args[] = {
|
|
401
|
+
env.Null(),
|
|
402
|
+
call.Complete()
|
|
403
|
+
};
|
|
404
|
+
|
|
405
|
+
callback.Call(self, RG_LEN(args), args);
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
static Napi::Value TranslateAsyncCall(const Napi::CallbackInfo &info)
|
|
409
|
+
{
|
|
410
|
+
Napi::Env env = info.Env();
|
|
411
|
+
InstanceData *instance = env.GetInstanceData<InstanceData>();
|
|
412
|
+
FunctionInfo *func = (FunctionInfo *)info.Data();
|
|
413
|
+
|
|
414
|
+
if (info.Length() <= (uint32_t)func->parameters.len) {
|
|
415
|
+
ThrowError<Napi::TypeError>(env, "Expected %1 arguments, got %2", func->parameters.len + 1, info.Length());
|
|
416
|
+
return env.Null();
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
Napi::Function callback = info[(uint32_t)func->parameters.len].As<Napi::Function>();
|
|
420
|
+
|
|
421
|
+
if (!callback.IsFunction()) {
|
|
422
|
+
ThrowError<Napi::TypeError>(env, "Expected callback function as last arguments, got %1", GetValueType(instance, callback));
|
|
423
|
+
return env.Null();
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
InstanceMemory *mem = AllocateCallMemory(instance);
|
|
427
|
+
AsyncCall *async = new AsyncCall(env, mem, func, instance->debug, callback);
|
|
428
|
+
|
|
429
|
+
if (async->Prepare(info) && instance->debug) {
|
|
430
|
+
async->DumpDebug();
|
|
431
|
+
}
|
|
432
|
+
async->Queue();
|
|
433
|
+
|
|
434
|
+
return env.Null();
|
|
435
|
+
}
|
|
436
|
+
|
|
316
437
|
static bool ParseClassicFunction(Napi::Env env, Napi::String name, Napi::Value ret,
|
|
317
438
|
Napi::Array parameters, FunctionInfo *func)
|
|
318
439
|
{
|
|
@@ -386,7 +507,7 @@ static Napi::Value FindLibraryFunction(const Napi::CallbackInfo &info, CallConve
|
|
|
386
507
|
LibraryHolder *lib = (LibraryHolder *)info.Data();
|
|
387
508
|
|
|
388
509
|
FunctionInfo *func = new FunctionInfo();
|
|
389
|
-
|
|
510
|
+
RG_DEFER { func->Unref(); };
|
|
390
511
|
|
|
391
512
|
func->lib = lib->Ref();
|
|
392
513
|
func->convention = convention;
|
|
@@ -445,9 +566,14 @@ static Napi::Value FindLibraryFunction(const Napi::CallbackInfo &info, CallConve
|
|
|
445
566
|
}
|
|
446
567
|
|
|
447
568
|
Napi::Function::Callback call = func->variadic ? TranslateVariadicCall : TranslateNormalCall;
|
|
448
|
-
Napi::Function wrapper = Napi::Function::New(env, call, func->name, (void *)func);
|
|
449
|
-
wrapper.AddFinalizer([](Napi::Env, FunctionInfo *func) {
|
|
450
|
-
|
|
569
|
+
Napi::Function wrapper = Napi::Function::New(env, call, func->name, (void *)func->Ref());
|
|
570
|
+
wrapper.AddFinalizer([](Napi::Env, FunctionInfo *func) { func->Unref(); }, func);
|
|
571
|
+
|
|
572
|
+
if (!func->variadic) {
|
|
573
|
+
Napi::Function async = Napi::Function::New(env, TranslateAsyncCall, func->name, (void *)func->Ref());
|
|
574
|
+
async.AddFinalizer([](Napi::Env, FunctionInfo *func) { func->Unref(); }, func);
|
|
575
|
+
wrapper.Set("async", async);
|
|
576
|
+
}
|
|
451
577
|
|
|
452
578
|
return wrapper;
|
|
453
579
|
}
|
|
@@ -540,13 +666,13 @@ LibraryHolder::~LibraryHolder()
|
|
|
540
666
|
#endif
|
|
541
667
|
}
|
|
542
668
|
|
|
543
|
-
LibraryHolder *LibraryHolder::Ref()
|
|
669
|
+
const LibraryHolder *LibraryHolder::Ref() const
|
|
544
670
|
{
|
|
545
671
|
refcount++;
|
|
546
672
|
return this;
|
|
547
673
|
}
|
|
548
674
|
|
|
549
|
-
void LibraryHolder::Unref()
|
|
675
|
+
void LibraryHolder::Unref() const
|
|
550
676
|
{
|
|
551
677
|
if (!--refcount) {
|
|
552
678
|
delete this;
|
|
@@ -646,21 +772,30 @@ FunctionInfo::~FunctionInfo()
|
|
|
646
772
|
}
|
|
647
773
|
}
|
|
648
774
|
|
|
649
|
-
|
|
775
|
+
const FunctionInfo *FunctionInfo::Ref() const
|
|
650
776
|
{
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
uint8_t *aligned = AlignUp(ptr, 16);
|
|
655
|
-
Size delta = AlignLen(aligned - ptr, 16);
|
|
777
|
+
refcount++;
|
|
778
|
+
return this;
|
|
779
|
+
}
|
|
656
780
|
|
|
657
|
-
|
|
781
|
+
void FunctionInfo::Unref() const
|
|
782
|
+
{
|
|
783
|
+
if (!--refcount) {
|
|
784
|
+
delete this;
|
|
785
|
+
}
|
|
658
786
|
}
|
|
659
787
|
|
|
660
788
|
InstanceData::InstanceData()
|
|
661
789
|
{
|
|
662
|
-
|
|
663
|
-
|
|
790
|
+
AllocateCallMemory(this);
|
|
791
|
+
RG_ASSERT(memories.len == 1);
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
InstanceData::~InstanceData()
|
|
795
|
+
{
|
|
796
|
+
for (InstanceMemory *mem: memories) {
|
|
797
|
+
delete mem;
|
|
798
|
+
}
|
|
664
799
|
}
|
|
665
800
|
|
|
666
801
|
template <typename Func>
|
package/src/ffi.hh
CHANGED
|
@@ -86,13 +86,13 @@ struct RecordMember {
|
|
|
86
86
|
|
|
87
87
|
struct LibraryHolder {
|
|
88
88
|
void *module = nullptr; // HMODULE on Windows
|
|
89
|
-
std::atomic_int refcount {1};
|
|
89
|
+
mutable std::atomic_int refcount {1};
|
|
90
90
|
|
|
91
91
|
LibraryHolder(void *module) : module(module) {}
|
|
92
92
|
~LibraryHolder();
|
|
93
93
|
|
|
94
|
-
LibraryHolder *Ref();
|
|
95
|
-
void Unref();
|
|
94
|
+
const LibraryHolder *Ref() const;
|
|
95
|
+
void Unref() const;
|
|
96
96
|
};
|
|
97
97
|
|
|
98
98
|
enum class CallConvention {
|
|
@@ -132,11 +132,11 @@ struct ParameterInfo {
|
|
|
132
132
|
};
|
|
133
133
|
|
|
134
134
|
struct FunctionInfo {
|
|
135
|
-
|
|
135
|
+
mutable std::atomic_int refcount {1};
|
|
136
136
|
|
|
137
137
|
const char *name;
|
|
138
138
|
const char *decorated_name;
|
|
139
|
-
LibraryHolder *lib = nullptr;
|
|
139
|
+
const LibraryHolder *lib = nullptr;
|
|
140
140
|
|
|
141
141
|
void *func;
|
|
142
142
|
CallConvention convention;
|
|
@@ -152,10 +152,27 @@ struct FunctionInfo {
|
|
|
152
152
|
#if defined(__arm__) || defined(__aarch64__) || defined(__x86_64__) || defined(_WIN64)
|
|
153
153
|
bool forward_fp;
|
|
154
154
|
#endif
|
|
155
|
+
|
|
156
|
+
~FunctionInfo();
|
|
157
|
+
|
|
158
|
+
const FunctionInfo *Ref() const;
|
|
159
|
+
void Unref() const;
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
struct InstanceMemory {
|
|
163
|
+
LinkedAllocator mem_alloc;
|
|
164
|
+
|
|
165
|
+
Span<uint8_t> stack;
|
|
166
|
+
Span<uint8_t> heap;
|
|
167
|
+
IndirectBlockAllocator big_alloc { &mem_alloc };
|
|
168
|
+
|
|
169
|
+
int depth;
|
|
170
|
+
bool temporary;
|
|
155
171
|
};
|
|
156
172
|
|
|
157
173
|
struct InstanceData {
|
|
158
174
|
InstanceData();
|
|
175
|
+
~InstanceData();
|
|
159
176
|
|
|
160
177
|
BucketArray<TypeInfo> types;
|
|
161
178
|
HashTable<const char *, TypeInfo *> types_map;
|
|
@@ -163,12 +180,9 @@ struct InstanceData {
|
|
|
163
180
|
bool debug;
|
|
164
181
|
uint64_t tag_lower;
|
|
165
182
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
Span<uint8_t> stack_mem;
|
|
169
|
-
Span<uint8_t> heap_mem;
|
|
183
|
+
LocalArray<InstanceMemory *, 8> memories;
|
|
170
184
|
|
|
171
|
-
|
|
185
|
+
BlockAllocator str_alloc;
|
|
172
186
|
};
|
|
173
187
|
|
|
174
188
|
}
|
package/test/misc.c
CHANGED
|
@@ -275,7 +275,7 @@ EXPORT BFG STDCALL MakeBFG(BFG *p, int x, double y, const char *str)
|
|
|
275
275
|
{
|
|
276
276
|
BFG bfg;
|
|
277
277
|
|
|
278
|
-
char buf[64];
|
|
278
|
+
static char buf[64];
|
|
279
279
|
snprintf(buf, sizeof(buf), "X/%s/X", str);
|
|
280
280
|
|
|
281
281
|
bfg.a = x;
|
|
@@ -294,7 +294,7 @@ EXPORT PackedBFG FASTCALL MakePackedBFG(int x, double y, PackedBFG *p, const cha
|
|
|
294
294
|
{
|
|
295
295
|
PackedBFG bfg;
|
|
296
296
|
|
|
297
|
-
char buf[64];
|
|
297
|
+
static char buf[64];
|
|
298
298
|
snprintf(buf, sizeof(buf), "X/%s/X", str);
|
|
299
299
|
|
|
300
300
|
bfg.a = x;
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|