koffi 2.12.1 → 2.12.3
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/CHANGELOG.md +21 -0
- package/LICENSE.txt +2 -2
- package/README.md +8 -8
- package/build/koffi/darwin_arm64/koffi.node +0 -0
- package/build/koffi/darwin_x64/koffi.node +0 -0
- package/build/koffi/freebsd_arm64/koffi.node +0 -0
- package/build/koffi/freebsd_ia32/koffi.node +0 -0
- package/build/koffi/freebsd_x64/koffi.node +0 -0
- package/build/koffi/linux_arm64/koffi.node +0 -0
- package/build/koffi/linux_armhf/koffi.node +0 -0
- package/build/koffi/linux_ia32/koffi.node +0 -0
- package/build/koffi/linux_loong64/koffi.node +0 -0
- package/build/koffi/linux_riscv64d/koffi.node +0 -0
- package/build/koffi/linux_x64/koffi.node +0 -0
- package/build/koffi/musl_arm64/koffi.node +0 -0
- package/build/koffi/musl_x64/koffi.node +0 -0
- package/build/koffi/openbsd_ia32/koffi.node +0 -0
- package/build/koffi/openbsd_x64/koffi.node +0 -0
- package/build/koffi/win32_arm64/koffi.exp +0 -0
- package/build/koffi/win32_arm64/koffi.node +0 -0
- package/build/koffi/win32_ia32/koffi.exp +0 -0
- package/build/koffi/win32_ia32/koffi.node +0 -0
- package/build/koffi/win32_x64/koffi.exp +0 -0
- package/build/koffi/win32_x64/koffi.node +0 -0
- package/doc/assets.ini +3 -3
- package/doc/develop.sh +4 -3
- package/doc/pages/platforms.md +1 -1
- package/doc/static/highlight.js +1 -1
- package/doc/static/koffi.css +3 -2
- package/doc/static/print.css +1 -1
- package/doc/templates/code.html +5 -5
- package/doc/templates/page.html +4 -4
- package/index.d.ts +228 -145
- package/index.js +25 -25
- package/indirect.js +25 -5
- package/package.json +2 -2
- package/src/cnoke/LICENSE.txt +2 -2
- package/src/cnoke/README.md +2 -0
- package/src/cnoke/assets/FindCNoke.cmake +12 -2
- package/src/cnoke/assets/win_delay_hook.c +4 -4
- package/src/cnoke/cnoke.js +4 -2
- package/src/cnoke/package.json +1 -1
- package/src/cnoke/src/builder.js +11 -14
- package/src/cnoke/src/index.js +2 -2
- package/src/cnoke/src/tools.js +34 -2
- package/src/core/{libcc/libcc.cc → base/base.cc} +3174 -1640
- package/src/core/{libcc/libcc.hh → base/base.hh} +3066 -2427
- package/src/core/{libcc → base}/mimetypes.inc +42 -4
- package/src/core/{libcc → base}/mimetypes_gen.py +3 -3
- package/src/core/base/unicode.inc +426 -0
- package/src/core/base/unicode_gen.py +189 -0
- package/src/koffi/CMakeLists.txt +7 -5
- package/src/koffi/cmake/raylib.cmake +6 -2
- package/src/koffi/cmake/{sqlite.cmake → sqlite3.cmake} +3 -3
- package/src/koffi/examples/electron-forge/forge.config.js +23 -3
- package/src/koffi/examples/electron-forge/package.json +18 -16
- package/src/koffi/src/abi_arm32.cc +7 -7
- package/src/koffi/src/abi_arm32_asm.S +2 -2
- package/src/koffi/src/abi_arm64.cc +45 -45
- package/src/koffi/src/abi_arm64_asm.S +4 -4
- package/src/koffi/src/abi_arm64_asm.asm +2 -2
- package/src/koffi/src/abi_loong64_asm.S +2 -2
- package/src/koffi/src/abi_riscv64.cc +5 -5
- package/src/koffi/src/abi_riscv64_asm.S +2 -2
- package/src/koffi/src/abi_x64_sysv.cc +3 -3
- package/src/koffi/src/abi_x64_sysv_asm.S +5 -5
- package/src/koffi/src/abi_x64_win.cc +3 -3
- package/src/koffi/src/abi_x64_win_asm.asm +2 -2
- package/src/koffi/src/abi_x86.cc +8 -8
- package/src/koffi/src/abi_x86_asm.S +2 -2
- package/src/koffi/src/abi_x86_asm.asm +2 -2
- package/src/koffi/src/call.cc +12 -12
- package/src/koffi/src/call.hh +8 -8
- package/src/koffi/src/errno.inc +152 -152
- package/src/koffi/src/ffi.cc +44 -39
- package/src/koffi/src/ffi.hh +6 -6
- package/src/koffi/src/init.js +1 -1
- package/src/koffi/src/parser.cc +5 -5
- package/src/koffi/src/parser.hh +3 -3
- package/src/koffi/src/trampolines/armasm.inc +2 -2
- package/src/koffi/src/trampolines/gnu.inc +2 -2
- package/src/koffi/src/trampolines/masm32.inc +2 -2
- package/src/koffi/src/trampolines/masm64.inc +2 -2
- package/src/koffi/src/trampolines/prototypes.inc +2 -2
- package/src/koffi/src/util.cc +9 -9
- package/src/koffi/src/util.hh +3 -3
- package/src/koffi/src/win32.cc +5 -5
- package/src/koffi/src/win32.hh +9 -9
- package/vendor/node-addon-api/CHANGELOG.md +97 -2
- package/vendor/node-addon-api/CONTRIBUTING.md +117 -7
- package/vendor/node-addon-api/README.md +25 -249
- package/vendor/node-addon-api/common.gypi +1 -0
- package/vendor/node-addon-api/doc/README.md +145 -0
- package/vendor/node-addon-api/doc/array_buffer.md +15 -15
- package/vendor/node-addon-api/doc/basic_env.md +200 -0
- package/vendor/node-addon-api/doc/buffer.md +24 -26
- package/vendor/node-addon-api/doc/cmake-js.md +19 -0
- package/vendor/node-addon-api/doc/{creating_a_release.md → contributing/creating_a_release.md} +16 -4
- package/vendor/node-addon-api/doc/env.md +11 -131
- package/vendor/node-addon-api/doc/error_handling.md +12 -0
- package/vendor/node-addon-api/doc/external.md +13 -4
- package/vendor/node-addon-api/doc/finalization.md +153 -0
- package/vendor/node-addon-api/doc/memory_management.md +1 -1
- package/vendor/node-addon-api/doc/object_wrap.md +19 -3
- package/vendor/node-addon-api/doc/promises.md +51 -0
- package/vendor/node-addon-api/doc/setup.md +29 -6
- package/vendor/node-addon-api/doc/value.md +13 -0
- package/vendor/node-addon-api/doc/version_management.md +2 -2
- package/vendor/node-addon-api/eslint.config.js +5 -0
- package/vendor/node-addon-api/index.js +2 -0
- package/vendor/node-addon-api/napi-inl.h +592 -166
- package/vendor/node-addon-api/napi.h +167 -59
- package/vendor/node-addon-api/node_addon_api.gyp +10 -0
- package/vendor/node-addon-api/noexcept.gypi +1 -1
- package/vendor/node-addon-api/package.json +10 -13
- package/vendor/node-addon-api/release-please-config.json +15 -0
- package/vendor/node-addon-api/test/addon_build/tpl/binding.gyp +2 -1
- package/vendor/node-addon-api/test/array_buffer.js +1 -1
- package/vendor/node-addon-api/test/async_context.js +2 -2
- package/vendor/node-addon-api/test/async_progress_queue_worker.js +3 -3
- package/vendor/node-addon-api/test/async_progress_worker.js +3 -3
- package/vendor/node-addon-api/test/async_worker.cc +15 -13
- package/vendor/node-addon-api/test/async_worker.js +5 -5
- package/vendor/node-addon-api/test/basic_types/value.cc +6 -0
- package/vendor/node-addon-api/test/basic_types/value.js +17 -0
- package/vendor/node-addon-api/test/binding.cc +8 -0
- package/vendor/node-addon-api/test/binding.gyp +23 -1
- package/vendor/node-addon-api/test/buffer.js +1 -2
- package/vendor/node-addon-api/test/common/index.js +1 -1
- package/vendor/node-addon-api/test/except_all.cc +22 -0
- package/vendor/node-addon-api/test/except_all.js +14 -0
- package/vendor/node-addon-api/test/exports.js +19 -0
- package/vendor/node-addon-api/test/finalizer_order.cc +152 -0
- package/vendor/node-addon-api/test/finalizer_order.js +98 -0
- package/vendor/node-addon-api/test/function.js +2 -2
- package/vendor/node-addon-api/test/function_reference.js +2 -2
- package/vendor/node-addon-api/test/globalObject/global_object_delete_property.cc +4 -4
- package/vendor/node-addon-api/test/globalObject/global_object_get_property.cc +4 -4
- package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.cc +3 -3
- package/vendor/node-addon-api/test/globalObject/global_object_set_property.cc +5 -5
- package/vendor/node-addon-api/test/name.cc +10 -8
- package/vendor/node-addon-api/test/object/delete_property.cc +5 -5
- package/vendor/node-addon-api/test/object/get_property.cc +5 -5
- package/vendor/node-addon-api/test/object/has_own_property.cc +4 -4
- package/vendor/node-addon-api/test/object/has_property.cc +5 -5
- package/vendor/node-addon-api/test/object/object.cc +1 -1
- package/vendor/node-addon-api/test/object/set_property.cc +5 -5
- package/vendor/node-addon-api/test/object/subscript_operator.cc +3 -3
- package/vendor/node-addon-api/test/object_reference.cc +18 -18
- package/vendor/node-addon-api/test/promise.cc +75 -0
- package/vendor/node-addon-api/test/promise.js +23 -0
- package/vendor/node-addon-api/test/require_basic_finalizers/index.js +38 -0
- package/vendor/node-addon-api/test/require_basic_finalizers/tpl/addon.cc +12 -0
- package/vendor/node-addon-api/test/require_basic_finalizers/tpl/binding.gyp +48 -0
- package/vendor/node-addon-api/test/require_basic_finalizers/tpl/index.js +3 -0
- package/vendor/node-addon-api/test/require_basic_finalizers/tpl/package.json +11 -0
- package/vendor/node-addon-api/test/run_script.cc +1 -1
- package/vendor/node-addon-api/test/type_taggable.cc +1 -1
- package/vendor/node-addon-api/test/type_taggable.js +3 -4
- package/vendor/node-addon-api/test/typedarray.cc +28 -24
- package/vendor/node-addon-api/tools/conversion.js +1 -1
- package/vendor/node-api-headers/CHANGELOG.md +29 -0
- package/vendor/node-api-headers/CREATING_A_RELEASE.md +12 -2
- package/vendor/node-api-headers/def/js_native_api.def +6 -1
- package/vendor/node-api-headers/def/node_api.def +7 -1
- package/vendor/node-api-headers/include/js_native_api.h +56 -24
- package/vendor/node-api-headers/include/js_native_api_types.h +27 -0
- package/vendor/node-api-headers/include/node_api.h +38 -29
- package/vendor/node-api-headers/lib/parse-utils.js +92 -0
- package/vendor/node-api-headers/package.json +7 -7
- package/vendor/node-api-headers/release-please-config.json +12 -0
- package/vendor/node-api-headers/scripts/update-headers.js +63 -12
- package/vendor/node-api-headers/scripts/write-symbols.js +1 -1
- package/vendor/node-api-headers/symbols.js +17 -1
- package/vendor/node-api-headers/test/parse-utils.js +21 -0
- package/doc/flat/flat.css +0 -27
- package/doc/flat/normal.css +0 -429
- package/doc/flat/print.css +0 -29
- package/doc/flat/reset.css +0 -41
- package/doc/flat/small.css +0 -104
- package/doc/flat/static.js +0 -161
- package/src/core/libcc/brotli.cc +0 -186
- package/src/core/libcc/lz4.cc +0 -197
- package/src/core/libcc/miniz.cc +0 -353
- package/vendor/node-addon-api/tools/eslint-format.js +0 -79
- /package/vendor/node-api-headers/{scripts → lib}/clang-utils.js +0 -0
|
@@ -20,14 +20,14 @@ class TestWorkerWithUserDefRecv : public AsyncWorker {
|
|
|
20
20
|
static void DoWorkWithAsyncRes(const CallbackInfo& info) {
|
|
21
21
|
Object recv = info[0].As<Object>();
|
|
22
22
|
Function cb = info[1].As<Function>();
|
|
23
|
-
|
|
23
|
+
Value resource = info[2];
|
|
24
24
|
|
|
25
25
|
TestWorkerWithUserDefRecv* worker = nullptr;
|
|
26
26
|
if (resource == info.Env().Null()) {
|
|
27
27
|
worker = new TestWorkerWithUserDefRecv(recv, cb, "TestResource");
|
|
28
28
|
} else {
|
|
29
|
-
worker =
|
|
30
|
-
|
|
29
|
+
worker = new TestWorkerWithUserDefRecv(
|
|
30
|
+
recv, cb, "TestResource", resource.As<Object>());
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
worker->Queue();
|
|
@@ -51,15 +51,17 @@ class TestWorkerWithUserDefRecv : public AsyncWorker {
|
|
|
51
51
|
};
|
|
52
52
|
|
|
53
53
|
// Using default std::allocator impl, but assuming user can define their own
|
|
54
|
-
//
|
|
54
|
+
// allocate/deallocate methods
|
|
55
55
|
class CustomAllocWorker : public AsyncWorker {
|
|
56
|
+
using Allocator = std::allocator<CustomAllocWorker>;
|
|
57
|
+
|
|
56
58
|
public:
|
|
57
59
|
CustomAllocWorker(Function& cb) : AsyncWorker(cb){};
|
|
58
60
|
static void DoWork(const CallbackInfo& info) {
|
|
59
61
|
Function cb = info[0].As<Function>();
|
|
60
|
-
|
|
61
|
-
CustomAllocWorker* newWorker =
|
|
62
|
-
|
|
62
|
+
Allocator allocator;
|
|
63
|
+
CustomAllocWorker* newWorker = allocator.allocate(1);
|
|
64
|
+
std::allocator_traits<Allocator>::construct(allocator, newWorker, cb);
|
|
63
65
|
newWorker->Queue();
|
|
64
66
|
}
|
|
65
67
|
|
|
@@ -67,9 +69,9 @@ class CustomAllocWorker : public AsyncWorker {
|
|
|
67
69
|
void Execute() override {}
|
|
68
70
|
void Destroy() override {
|
|
69
71
|
assert(this->_secretVal == 24);
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
72
|
+
Allocator allocator;
|
|
73
|
+
std::allocator_traits<Allocator>::destroy(allocator, this);
|
|
74
|
+
allocator.deallocate(this, 1);
|
|
73
75
|
}
|
|
74
76
|
|
|
75
77
|
private:
|
|
@@ -108,7 +110,7 @@ class TestWorker : public AsyncWorker {
|
|
|
108
110
|
: AsyncWorker(cb, resource_name, resource) {}
|
|
109
111
|
TestWorker(Function cb, const char* resource_name)
|
|
110
112
|
: AsyncWorker(cb, resource_name) {}
|
|
111
|
-
bool _succeed;
|
|
113
|
+
bool _succeed{};
|
|
112
114
|
};
|
|
113
115
|
|
|
114
116
|
class TestWorkerWithResult : public AsyncWorker {
|
|
@@ -143,7 +145,7 @@ class TestWorkerWithResult : public AsyncWorker {
|
|
|
143
145
|
const char* resource_name,
|
|
144
146
|
const Object& resource)
|
|
145
147
|
: AsyncWorker(cb, resource_name, resource) {}
|
|
146
|
-
bool _succeed;
|
|
148
|
+
bool _succeed{};
|
|
147
149
|
};
|
|
148
150
|
|
|
149
151
|
class TestWorkerNoCallback : public AsyncWorker {
|
|
@@ -194,7 +196,7 @@ class TestWorkerNoCallback : public AsyncWorker {
|
|
|
194
196
|
: AsyncWorker(env, resource_name, resource),
|
|
195
197
|
_deferred(Napi::Promise::Deferred::New(env)) {}
|
|
196
198
|
Promise::Deferred _deferred;
|
|
197
|
-
bool _succeed;
|
|
199
|
+
bool _succeed{};
|
|
198
200
|
};
|
|
199
201
|
|
|
200
202
|
class EchoWorker : public AsyncWorker {
|
|
@@ -139,7 +139,7 @@ async function test (binding) {
|
|
|
139
139
|
{
|
|
140
140
|
eventName: 'init',
|
|
141
141
|
type: 'TestResource',
|
|
142
|
-
triggerAsyncId
|
|
142
|
+
triggerAsyncId,
|
|
143
143
|
resource: { foo: 'fooBar' }
|
|
144
144
|
},
|
|
145
145
|
{ eventName: 'before' },
|
|
@@ -167,7 +167,7 @@ async function test (binding) {
|
|
|
167
167
|
{
|
|
168
168
|
eventName: 'init',
|
|
169
169
|
type: 'TestResource',
|
|
170
|
-
triggerAsyncId
|
|
170
|
+
triggerAsyncId,
|
|
171
171
|
resource: { }
|
|
172
172
|
},
|
|
173
173
|
{ eventName: 'before' },
|
|
@@ -194,7 +194,7 @@ async function test (binding) {
|
|
|
194
194
|
{
|
|
195
195
|
eventName: 'init',
|
|
196
196
|
type: 'TestResource',
|
|
197
|
-
triggerAsyncId
|
|
197
|
+
triggerAsyncId,
|
|
198
198
|
resource: { foo: 'foo' }
|
|
199
199
|
},
|
|
200
200
|
{ eventName: 'before' },
|
|
@@ -224,7 +224,7 @@ async function test (binding) {
|
|
|
224
224
|
{
|
|
225
225
|
eventName: 'init',
|
|
226
226
|
type: 'TestResource',
|
|
227
|
-
triggerAsyncId
|
|
227
|
+
triggerAsyncId,
|
|
228
228
|
resource: { foo: 'foo' }
|
|
229
229
|
},
|
|
230
230
|
{ eventName: 'before' },
|
|
@@ -252,7 +252,7 @@ async function test (binding) {
|
|
|
252
252
|
{
|
|
253
253
|
eventName: 'init',
|
|
254
254
|
type: 'TestResource',
|
|
255
|
-
triggerAsyncId
|
|
255
|
+
triggerAsyncId,
|
|
256
256
|
resource: { foo: 'foo' }
|
|
257
257
|
},
|
|
258
258
|
{ eventName: 'before' },
|
|
@@ -128,6 +128,11 @@ static Value ToObject(const CallbackInfo& info) {
|
|
|
128
128
|
return MaybeUnwrap(info[0].ToObject());
|
|
129
129
|
}
|
|
130
130
|
|
|
131
|
+
static Value AccessProp(const CallbackInfo& info) {
|
|
132
|
+
Object obj = MaybeUnwrap(info[0].ToObject());
|
|
133
|
+
return obj[info[1]].AsValue();
|
|
134
|
+
}
|
|
135
|
+
|
|
131
136
|
Object InitBasicTypesValue(Env env) {
|
|
132
137
|
Object exports = Object::New(env);
|
|
133
138
|
|
|
@@ -150,6 +155,7 @@ Object InitBasicTypesValue(Env env) {
|
|
|
150
155
|
exports["toNumber"] = Function::New(env, ToNumber);
|
|
151
156
|
exports["toString"] = Function::New(env, ToString);
|
|
152
157
|
exports["toObject"] = Function::New(env, ToObject);
|
|
158
|
+
exports["accessProp"] = Function::New(env, AccessProp);
|
|
153
159
|
|
|
154
160
|
exports["strictlyEquals"] = Function::New(env, StrictlyEquals);
|
|
155
161
|
exports["strictlyEqualsOverload"] = Function::New(env, StrictEqualsOverload);
|
|
@@ -117,6 +117,21 @@ function test (binding) {
|
|
|
117
117
|
assert(value.assertNonEmptyReturnValOnCast());
|
|
118
118
|
}
|
|
119
119
|
|
|
120
|
+
function accessPropTest (value) {
|
|
121
|
+
const testObject = { key: '123' };
|
|
122
|
+
const testSymbol = Symbol('123');
|
|
123
|
+
const testNumber = 123;
|
|
124
|
+
const destObj = {
|
|
125
|
+
testObject,
|
|
126
|
+
testSymbol,
|
|
127
|
+
[testNumber]: testNumber
|
|
128
|
+
};
|
|
129
|
+
assert.strictEqual(value.accessProp(destObj, 'testObject'), testObject);
|
|
130
|
+
assert.strictEqual(value.accessProp(destObj, 'testSymbol'), testSymbol);
|
|
131
|
+
assert.strictEqual(value.accessProp(destObj, testNumber), testNumber);
|
|
132
|
+
assert.strictEqual(value.accessProp(destObj, 'invalidKey'), undefined);
|
|
133
|
+
}
|
|
134
|
+
|
|
120
135
|
const value = binding.basic_types_value;
|
|
121
136
|
|
|
122
137
|
assertValueStrictlyEqual(value);
|
|
@@ -153,4 +168,6 @@ function test (binding) {
|
|
|
153
168
|
assert.strictEqual(value.toString(null), 'null');
|
|
154
169
|
|
|
155
170
|
typeConverterTest(value.toObject, Object);
|
|
171
|
+
|
|
172
|
+
accessPropTest(value);
|
|
156
173
|
}
|
|
@@ -86,6 +86,7 @@ Object InitEnvMiscellaneous(Env env);
|
|
|
86
86
|
#if defined(NODE_ADDON_API_ENABLE_MAYBE)
|
|
87
87
|
Object InitMaybeCheck(Env env);
|
|
88
88
|
#endif
|
|
89
|
+
Object InitFinalizerOrder(Env env);
|
|
89
90
|
|
|
90
91
|
Object Init(Env env, Object exports) {
|
|
91
92
|
#if (NAPI_VERSION > 5)
|
|
@@ -186,6 +187,13 @@ Object Init(Env env, Object exports) {
|
|
|
186
187
|
#if defined(NODE_ADDON_API_ENABLE_MAYBE)
|
|
187
188
|
exports.Set("maybe_check", InitMaybeCheck(env));
|
|
188
189
|
#endif
|
|
190
|
+
|
|
191
|
+
exports.Set("finalizer_order", InitFinalizerOrder(env));
|
|
192
|
+
|
|
193
|
+
exports.Set(
|
|
194
|
+
"isExperimental",
|
|
195
|
+
Napi::Boolean::New(env, NAPI_VERSION == NAPI_VERSION_EXPERIMENTAL));
|
|
196
|
+
|
|
189
197
|
return exports;
|
|
190
198
|
}
|
|
191
199
|
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
'error.cc',
|
|
31
31
|
'error_handling_for_primitives.cc',
|
|
32
32
|
'external.cc',
|
|
33
|
+
'finalizer_order.cc',
|
|
33
34
|
'function.cc',
|
|
34
35
|
'function_reference.cc',
|
|
35
36
|
'handlescope.cc',
|
|
@@ -84,21 +85,42 @@
|
|
|
84
85
|
'binding-swallowexcept.cc',
|
|
85
86
|
'error.cc',
|
|
86
87
|
],
|
|
88
|
+
'build_sources_except_all': [
|
|
89
|
+
'except_all.cc',
|
|
90
|
+
],
|
|
87
91
|
'build_sources_type_check': [
|
|
88
92
|
'value_type_cast.cc'
|
|
89
93
|
],
|
|
94
|
+
'want_coverage': '<!(node -p process.env.npm_config_coverage)',
|
|
95
|
+
'use_node_api_headers': '<!(node -p process.env.use_node_api_headers)',
|
|
90
96
|
'conditions': [
|
|
91
97
|
['disable_deprecated!="true"', {
|
|
92
98
|
'build_sources': ['object/object_deprecated.cc']
|
|
93
99
|
}]
|
|
94
100
|
]
|
|
95
101
|
},
|
|
102
|
+
'conditions': [
|
|
103
|
+
['want_coverage=="true" and OS=="linux"', {
|
|
104
|
+
'cflags_cc': ['--coverage'],
|
|
105
|
+
'ldflags': ['--coverage'],
|
|
106
|
+
}],
|
|
107
|
+
['use_node_api_headers=="true"', {
|
|
108
|
+
# prepend to the include_dirs list
|
|
109
|
+
'include_dirs+': ["<!(node -p \"require('node-api-headers').include_dir\")"],
|
|
110
|
+
}],
|
|
111
|
+
],
|
|
96
112
|
},
|
|
97
113
|
'targets': [
|
|
98
114
|
{
|
|
99
115
|
'target_name': 'binding',
|
|
100
116
|
'dependencies': ['../node_addon_api.gyp:node_addon_api_except'],
|
|
101
|
-
'sources': ['>@(build_sources)']
|
|
117
|
+
'sources': ['>@(build_sources)'],
|
|
118
|
+
'defines': ['NODE_ADDON_API_ENABLE_TYPE_CHECK_ON_AS']
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
'target_name': 'binding_except_all',
|
|
122
|
+
'dependencies': ['../node_addon_api.gyp:node_addon_api_except_all'],
|
|
123
|
+
'sources': [ '>@(build_sources_except_all)']
|
|
102
124
|
},
|
|
103
125
|
{
|
|
104
126
|
'target_name': 'binding_noexcept',
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
const assert = require('assert');
|
|
4
4
|
const testUtil = require('./testUtil');
|
|
5
|
-
const safeBuffer = require('safe-buffer');
|
|
6
5
|
|
|
7
6
|
module.exports = require('./common').runTest(test);
|
|
8
7
|
|
|
@@ -14,7 +13,7 @@ function test (binding) {
|
|
|
14
13
|
binding.buffer.checkBuffer(test);
|
|
15
14
|
assert.ok(test instanceof Buffer);
|
|
16
15
|
|
|
17
|
-
const test2 =
|
|
16
|
+
const test2 = Buffer.alloc(test.length);
|
|
18
17
|
test.copy(test2);
|
|
19
18
|
binding.buffer.checkBuffer(test2);
|
|
20
19
|
},
|
|
@@ -142,7 +142,7 @@ async function checkBuildType (buildType) {
|
|
|
142
142
|
|
|
143
143
|
async function whichBuildType () {
|
|
144
144
|
let buildType = 'Release';
|
|
145
|
-
const envBuildType = process.env.NODE_API_BUILD_CONFIG;
|
|
145
|
+
const envBuildType = process.env.NODE_API_BUILD_CONFIG || (process.env.npm_config_debug === 'true' ? 'Debug' : 'Release');
|
|
146
146
|
if (envBuildType) {
|
|
147
147
|
if (Object.values(buildTypes).includes(envBuildType)) {
|
|
148
148
|
if (await checkBuildType(envBuildType)) {
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#include <stdexcept>
|
|
2
|
+
#include "napi.h"
|
|
3
|
+
|
|
4
|
+
using namespace Napi;
|
|
5
|
+
|
|
6
|
+
void ThrowStdException(const CallbackInfo& info) {
|
|
7
|
+
std::string message = info[0].As<String>().Utf8Value();
|
|
8
|
+
throw std::runtime_error(message);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
void ThrowPrimitiveException(const CallbackInfo&) {
|
|
12
|
+
throw 0;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
Object Init(Env env, Object exports) {
|
|
16
|
+
exports.Set("throwStdException", Napi::Function::New(env, ThrowStdException));
|
|
17
|
+
exports.Set("throwPrimitiveException",
|
|
18
|
+
Napi::Function::New(env, ThrowPrimitiveException));
|
|
19
|
+
return exports;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
NODE_API_MODULE(addon, Init)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const assert = require('assert');
|
|
4
|
+
|
|
5
|
+
module.exports = require('./common').runTestWithBuildType(test);
|
|
6
|
+
|
|
7
|
+
function test (buildType) {
|
|
8
|
+
const binding = require(`./build/${buildType}/binding_except_all.node`);
|
|
9
|
+
|
|
10
|
+
const message = 'error message';
|
|
11
|
+
assert.throws(binding.throwStdException.bind(undefined, message), { message });
|
|
12
|
+
|
|
13
|
+
assert.throws(binding.throwPrimitiveException.bind(undefined), { message: 'A native exception was thrown' });
|
|
14
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { strictEqual } = require('assert');
|
|
4
|
+
const { valid } = require('semver');
|
|
5
|
+
|
|
6
|
+
const nodeAddonApi = require('../');
|
|
7
|
+
|
|
8
|
+
module.exports = function test () {
|
|
9
|
+
strictEqual(nodeAddonApi.include.startsWith('"'), true);
|
|
10
|
+
strictEqual(nodeAddonApi.include.endsWith('"'), true);
|
|
11
|
+
strictEqual(nodeAddonApi.include.includes('node-addon-api'), true);
|
|
12
|
+
strictEqual(nodeAddonApi.include_dir, '');
|
|
13
|
+
strictEqual(nodeAddonApi.gyp, 'node_api.gyp:nothing');
|
|
14
|
+
strictEqual(nodeAddonApi.targets, 'node_addon_api.gyp');
|
|
15
|
+
strictEqual(valid(nodeAddonApi.version), true);
|
|
16
|
+
strictEqual(nodeAddonApi.version, require('../package.json').version);
|
|
17
|
+
strictEqual(nodeAddonApi.isNodeApiBuiltin, true);
|
|
18
|
+
strictEqual(nodeAddonApi.needsFlag, false);
|
|
19
|
+
};
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
#include <napi.h>
|
|
2
|
+
|
|
3
|
+
namespace {
|
|
4
|
+
class Test : public Napi::ObjectWrap<Test> {
|
|
5
|
+
public:
|
|
6
|
+
Test(const Napi::CallbackInfo& info) : Napi::ObjectWrap<Test>(info) {
|
|
7
|
+
basicFinalizerCalled = false;
|
|
8
|
+
finalizerCalled = false;
|
|
9
|
+
|
|
10
|
+
if (info.Length() > 0) {
|
|
11
|
+
finalizeCb_ = Napi::Persistent(info[0].As<Napi::Function>());
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
static void Initialize(Napi::Env env, Napi::Object exports) {
|
|
16
|
+
exports.Set("Test",
|
|
17
|
+
DefineClass(env,
|
|
18
|
+
"Test",
|
|
19
|
+
{
|
|
20
|
+
StaticAccessor("isBasicFinalizerCalled",
|
|
21
|
+
&IsBasicFinalizerCalled,
|
|
22
|
+
nullptr,
|
|
23
|
+
napi_default),
|
|
24
|
+
StaticAccessor("isFinalizerCalled",
|
|
25
|
+
&IsFinalizerCalled,
|
|
26
|
+
nullptr,
|
|
27
|
+
napi_default),
|
|
28
|
+
}));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
void Finalize(Napi::BasicEnv /*env*/) { basicFinalizerCalled = true; }
|
|
32
|
+
|
|
33
|
+
void Finalize(Napi::Env /*env*/) {
|
|
34
|
+
finalizerCalled = true;
|
|
35
|
+
if (!finalizeCb_.IsEmpty()) {
|
|
36
|
+
finalizeCb_.Call({});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
static Napi::Value IsBasicFinalizerCalled(const Napi::CallbackInfo& info) {
|
|
41
|
+
return Napi::Boolean::New(info.Env(), basicFinalizerCalled);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
static Napi::Value IsFinalizerCalled(const Napi::CallbackInfo& info) {
|
|
45
|
+
return Napi::Boolean::New(info.Env(), finalizerCalled);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
private:
|
|
49
|
+
Napi::FunctionReference finalizeCb_;
|
|
50
|
+
|
|
51
|
+
static bool basicFinalizerCalled;
|
|
52
|
+
static bool finalizerCalled;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
bool Test::basicFinalizerCalled = false;
|
|
56
|
+
bool Test::finalizerCalled = false;
|
|
57
|
+
|
|
58
|
+
bool externalBasicFinalizerCalled = false;
|
|
59
|
+
bool externalFinalizerCalled = false;
|
|
60
|
+
|
|
61
|
+
Napi::Value CreateExternalBasicFinalizer(const Napi::CallbackInfo& info) {
|
|
62
|
+
externalBasicFinalizerCalled = false;
|
|
63
|
+
return Napi::External<int>::New(
|
|
64
|
+
info.Env(), new int(1), [](Napi::BasicEnv /*env*/, int* data) {
|
|
65
|
+
externalBasicFinalizerCalled = true;
|
|
66
|
+
delete data;
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
Napi::Value CreateExternalFinalizer(const Napi::CallbackInfo& info) {
|
|
71
|
+
externalFinalizerCalled = false;
|
|
72
|
+
return Napi::External<int>::New(
|
|
73
|
+
info.Env(), new int(1), [](Napi::Env /*env*/, int* data) {
|
|
74
|
+
externalFinalizerCalled = true;
|
|
75
|
+
delete data;
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
Napi::Value isExternalBasicFinalizerCalled(const Napi::CallbackInfo& info) {
|
|
80
|
+
return Napi::Boolean::New(info.Env(), externalBasicFinalizerCalled);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
Napi::Value IsExternalFinalizerCalled(const Napi::CallbackInfo& info) {
|
|
84
|
+
return Napi::Boolean::New(info.Env(), externalFinalizerCalled);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
|
|
88
|
+
Napi::Value PostFinalizer(const Napi::CallbackInfo& info) {
|
|
89
|
+
auto env = info.Env();
|
|
90
|
+
|
|
91
|
+
env.PostFinalizer([callback = Napi::Persistent(info[0].As<Napi::Function>())](
|
|
92
|
+
Napi::Env /*env*/) { callback.Call({}); });
|
|
93
|
+
|
|
94
|
+
return env.Undefined();
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
Napi::Value PostFinalizerWithData(const Napi::CallbackInfo& info) {
|
|
98
|
+
auto env = info.Env();
|
|
99
|
+
|
|
100
|
+
env.PostFinalizer(
|
|
101
|
+
[callback = Napi::Persistent(info[0].As<Napi::Function>())](
|
|
102
|
+
Napi::Env /*env*/, Napi::Reference<Napi::Value>* data) {
|
|
103
|
+
callback.Call({data->Value()});
|
|
104
|
+
delete data;
|
|
105
|
+
},
|
|
106
|
+
new Napi::Reference<Napi::Value>(Napi::Persistent(info[1])));
|
|
107
|
+
|
|
108
|
+
return env.Undefined();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
Napi::Value PostFinalizerWithDataAndHint(const Napi::CallbackInfo& info) {
|
|
112
|
+
auto env = info.Env();
|
|
113
|
+
|
|
114
|
+
env.PostFinalizer(
|
|
115
|
+
[callback = Napi::Persistent(info[0].As<Napi::Function>())](
|
|
116
|
+
Napi::Env /*env*/,
|
|
117
|
+
Napi::Reference<Napi::Value>* data,
|
|
118
|
+
Napi::Reference<Napi::Value>* hint) {
|
|
119
|
+
callback.Call({data->Value(), hint->Value()});
|
|
120
|
+
delete data;
|
|
121
|
+
delete hint;
|
|
122
|
+
},
|
|
123
|
+
new Napi::Reference<Napi::Value>(Napi::Persistent(info[1])),
|
|
124
|
+
new Napi::Reference<Napi::Value>(Napi::Persistent(info[2])));
|
|
125
|
+
|
|
126
|
+
return env.Undefined();
|
|
127
|
+
}
|
|
128
|
+
#endif
|
|
129
|
+
|
|
130
|
+
} // namespace
|
|
131
|
+
|
|
132
|
+
Napi::Object InitFinalizerOrder(Napi::Env env) {
|
|
133
|
+
Napi::Object exports = Napi::Object::New(env);
|
|
134
|
+
Test::Initialize(env, exports);
|
|
135
|
+
exports["createExternalBasicFinalizer"] =
|
|
136
|
+
Napi::Function::New(env, CreateExternalBasicFinalizer);
|
|
137
|
+
exports["createExternalFinalizer"] =
|
|
138
|
+
Napi::Function::New(env, CreateExternalFinalizer);
|
|
139
|
+
exports["isExternalBasicFinalizerCalled"] =
|
|
140
|
+
Napi::Function::New(env, isExternalBasicFinalizerCalled);
|
|
141
|
+
exports["isExternalFinalizerCalled"] =
|
|
142
|
+
Napi::Function::New(env, IsExternalFinalizerCalled);
|
|
143
|
+
|
|
144
|
+
#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
|
|
145
|
+
exports["PostFinalizer"] = Napi::Function::New(env, PostFinalizer);
|
|
146
|
+
exports["PostFinalizerWithData"] =
|
|
147
|
+
Napi::Function::New(env, PostFinalizerWithData);
|
|
148
|
+
exports["PostFinalizerWithDataAndHint"] =
|
|
149
|
+
Napi::Function::New(env, PostFinalizerWithDataAndHint);
|
|
150
|
+
#endif
|
|
151
|
+
return exports;
|
|
152
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/* eslint-disable no-unused-vars */
|
|
4
|
+
|
|
5
|
+
const assert = require('assert');
|
|
6
|
+
const common = require('./common');
|
|
7
|
+
const testUtil = require('./testUtil');
|
|
8
|
+
|
|
9
|
+
module.exports = require('./common').runTest(test);
|
|
10
|
+
|
|
11
|
+
function test (binding) {
|
|
12
|
+
const { isExperimental } = binding;
|
|
13
|
+
|
|
14
|
+
let isCallbackCalled = false;
|
|
15
|
+
|
|
16
|
+
const tests = [
|
|
17
|
+
'Finalizer Order - ObjectWrap',
|
|
18
|
+
() => {
|
|
19
|
+
let test = new binding.finalizer_order.Test(() => { isCallbackCalled = true; });
|
|
20
|
+
test = null;
|
|
21
|
+
|
|
22
|
+
global.gc();
|
|
23
|
+
|
|
24
|
+
if (isExperimental) {
|
|
25
|
+
assert.strictEqual(binding.finalizer_order.Test.isBasicFinalizerCalled, true, 'Expected basic finalizer to be called [before ticking]');
|
|
26
|
+
assert.strictEqual(binding.finalizer_order.Test.isFinalizerCalled, false, 'Expected (extended) finalizer to not be called [before ticking]');
|
|
27
|
+
assert.strictEqual(isCallbackCalled, false, 'Expected callback to not be called [before ticking]');
|
|
28
|
+
} else {
|
|
29
|
+
assert.strictEqual(binding.finalizer_order.Test.isBasicFinalizerCalled, false, 'Expected basic finalizer to not be called [before ticking]');
|
|
30
|
+
assert.strictEqual(binding.finalizer_order.Test.isFinalizerCalled, false, 'Expected (extended) finalizer to not be called [before ticking]');
|
|
31
|
+
assert.strictEqual(isCallbackCalled, false, 'Expected callback to not be called [before ticking]');
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
() => {
|
|
35
|
+
assert.strictEqual(binding.finalizer_order.Test.isBasicFinalizerCalled, true, 'Expected basic finalizer to be called [after ticking]');
|
|
36
|
+
assert.strictEqual(binding.finalizer_order.Test.isFinalizerCalled, true, 'Expected (extended) finalizer to be called [after ticking]');
|
|
37
|
+
assert.strictEqual(isCallbackCalled, true, 'Expected callback to be called [after ticking]');
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
'Finalizer Order - External with Basic Finalizer',
|
|
41
|
+
() => {
|
|
42
|
+
let ext = binding.finalizer_order.createExternalBasicFinalizer();
|
|
43
|
+
ext = null;
|
|
44
|
+
global.gc();
|
|
45
|
+
|
|
46
|
+
if (isExperimental) {
|
|
47
|
+
assert.strictEqual(binding.finalizer_order.isExternalBasicFinalizerCalled(), true, 'Expected External basic finalizer to be called [before ticking]');
|
|
48
|
+
} else {
|
|
49
|
+
assert.strictEqual(binding.finalizer_order.isExternalBasicFinalizerCalled(), false, 'Expected External basic finalizer to not be called [before ticking]');
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
() => {
|
|
53
|
+
assert.strictEqual(binding.finalizer_order.isExternalBasicFinalizerCalled(), true, 'Expected External basic finalizer to be called [after ticking]');
|
|
54
|
+
},
|
|
55
|
+
|
|
56
|
+
'Finalizer Order - External with Finalizer',
|
|
57
|
+
() => {
|
|
58
|
+
let ext = binding.finalizer_order.createExternalFinalizer();
|
|
59
|
+
ext = null;
|
|
60
|
+
global.gc();
|
|
61
|
+
assert.strictEqual(binding.finalizer_order.isExternalFinalizerCalled(), false, 'Expected External extended finalizer to not be called [before ticking]');
|
|
62
|
+
},
|
|
63
|
+
() => {
|
|
64
|
+
assert.strictEqual(binding.finalizer_order.isExternalFinalizerCalled(), true, 'Expected External extended finalizer to be called [after ticking]');
|
|
65
|
+
}
|
|
66
|
+
];
|
|
67
|
+
|
|
68
|
+
if (binding.isExperimental) {
|
|
69
|
+
tests.push(...[
|
|
70
|
+
'PostFinalizer',
|
|
71
|
+
() => {
|
|
72
|
+
binding.finalizer_order.PostFinalizer(common.mustCall());
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
'PostFinalizerWithData',
|
|
76
|
+
() => {
|
|
77
|
+
const data = {};
|
|
78
|
+
const callback = (callbackData) => {
|
|
79
|
+
assert.strictEqual(callbackData, data);
|
|
80
|
+
};
|
|
81
|
+
binding.finalizer_order.PostFinalizerWithData(common.mustCall(callback), data);
|
|
82
|
+
},
|
|
83
|
+
|
|
84
|
+
'PostFinalizerWithDataAndHint',
|
|
85
|
+
() => {
|
|
86
|
+
const data = {};
|
|
87
|
+
const hint = {};
|
|
88
|
+
const callback = (callbackData, callbackHint) => {
|
|
89
|
+
assert.strictEqual(callbackData, data);
|
|
90
|
+
assert.strictEqual(callbackHint, hint);
|
|
91
|
+
};
|
|
92
|
+
binding.finalizer_order.PostFinalizerWithDataAndHint(common.mustCall(callback), data, hint);
|
|
93
|
+
}
|
|
94
|
+
]);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return testUtil.runGCTests(tests);
|
|
98
|
+
}
|
|
@@ -18,7 +18,7 @@ function test (binding) {
|
|
|
18
18
|
|
|
19
19
|
assert.deepStrictEqual(binding.valueCallback(), { foo: 'bar' });
|
|
20
20
|
|
|
21
|
-
/* eslint-disable-next-line
|
|
21
|
+
/* eslint-disable-next-line new-cap */
|
|
22
22
|
assert.strictEqual(new binding.newTargetCallback(), binding.newTargetCallback);
|
|
23
23
|
assert.strictEqual(binding.newTargetCallback(), undefined);
|
|
24
24
|
|
|
@@ -89,7 +89,7 @@ function test (binding) {
|
|
|
89
89
|
assert.deepStrictEqual(args, [7, 8, 9]);
|
|
90
90
|
|
|
91
91
|
assert.throws(() => {
|
|
92
|
-
binding.callWithInvalidReceiver();
|
|
92
|
+
binding.callWithInvalidReceiver(() => {});
|
|
93
93
|
}, /Invalid (pointer passed as )?argument/);
|
|
94
94
|
|
|
95
95
|
obj = binding.callConstructorWithArgs(testConstructor, 5, 6, 7);
|
|
@@ -95,7 +95,7 @@ async function canCallAsyncFunctionWithDifferentOverloads (binding) {
|
|
|
95
95
|
{
|
|
96
96
|
eventName: 'init',
|
|
97
97
|
type: 'func_ref_resources',
|
|
98
|
-
triggerAsyncId
|
|
98
|
+
triggerAsyncId,
|
|
99
99
|
resource: {}
|
|
100
100
|
},
|
|
101
101
|
{ eventName: 'before' },
|
|
@@ -113,7 +113,7 @@ async function canCallAsyncFunctionWithDifferentOverloads (binding) {
|
|
|
113
113
|
{
|
|
114
114
|
eventName: 'init',
|
|
115
115
|
type: 'func_ref_resources',
|
|
116
|
-
triggerAsyncId
|
|
116
|
+
triggerAsyncId,
|
|
117
117
|
resource: {}
|
|
118
118
|
},
|
|
119
119
|
{ eventName: 'before' },
|
|
@@ -5,27 +5,27 @@ using namespace Napi;
|
|
|
5
5
|
|
|
6
6
|
Value DeletePropertyWithCStyleStringAsKey(const CallbackInfo& info) {
|
|
7
7
|
Object globalObject = info.Env().Global();
|
|
8
|
-
String key = info[0].
|
|
8
|
+
String key = info[0].UnsafeAs<String>();
|
|
9
9
|
return Boolean::New(
|
|
10
10
|
info.Env(), MaybeUnwrap(globalObject.Delete(key.Utf8Value().c_str())));
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
Value DeletePropertyWithCppStyleStringAsKey(const CallbackInfo& info) {
|
|
14
14
|
Object globalObject = info.Env().Global();
|
|
15
|
-
String key = info[0].
|
|
15
|
+
String key = info[0].UnsafeAs<String>();
|
|
16
16
|
return Boolean::New(info.Env(),
|
|
17
17
|
MaybeUnwrap(globalObject.Delete(key.Utf8Value())));
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
Value DeletePropertyWithInt32AsKey(const CallbackInfo& info) {
|
|
21
21
|
Object globalObject = info.Env().Global();
|
|
22
|
-
Number key = info[0].
|
|
22
|
+
Number key = info[0].UnsafeAs<Number>();
|
|
23
23
|
return Boolean::New(info.Env(),
|
|
24
24
|
MaybeUnwrap(globalObject.Delete(key.Uint32Value())));
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
Value DeletePropertyWithNapiValueAsKey(const CallbackInfo& info) {
|
|
28
28
|
Object globalObject = info.Env().Global();
|
|
29
|
-
Name key = info[0].
|
|
29
|
+
Name key = info[0].UnsafeAs<Name>();
|
|
30
30
|
return Boolean::New(info.Env(), MaybeUnwrap(globalObject.Delete(key)));
|
|
31
31
|
}
|