@gjsify/lightningcss-wasm 0.4.28 → 0.4.30
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/package.json +3 -3
- package/src/async.mjs +57 -51
- package/src/browserslistToTargets.js +35 -35
- package/src/composeVisitors.js +346 -346
- package/src/flags.js +24 -24
- package/src/index.mjs +47 -47
- package/src/napi-wasm.mjs +1338 -1323
package/src/napi-wasm.mjs
CHANGED
|
@@ -18,322 +18,324 @@ const NAPI_STATIC = 1 << 10;
|
|
|
18
18
|
|
|
19
19
|
// https://nodejs.org/api/n-api.html#napi_typedarray_type
|
|
20
20
|
const typedArrays = [
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
21
|
+
Int8Array,
|
|
22
|
+
Uint8Array,
|
|
23
|
+
Uint8ClampedArray,
|
|
24
|
+
Int16Array,
|
|
25
|
+
Uint16Array,
|
|
26
|
+
Int32Array,
|
|
27
|
+
Uint32Array,
|
|
28
|
+
Float32Array,
|
|
29
|
+
Float64Array,
|
|
30
|
+
BigInt64Array,
|
|
31
|
+
BigUint64Array,
|
|
32
32
|
];
|
|
33
33
|
|
|
34
34
|
const environments = [];
|
|
35
35
|
|
|
36
36
|
export class Environment {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
37
|
+
scopes = [];
|
|
38
|
+
referenceId = 1;
|
|
39
|
+
references = new Map();
|
|
40
|
+
deferred = [null];
|
|
41
|
+
wrappedObjects = new WeakMap();
|
|
42
|
+
externalObjects = new WeakMap();
|
|
43
|
+
buffers = new Map();
|
|
44
|
+
instanceData = 0;
|
|
45
|
+
pendingException = null;
|
|
46
|
+
|
|
47
|
+
constructor(instance) {
|
|
48
|
+
this.id = environments.length;
|
|
49
|
+
environments.push(this);
|
|
50
|
+
|
|
51
|
+
this.instance = instance;
|
|
52
|
+
this.table = instance.exports.__indirect_function_table;
|
|
53
|
+
this.exports = {};
|
|
54
|
+
|
|
55
|
+
this.pushScope();
|
|
56
|
+
let values = this.scopes[this.scopes.length - 1];
|
|
57
|
+
let exports = values.length;
|
|
58
|
+
values.push(this.exports);
|
|
59
|
+
|
|
60
|
+
try {
|
|
61
|
+
if (this.instance.exports.napi_register_module_v1) {
|
|
62
|
+
this.instance.exports.napi_register_module_v1(this.id, exports);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (this.instance.exports.napi_register_wasm_v1) {
|
|
66
|
+
this.instance.exports.napi_register_wasm_v1(this.id, exports);
|
|
67
|
+
}
|
|
68
|
+
} finally {
|
|
69
|
+
this.popScope();
|
|
70
|
+
if (this.pendingException) {
|
|
71
|
+
let e = this.pendingException;
|
|
72
|
+
this.pendingException = null;
|
|
73
|
+
// oxlint-disable-next-line no-unsafe-finally -- intentional: a pending NAPI exception must override the try result
|
|
74
|
+
throw e;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
75
77
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
environments[this.id] = undefined;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
getString(ptr, len = strlen(this.memory, ptr)) {
|
|
83
|
-
return decoder.decode(this.memory.subarray(ptr, Math.max(0, ptr + len)));
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
pushScope() {
|
|
87
|
-
let id = this.scopes.length;
|
|
88
|
-
this.scopes.push(id ? [...this.scopes[id - 1]] : [undefined, null, globalThis, true, false]);
|
|
89
|
-
return id;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
popScope() {
|
|
93
|
-
this.scopes.pop();
|
|
94
|
-
|
|
95
|
-
// Update any buffers with values which might have been modified in WASM copy.
|
|
96
|
-
for (let [buffer, slice] of this.buffers) {
|
|
97
|
-
// Ignore if buffer or slice has been detached.
|
|
98
|
-
if (buffer.byteLength && slice.byteLength) {
|
|
99
|
-
buffer.set(slice);
|
|
100
|
-
}
|
|
78
|
+
|
|
79
|
+
destroy() {
|
|
80
|
+
environments[this.id] = undefined;
|
|
101
81
|
}
|
|
102
82
|
|
|
103
|
-
this.
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
get(idx) {
|
|
107
|
-
return this.scopes[this.scopes.length - 1][idx];
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
set(idx, value) {
|
|
111
|
-
this.scopes[this.scopes.length - 1][idx] = value;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
pushValue(value, scope = this.scopes.length - 1) {
|
|
115
|
-
let values = this.scopes[scope];
|
|
116
|
-
let id = values.length;
|
|
117
|
-
values.push(value);
|
|
118
|
-
return id;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
createValue(value, result, scope) {
|
|
122
|
-
if (typeof value === 'boolean') {
|
|
123
|
-
this.setPointer(result, value ? 3 : 4);
|
|
124
|
-
return NAPI_OK;
|
|
125
|
-
} else if (typeof value === 'undefined') {
|
|
126
|
-
this.setPointer(result, 0);
|
|
127
|
-
return NAPI_OK;
|
|
128
|
-
} else if (value === null) {
|
|
129
|
-
this.setPointer(result, 1);
|
|
130
|
-
return NAPI_OK;
|
|
131
|
-
} else if (value === globalThis) {
|
|
132
|
-
this.setPointer(result, 2);
|
|
133
|
-
return NAPI_OK;
|
|
83
|
+
getString(ptr, len = strlen(this.memory, ptr)) {
|
|
84
|
+
return decoder.decode(this.memory.subarray(ptr, Math.max(0, ptr + len)));
|
|
134
85
|
}
|
|
135
86
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
87
|
+
pushScope() {
|
|
88
|
+
let id = this.scopes.length;
|
|
89
|
+
this.scopes.push(id ? [...this.scopes[id - 1]] : [undefined, null, globalThis, true, false]);
|
|
90
|
+
return id;
|
|
91
|
+
}
|
|
140
92
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
93
|
+
popScope() {
|
|
94
|
+
this.scopes.pop();
|
|
95
|
+
|
|
96
|
+
// Update any buffers with values which might have been modified in WASM copy.
|
|
97
|
+
for (let [buffer, slice] of this.buffers) {
|
|
98
|
+
// Ignore if buffer or slice has been detached.
|
|
99
|
+
if (buffer.byteLength && slice.byteLength) {
|
|
100
|
+
buffer.set(slice);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
145
103
|
|
|
146
|
-
|
|
147
|
-
get u32() {
|
|
148
|
-
if (this._u32.byteLength === 0) {
|
|
149
|
-
this._u32 = new Uint32Array(this.instance.exports.memory.buffer);
|
|
104
|
+
this.buffers.clear();
|
|
150
105
|
}
|
|
151
106
|
|
|
152
|
-
|
|
153
|
-
|
|
107
|
+
get(idx) {
|
|
108
|
+
return this.scopes[this.scopes.length - 1][idx];
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
set(idx, value) {
|
|
112
|
+
this.scopes[this.scopes.length - 1][idx] = value;
|
|
113
|
+
}
|
|
154
114
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
115
|
+
pushValue(value, scope = this.scopes.length - 1) {
|
|
116
|
+
let values = this.scopes[scope];
|
|
117
|
+
let id = values.length;
|
|
118
|
+
values.push(value);
|
|
119
|
+
return id;
|
|
159
120
|
}
|
|
160
121
|
|
|
161
|
-
|
|
162
|
-
|
|
122
|
+
createValue(value, result, scope) {
|
|
123
|
+
if (typeof value === 'boolean') {
|
|
124
|
+
this.setPointer(result, value ? 3 : 4);
|
|
125
|
+
return NAPI_OK;
|
|
126
|
+
} else if (typeof value === 'undefined') {
|
|
127
|
+
this.setPointer(result, 0);
|
|
128
|
+
return NAPI_OK;
|
|
129
|
+
} else if (value === null) {
|
|
130
|
+
this.setPointer(result, 1);
|
|
131
|
+
return NAPI_OK;
|
|
132
|
+
} else if (value === globalThis) {
|
|
133
|
+
this.setPointer(result, 2);
|
|
134
|
+
return NAPI_OK;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
let id = this.pushValue(value, scope);
|
|
138
|
+
this.setPointer(result, id);
|
|
139
|
+
return NAPI_OK;
|
|
140
|
+
}
|
|
163
141
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
this._u16 = new Uint16Array(this.instance.exports.memory.buffer);
|
|
142
|
+
setPointer(ptr, value) {
|
|
143
|
+
this.u32[ptr >> 2] = value;
|
|
144
|
+
return NAPI_OK;
|
|
168
145
|
}
|
|
169
146
|
|
|
170
|
-
|
|
171
|
-
|
|
147
|
+
_u32 = new Uint32Array();
|
|
148
|
+
get u32() {
|
|
149
|
+
if (this._u32.byteLength === 0) {
|
|
150
|
+
this._u32 = new Uint32Array(this.instance.exports.memory.buffer);
|
|
151
|
+
}
|
|
172
152
|
|
|
173
|
-
|
|
174
|
-
get u64() {
|
|
175
|
-
if (this._u64.byteLength === 0) {
|
|
176
|
-
this._u64 = new BigUint64Array(this.instance.exports.memory.buffer);
|
|
153
|
+
return this._u32;
|
|
177
154
|
}
|
|
178
155
|
|
|
179
|
-
|
|
180
|
-
|
|
156
|
+
_i32 = new Int32Array();
|
|
157
|
+
get i32() {
|
|
158
|
+
if (this._i32.byteLength === 0) {
|
|
159
|
+
this._i32 = new Int32Array(this.instance.exports.memory.buffer);
|
|
160
|
+
}
|
|
181
161
|
|
|
182
|
-
|
|
183
|
-
get i64() {
|
|
184
|
-
if (this._i64.byteLength === 0) {
|
|
185
|
-
this._i64 = new BigInt64Array(this.instance.exports.memory.buffer);
|
|
162
|
+
return this._i32;
|
|
186
163
|
}
|
|
187
164
|
|
|
188
|
-
|
|
189
|
-
|
|
165
|
+
_u16 = new Uint16Array();
|
|
166
|
+
get u16() {
|
|
167
|
+
if (this._u16.byteLength === 0) {
|
|
168
|
+
this._u16 = new Uint16Array(this.instance.exports.memory.buffer);
|
|
169
|
+
}
|
|
190
170
|
|
|
191
|
-
|
|
192
|
-
get f64() {
|
|
193
|
-
if (this._f64.byteLength === 0) {
|
|
194
|
-
this._f64 = new Float64Array(this.instance.exports.memory.buffer);
|
|
171
|
+
return this._u16;
|
|
195
172
|
}
|
|
196
173
|
|
|
197
|
-
|
|
198
|
-
|
|
174
|
+
_u64 = new BigUint64Array();
|
|
175
|
+
get u64() {
|
|
176
|
+
if (this._u64.byteLength === 0) {
|
|
177
|
+
this._u64 = new BigUint64Array(this.instance.exports.memory.buffer);
|
|
178
|
+
}
|
|
199
179
|
|
|
200
|
-
|
|
201
|
-
get memory() {
|
|
202
|
-
if (this._buf.byteLength === 0) {
|
|
203
|
-
this._buf = new Uint8Array(this.instance.exports.memory.buffer);
|
|
180
|
+
return this._u64;
|
|
204
181
|
}
|
|
205
182
|
|
|
206
|
-
|
|
207
|
-
|
|
183
|
+
_i64 = new BigInt64Array();
|
|
184
|
+
get i64() {
|
|
185
|
+
if (this._i64.byteLength === 0) {
|
|
186
|
+
this._i64 = new BigInt64Array(this.instance.exports.memory.buffer);
|
|
187
|
+
}
|
|
208
188
|
|
|
209
|
-
|
|
210
|
-
if (this.buffers.has(buf)) {
|
|
211
|
-
let b = this.buffers.get(buf);
|
|
212
|
-
this.setPointer(ptr, b.byteOffset);
|
|
213
|
-
return b.byteLength;
|
|
189
|
+
return this._i64;
|
|
214
190
|
}
|
|
215
191
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
192
|
+
_f64 = new Float64Array();
|
|
193
|
+
get f64() {
|
|
194
|
+
if (this._f64.byteLength === 0) {
|
|
195
|
+
this._f64 = new Float64Array(this.instance.exports.memory.buffer);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return this._f64;
|
|
220
199
|
}
|
|
221
200
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
201
|
+
_buf = new Uint8Array();
|
|
202
|
+
get memory() {
|
|
203
|
+
if (this._buf.byteLength === 0) {
|
|
204
|
+
this._buf = new Uint8Array(this.instance.exports.memory.buffer);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
return this._buf;
|
|
226
208
|
}
|
|
227
209
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
let ptr = this.instance.exports.napi_wasm_malloc(data.byteLength);
|
|
235
|
-
let mem = this.memory;
|
|
236
|
-
mem.set(data, ptr);
|
|
237
|
-
let buf = mem.subarray(ptr, ptr + data.byteLength);
|
|
238
|
-
let finalize = (_env, data) => {
|
|
239
|
-
if (this.instance.exports.napi_wasm_free) {
|
|
240
|
-
this.instance.exports.napi_wasm_free(data);
|
|
241
|
-
}
|
|
242
|
-
};
|
|
243
|
-
|
|
244
|
-
finalizationRegistry.register(buf, new FinalizeRecord(this.id, finalize, 0, ptr));
|
|
245
|
-
this.buffers.set(data, buf);
|
|
246
|
-
return buf;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
createFunction(cb, data) {
|
|
250
|
-
let env = this;
|
|
251
|
-
let fn = env.table.get(cb);
|
|
252
|
-
let func = function (...args) {
|
|
253
|
-
let scope = env.pushScope();
|
|
254
|
-
|
|
255
|
-
try {
|
|
256
|
-
let values = env.scopes[scope];
|
|
257
|
-
let info = values.length;
|
|
258
|
-
values.push({
|
|
259
|
-
thisArg: this,
|
|
260
|
-
args,
|
|
261
|
-
data,
|
|
262
|
-
newTarget: new.target
|
|
263
|
-
});
|
|
210
|
+
getBufferInfo(buf, ptr) {
|
|
211
|
+
if (this.buffers.has(buf)) {
|
|
212
|
+
let b = this.buffers.get(buf);
|
|
213
|
+
this.setPointer(ptr, b.byteOffset);
|
|
214
|
+
return b.byteLength;
|
|
215
|
+
}
|
|
264
216
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
if (env.pendingException) {
|
|
270
|
-
let e = env.pendingException;
|
|
271
|
-
env.pendingException = null;
|
|
272
|
-
throw e;
|
|
217
|
+
if (buf instanceof ArrayBuffer) {
|
|
218
|
+
let b = this.copyBuffer(new Uint8Array(buf));
|
|
219
|
+
this.setPointer(ptr, b.byteOffset);
|
|
220
|
+
return b.byteLength;
|
|
273
221
|
}
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
222
|
+
|
|
223
|
+
// If this is a view into WASM memory, no copies needed.
|
|
224
|
+
if (buf.buffer === this.instance.exports.memory.buffer) {
|
|
225
|
+
this.setPointer(ptr, buf.byteOffset);
|
|
226
|
+
return buf.byteLength;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
let b = this.copyBuffer(new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength));
|
|
230
|
+
this.setPointer(ptr, b.byteOffset);
|
|
231
|
+
return b.byteLength;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
copyBuffer(data) {
|
|
235
|
+
let ptr = this.instance.exports.napi_wasm_malloc(data.byteLength);
|
|
236
|
+
let mem = this.memory;
|
|
237
|
+
mem.set(data, ptr);
|
|
238
|
+
let buf = mem.subarray(ptr, ptr + data.byteLength);
|
|
239
|
+
let finalize = (_env, data) => {
|
|
240
|
+
if (this.instance.exports.napi_wasm_free) {
|
|
241
|
+
this.instance.exports.napi_wasm_free(data);
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
finalizationRegistry.register(buf, new FinalizeRecord(this.id, finalize, 0, ptr));
|
|
246
|
+
this.buffers.set(data, buf);
|
|
247
|
+
return buf;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
createFunction(cb, data) {
|
|
251
|
+
let env = this;
|
|
252
|
+
let fn = env.table.get(cb);
|
|
253
|
+
let func = function (...args) {
|
|
254
|
+
let scope = env.pushScope();
|
|
255
|
+
|
|
256
|
+
try {
|
|
257
|
+
let values = env.scopes[scope];
|
|
258
|
+
let info = values.length;
|
|
259
|
+
values.push({
|
|
260
|
+
thisArg: this,
|
|
261
|
+
args,
|
|
262
|
+
data,
|
|
263
|
+
newTarget: new.target,
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
let res = fn(env.id, info);
|
|
267
|
+
return env.get(res);
|
|
268
|
+
} finally {
|
|
269
|
+
env.popScope();
|
|
270
|
+
if (env.pendingException) {
|
|
271
|
+
let e = env.pendingException;
|
|
272
|
+
env.pendingException = null;
|
|
273
|
+
// oxlint-disable-next-line no-unsafe-finally -- intentional: a pending NAPI exception must override the try result
|
|
274
|
+
throw e;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
return func;
|
|
313
280
|
}
|
|
314
281
|
|
|
315
|
-
|
|
316
|
-
|
|
282
|
+
readPropertyDescriptor(ptr) {
|
|
283
|
+
// https://nodejs.org/api/n-api.html#napi_property_descriptor
|
|
284
|
+
let buf = this.u32;
|
|
285
|
+
let utf8name = buf[ptr++];
|
|
286
|
+
let nameValue = buf[ptr++];
|
|
287
|
+
let method = buf[ptr++];
|
|
288
|
+
let getter = buf[ptr++];
|
|
289
|
+
let setter = buf[ptr++];
|
|
290
|
+
let val = buf[ptr++];
|
|
291
|
+
let attrs = buf[ptr++];
|
|
292
|
+
let data = buf[ptr++];
|
|
293
|
+
|
|
294
|
+
let name = utf8name ? this.getString(utf8name) : this.get(nameValue);
|
|
295
|
+
let writable = Boolean(attrs & NAPI_WRITABLE);
|
|
296
|
+
let enumerable = Boolean(attrs & NAPI_ENUMERABLE);
|
|
297
|
+
let configurable = Boolean(attrs & NAPI_CONFIGURABLE);
|
|
298
|
+
let isStatic = Boolean(attrs & NAPI_STATIC);
|
|
299
|
+
let get = getter ? this.createFunction(getter, data) : undefined;
|
|
300
|
+
let set = setter ? this.createFunction(setter, data) : undefined;
|
|
301
|
+
let value = method ? this.createFunction(method, data) : val ? this.get(val) : undefined;
|
|
302
|
+
|
|
303
|
+
let descriptor = {
|
|
304
|
+
name,
|
|
305
|
+
static: isStatic,
|
|
306
|
+
configurable,
|
|
307
|
+
enumerable,
|
|
308
|
+
};
|
|
309
|
+
if (get || set) {
|
|
310
|
+
descriptor.get = get;
|
|
311
|
+
descriptor.set = set;
|
|
312
|
+
} else if (value) {
|
|
313
|
+
descriptor.writable = writable;
|
|
314
|
+
descriptor.value = value;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
return descriptor;
|
|
318
|
+
}
|
|
317
319
|
}
|
|
318
320
|
|
|
319
|
-
const decoder = new TextDecoder(
|
|
321
|
+
const decoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });
|
|
320
322
|
const latin1Decoder = new TextDecoder('latin1');
|
|
321
323
|
const utf16Decoder = new TextDecoder('utf-16');
|
|
322
324
|
const encoder = new TextEncoder();
|
|
323
325
|
|
|
324
326
|
class FinalizeRecord {
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
327
|
+
constructor(env, finalize, hint, data) {
|
|
328
|
+
this.env = env;
|
|
329
|
+
this.finalize = finalize;
|
|
330
|
+
this.hint = hint;
|
|
331
|
+
this.data = data;
|
|
332
|
+
}
|
|
331
333
|
}
|
|
332
334
|
|
|
333
|
-
const finalizationRegistry = new FinalizationRegistry(buffer => {
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
335
|
+
const finalizationRegistry = new FinalizationRegistry((buffer) => {
|
|
336
|
+
if (buffer.finalize) {
|
|
337
|
+
buffer.finalize(buffer.env, buffer.data, buffer.hint);
|
|
338
|
+
}
|
|
337
339
|
});
|
|
338
340
|
|
|
339
341
|
class ExternalValue {}
|
|
@@ -341,1096 +343,1109 @@ class ExternalValue {}
|
|
|
341
343
|
const threadsafeFunctions = [];
|
|
342
344
|
|
|
343
345
|
class ThreadSafeFunction {
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
346
|
+
constructor(env, fn, nativeFn, context) {
|
|
347
|
+
this.env = env;
|
|
348
|
+
this.fn = fn;
|
|
349
|
+
this.nativeFn = nativeFn;
|
|
350
|
+
this.context = context;
|
|
351
|
+
this.id = threadsafeFunctions.length;
|
|
352
|
+
threadsafeFunctions.push(this);
|
|
353
|
+
}
|
|
352
354
|
}
|
|
353
355
|
|
|
354
356
|
const asyncWork = [null];
|
|
355
357
|
|
|
356
358
|
class AsyncWork {
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
359
|
+
constructor(env, execute, complete, data) {
|
|
360
|
+
this.env = env;
|
|
361
|
+
this.execute = execute;
|
|
362
|
+
this.complete = complete;
|
|
363
|
+
this.data = data;
|
|
364
|
+
this.id = asyncWork.length;
|
|
365
|
+
asyncWork.push(this);
|
|
366
|
+
}
|
|
365
367
|
}
|
|
366
368
|
|
|
367
369
|
export const napi = {
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
let ptr = properties >> 2;
|
|
514
|
-
for (let i = 0; i < property_count; i++) {
|
|
515
|
-
let descriptor = env.readPropertyDescriptor(ptr);
|
|
516
|
-
if (descriptor.static) {
|
|
517
|
-
Object.defineProperty(func, descriptor.name, descriptor);
|
|
518
|
-
} else {
|
|
519
|
-
Object.defineProperty(func.prototype, descriptor.name, descriptor);
|
|
520
|
-
}
|
|
521
|
-
ptr += 8;
|
|
522
|
-
}
|
|
370
|
+
napi_open_handle_scope(env_id, result) {
|
|
371
|
+
let env = environments[env_id];
|
|
372
|
+
let id = env.pushScope();
|
|
373
|
+
return env.setPointer(result, id);
|
|
374
|
+
},
|
|
375
|
+
napi_close_handle_scope(env_id, scope) {
|
|
376
|
+
let env = environments[env_id];
|
|
377
|
+
if (scope !== env.scopes.length - 1) {
|
|
378
|
+
return NAPI_HANDLE_SCOPE_MISMATCH;
|
|
379
|
+
}
|
|
380
|
+
env.popScope();
|
|
381
|
+
return NAPI_OK;
|
|
382
|
+
},
|
|
383
|
+
napi_open_escapable_handle_scope(env_id, result) {
|
|
384
|
+
let env = environments[env_id];
|
|
385
|
+
let id = env.pushScope();
|
|
386
|
+
return env.setPointer(result, id);
|
|
387
|
+
},
|
|
388
|
+
napi_close_escapable_handle_scope(env_id, scope) {
|
|
389
|
+
let env = environments[env_id];
|
|
390
|
+
if (scope !== env.scopes.length - 1) {
|
|
391
|
+
return NAPI_HANDLE_SCOPE_MISMATCH;
|
|
392
|
+
}
|
|
393
|
+
env.popScope();
|
|
394
|
+
return NAPI_OK;
|
|
395
|
+
},
|
|
396
|
+
napi_escape_handle(env_id, scope_id, escapee, result) {
|
|
397
|
+
let env = environments[env_id];
|
|
398
|
+
let value = env.get(escapee);
|
|
399
|
+
// Create a value in the outer scope.
|
|
400
|
+
return env.createValue(value, result, scope_id - 1);
|
|
401
|
+
},
|
|
402
|
+
napi_create_object(env_id, result) {
|
|
403
|
+
let env = environments[env_id];
|
|
404
|
+
return env.createValue({}, result);
|
|
405
|
+
},
|
|
406
|
+
napi_set_property(env_id, object, key, value) {
|
|
407
|
+
let env = environments[env_id];
|
|
408
|
+
let obj = env.get(object);
|
|
409
|
+
let name = env.get(key);
|
|
410
|
+
let val = env.get(value);
|
|
411
|
+
obj[name] = val;
|
|
412
|
+
return NAPI_OK;
|
|
413
|
+
},
|
|
414
|
+
napi_get_property(env_id, object, key, result) {
|
|
415
|
+
let env = environments[env_id];
|
|
416
|
+
let obj = env.get(object);
|
|
417
|
+
let name = env.get(key);
|
|
418
|
+
return env.createValue(obj[name], result);
|
|
419
|
+
},
|
|
420
|
+
napi_delete_property(env_id, object, key, result) {
|
|
421
|
+
let env = environments[env_id];
|
|
422
|
+
let obj = env.get(object);
|
|
423
|
+
let name = env.get(key);
|
|
424
|
+
let res = false;
|
|
425
|
+
try {
|
|
426
|
+
res = delete obj[name];
|
|
427
|
+
} catch (_err) {}
|
|
428
|
+
if (result) {
|
|
429
|
+
env.memory[result] = res ? 1 : 0;
|
|
430
|
+
}
|
|
431
|
+
return NAPI_OK;
|
|
432
|
+
},
|
|
433
|
+
napi_has_property(env_id, object, key, result) {
|
|
434
|
+
let env = environments[env_id];
|
|
435
|
+
let obj = env.get(object);
|
|
436
|
+
let name = env.get(key);
|
|
437
|
+
// return env.setPointer(result, name in obj ? 1 : 0);
|
|
438
|
+
env.memory[result] = name in obj ? 1 : 0;
|
|
439
|
+
return NAPI_OK;
|
|
440
|
+
},
|
|
441
|
+
napi_has_own_property(env_id, object, key, result) {
|
|
442
|
+
let env = environments[env_id];
|
|
443
|
+
let obj = env.get(object);
|
|
444
|
+
let name = env.get(key);
|
|
445
|
+
env.memory[result] = obj.hasOwnProperty(name) ? 1 : 0;
|
|
446
|
+
return NAPI_OK;
|
|
447
|
+
},
|
|
448
|
+
napi_set_named_property(env_id, object, utf8Name, value) {
|
|
449
|
+
let env = environments[env_id];
|
|
450
|
+
let obj = env.get(object);
|
|
451
|
+
let val = env.get(value);
|
|
452
|
+
let name = env.getString(utf8Name);
|
|
453
|
+
obj[name] = val;
|
|
454
|
+
return NAPI_OK;
|
|
455
|
+
},
|
|
456
|
+
napi_get_named_property(env_id, object, utf8Name, result) {
|
|
457
|
+
let env = environments[env_id];
|
|
458
|
+
let obj = env.get(object);
|
|
459
|
+
let name = env.getString(utf8Name);
|
|
460
|
+
return env.createValue(obj[name], result);
|
|
461
|
+
},
|
|
462
|
+
napi_has_named_property(env_id, object, utf8Name, result) {
|
|
463
|
+
let env = environments[env_id];
|
|
464
|
+
let obj = env.get(object);
|
|
465
|
+
let name = env.getString(utf8Name);
|
|
466
|
+
env.memory[result] = name in obj ? 1 : 0;
|
|
467
|
+
return NAPI_OK;
|
|
468
|
+
},
|
|
469
|
+
napi_get_property_names(env_id, object, result) {
|
|
470
|
+
let env = environments[env_id];
|
|
471
|
+
let obj = env.get(object);
|
|
472
|
+
let properties = Object.keys(obj);
|
|
473
|
+
return env.createValue(properties, result);
|
|
474
|
+
},
|
|
475
|
+
napi_get_all_property_names(_env_id, _object, _key_mode, _key_filter, _key_conversion, _result) {
|
|
476
|
+
throw new Error('not implemented');
|
|
477
|
+
},
|
|
478
|
+
napi_define_properties(env_id, object, property_count, properties) {
|
|
479
|
+
let env = environments[env_id];
|
|
480
|
+
let obj = env.get(object);
|
|
481
|
+
let ptr = properties >> 2;
|
|
482
|
+
for (let i = 0; i < property_count; i++) {
|
|
483
|
+
let descriptor = env.readPropertyDescriptor(ptr);
|
|
484
|
+
Object.defineProperty(obj, descriptor.name, descriptor);
|
|
485
|
+
ptr += 8;
|
|
486
|
+
}
|
|
487
|
+
return NAPI_OK;
|
|
488
|
+
},
|
|
489
|
+
napi_object_freeze(env_id, object) {
|
|
490
|
+
let env = environments[env_id];
|
|
491
|
+
let obj = env.get(object);
|
|
492
|
+
Object.freeze(obj);
|
|
493
|
+
return NAPI_OK;
|
|
494
|
+
},
|
|
495
|
+
napi_object_seal(env_id, object) {
|
|
496
|
+
let env = environments[env_id];
|
|
497
|
+
let obj = env.get(object);
|
|
498
|
+
Object.seal(obj);
|
|
499
|
+
return NAPI_OK;
|
|
500
|
+
},
|
|
501
|
+
napi_get_prototype(env_id, object, result) {
|
|
502
|
+
let env = environments[env_id];
|
|
503
|
+
let obj = env.get(object);
|
|
504
|
+
return env.createValue(Object.getPrototypeOf(obj), result);
|
|
505
|
+
},
|
|
506
|
+
napi_define_class(env_id, utf8name, length, constructor, data, property_count, properties, result) {
|
|
507
|
+
let env = environments[env_id];
|
|
508
|
+
let func = env.createFunction(constructor, data);
|
|
509
|
+
|
|
510
|
+
Object.defineProperty(func, 'name', {
|
|
511
|
+
value: env.getString(utf8name, length),
|
|
512
|
+
configurable: true,
|
|
513
|
+
});
|
|
523
514
|
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
},
|
|
535
|
-
napi_delete_reference(env_id, ref) {
|
|
536
|
-
let env = environments[env_id];
|
|
537
|
-
env.references.delete(ref);
|
|
538
|
-
return NAPI_OK;
|
|
539
|
-
},
|
|
540
|
-
napi_get_reference_value(env_id, ref, result) {
|
|
541
|
-
let env = environments[env_id];
|
|
542
|
-
let reference = env.references.get(ref);
|
|
543
|
-
return env.createValue(reference.value, result);
|
|
544
|
-
},
|
|
545
|
-
napi_reference_ref(env_id, ref, result) {
|
|
546
|
-
let env = environments[env_id];
|
|
547
|
-
let reference = env.references.get(ref);
|
|
548
|
-
reference.refcount++;
|
|
549
|
-
return env.setPointer(result, reference.refcount);
|
|
550
|
-
},
|
|
551
|
-
napi_reference_unref(env_id, ref, result) {
|
|
552
|
-
let env = environments[env_id];
|
|
553
|
-
let reference = env.references.get(ref);
|
|
554
|
-
if (reference.refcount === 0) {
|
|
555
|
-
return NAPI_GENERIC_FAILURE;
|
|
556
|
-
}
|
|
557
|
-
reference.refcount--;
|
|
558
|
-
return env.setPointer(result, reference.refcount);
|
|
559
|
-
},
|
|
560
|
-
napi_add_env_cleanup_hook() {
|
|
561
|
-
return NAPI_OK;
|
|
562
|
-
},
|
|
563
|
-
napi_remove_env_cleanup_hook() {
|
|
564
|
-
return NAPI_OK;
|
|
565
|
-
},
|
|
566
|
-
napi_add_async_cleanup_hook() {
|
|
567
|
-
return NAPI_OK;
|
|
568
|
-
},
|
|
569
|
-
napi_remove_async_cleanup_hook() {
|
|
570
|
-
return NAPI_OK;
|
|
571
|
-
},
|
|
572
|
-
napi_set_instance_data(env_id, data, finalize_cb, finalize_hint) {
|
|
573
|
-
let env = environments[env_id];
|
|
574
|
-
env.instanceData = data;
|
|
575
|
-
return NAPI_OK;
|
|
576
|
-
},
|
|
577
|
-
napi_get_instance_data(env_id, data) {
|
|
578
|
-
let env = environments[env_id];
|
|
579
|
-
return env.setPointer(data, env.instanceData);
|
|
580
|
-
},
|
|
581
|
-
napi_get_boolean(env_id, value, result) {
|
|
582
|
-
let env = environments[env_id];
|
|
583
|
-
return env.setPointer(result, value ? 3 : 4);
|
|
584
|
-
},
|
|
585
|
-
napi_get_value_bool(env_id, value, result) {
|
|
586
|
-
let env = environments[env_id];
|
|
587
|
-
let val = env.get(value);
|
|
588
|
-
if (typeof val !== "boolean") {
|
|
589
|
-
return NAPI_BOOLEAN_EXPECTED;
|
|
590
|
-
}
|
|
591
|
-
env.memory[result] = val ? 1 : 0;
|
|
592
|
-
return NAPI_OK;
|
|
593
|
-
},
|
|
594
|
-
napi_create_int32(env_id, value, result) {
|
|
595
|
-
let env = environments[env_id];
|
|
596
|
-
return env.createValue(value, result);
|
|
597
|
-
},
|
|
598
|
-
napi_get_value_int32(env_id, value, result) {
|
|
599
|
-
let env = environments[env_id];
|
|
600
|
-
let val = env.get(value);
|
|
601
|
-
if (typeof val !== "number") {
|
|
602
|
-
return NAPI_NUMBER_EXPECTED;
|
|
603
|
-
}
|
|
604
|
-
env.i32[result >> 2] = val;
|
|
605
|
-
return NAPI_OK;
|
|
606
|
-
},
|
|
607
|
-
napi_create_uint32(env_id, value, result) {
|
|
608
|
-
let env = environments[env_id];
|
|
609
|
-
return env.createValue(value, result);
|
|
610
|
-
},
|
|
611
|
-
napi_get_value_uint32(env_id, value, result) {
|
|
612
|
-
let env = environments[env_id];
|
|
613
|
-
let val = env.get(value);
|
|
614
|
-
if (typeof val !== "number") {
|
|
615
|
-
return NAPI_NUMBER_EXPECTED;
|
|
616
|
-
}
|
|
617
|
-
return env.setPointer(result, val);
|
|
618
|
-
},
|
|
619
|
-
napi_create_int64(env_id, value, result) {
|
|
620
|
-
let env = environments[env_id];
|
|
621
|
-
return env.createValue(Number(value), result);
|
|
622
|
-
},
|
|
623
|
-
napi_get_value_int64(env_id, value, result) {
|
|
624
|
-
let env = environments[env_id];
|
|
625
|
-
let val = env.get(value);
|
|
626
|
-
if (typeof val !== "number") {
|
|
627
|
-
return NAPI_NUMBER_EXPECTED;
|
|
628
|
-
}
|
|
629
|
-
env.i64[result >> 3] = val;
|
|
630
|
-
return NAPI_OK;
|
|
631
|
-
},
|
|
632
|
-
napi_create_double(env_id, value, result) {
|
|
633
|
-
let env = environments[env_id];
|
|
634
|
-
return env.createValue(value, result);
|
|
635
|
-
},
|
|
636
|
-
napi_get_value_double(env_id, value, result) {
|
|
637
|
-
let env = environments[env_id];
|
|
638
|
-
let val = env.get(value);
|
|
639
|
-
if (typeof val !== "number") {
|
|
640
|
-
return NAPI_NUMBER_EXPECTED;
|
|
641
|
-
}
|
|
642
|
-
env.f64[result >> 3] = val;
|
|
643
|
-
return NAPI_OK;
|
|
644
|
-
},
|
|
645
|
-
napi_create_bigint_int64(env_id, value, result) {
|
|
646
|
-
let env = environments[env_id];
|
|
647
|
-
return env.createValue(BigInt.asIntN(64, value), result);
|
|
648
|
-
},
|
|
649
|
-
napi_get_value_bigint_int64(env_id, value, result, lossless) {
|
|
650
|
-
let env = environments[env_id];
|
|
651
|
-
let val = env.get(value);
|
|
652
|
-
if (typeof val !== "bigint") {
|
|
653
|
-
return NAPI_BIGINT_EXPECTED;
|
|
654
|
-
}
|
|
655
|
-
env.i64[result >> 3] = val;
|
|
656
|
-
if (lossless) {
|
|
657
|
-
env.memory[lossless] = BigInt.asIntN(64, val) === val ? 1 : 0;
|
|
658
|
-
}
|
|
659
|
-
return NAPI_OK;
|
|
660
|
-
},
|
|
661
|
-
napi_create_bigint_uint64(env_id, value, result) {
|
|
662
|
-
let env = environments[env_id];
|
|
663
|
-
return env.createValue(BigInt.asUintN(64, value), result);
|
|
664
|
-
},
|
|
665
|
-
napi_get_value_bigint_uint64(env_id, value, result, lossless) {
|
|
666
|
-
let env = environments[env_id];
|
|
667
|
-
let val = env.get(value);
|
|
668
|
-
if (typeof val !== "bigint") {
|
|
669
|
-
return NAPI_BIGINT_EXPECTED;
|
|
670
|
-
}
|
|
671
|
-
env.u64[result >> 3] = val;
|
|
672
|
-
if (lossless) {
|
|
673
|
-
env.memory[lossless] = BigInt.asUintN(64, val) === val ? 1 : 0;
|
|
674
|
-
}
|
|
675
|
-
return NAPI_OK;
|
|
676
|
-
},
|
|
677
|
-
napi_create_bigint_words(env_id, sign_bit, word_count, words, result) {
|
|
678
|
-
let env = environments[env_id];
|
|
679
|
-
let buf = env.u64;
|
|
680
|
-
let ptr = words >> 3;
|
|
681
|
-
let res = 0n;
|
|
682
|
-
let shift = 0n;
|
|
683
|
-
|
|
684
|
-
for (let i = 0; i < word_count; i++) {
|
|
685
|
-
let word = buf[ptr++];
|
|
686
|
-
res += word << shift;
|
|
687
|
-
shift += 64n;
|
|
688
|
-
}
|
|
515
|
+
let ptr = properties >> 2;
|
|
516
|
+
for (let i = 0; i < property_count; i++) {
|
|
517
|
+
let descriptor = env.readPropertyDescriptor(ptr);
|
|
518
|
+
if (descriptor.static) {
|
|
519
|
+
Object.defineProperty(func, descriptor.name, descriptor);
|
|
520
|
+
} else {
|
|
521
|
+
Object.defineProperty(func.prototype, descriptor.name, descriptor);
|
|
522
|
+
}
|
|
523
|
+
ptr += 8;
|
|
524
|
+
}
|
|
689
525
|
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
526
|
+
return env.createValue(func, result);
|
|
527
|
+
},
|
|
528
|
+
napi_create_reference(env_id, value, refcount, result) {
|
|
529
|
+
let env = environments[env_id];
|
|
530
|
+
let id = env.referenceId++;
|
|
531
|
+
env.references.set(id, {
|
|
532
|
+
value: env.get(value),
|
|
533
|
+
refcount,
|
|
534
|
+
});
|
|
535
|
+
return env.setPointer(result, id);
|
|
536
|
+
},
|
|
537
|
+
napi_delete_reference(env_id, ref) {
|
|
538
|
+
let env = environments[env_id];
|
|
539
|
+
env.references.delete(ref);
|
|
540
|
+
return NAPI_OK;
|
|
541
|
+
},
|
|
542
|
+
napi_get_reference_value(env_id, ref, result) {
|
|
543
|
+
let env = environments[env_id];
|
|
544
|
+
let reference = env.references.get(ref);
|
|
545
|
+
return env.createValue(reference.value, result);
|
|
546
|
+
},
|
|
547
|
+
napi_reference_ref(env_id, ref, result) {
|
|
548
|
+
let env = environments[env_id];
|
|
549
|
+
let reference = env.references.get(ref);
|
|
550
|
+
reference.refcount++;
|
|
551
|
+
return env.setPointer(result, reference.refcount);
|
|
552
|
+
},
|
|
553
|
+
napi_reference_unref(env_id, ref, result) {
|
|
554
|
+
let env = environments[env_id];
|
|
555
|
+
let reference = env.references.get(ref);
|
|
556
|
+
if (reference.refcount === 0) {
|
|
557
|
+
return NAPI_GENERIC_FAILURE;
|
|
558
|
+
}
|
|
559
|
+
reference.refcount--;
|
|
560
|
+
return env.setPointer(result, reference.refcount);
|
|
561
|
+
},
|
|
562
|
+
napi_add_env_cleanup_hook() {
|
|
563
|
+
return NAPI_OK;
|
|
564
|
+
},
|
|
565
|
+
napi_remove_env_cleanup_hook() {
|
|
566
|
+
return NAPI_OK;
|
|
567
|
+
},
|
|
568
|
+
napi_add_async_cleanup_hook() {
|
|
569
|
+
return NAPI_OK;
|
|
570
|
+
},
|
|
571
|
+
napi_remove_async_cleanup_hook() {
|
|
572
|
+
return NAPI_OK;
|
|
573
|
+
},
|
|
574
|
+
napi_set_instance_data(env_id, data, _finalize_cb, _finalize_hint) {
|
|
575
|
+
let env = environments[env_id];
|
|
576
|
+
env.instanceData = data;
|
|
577
|
+
return NAPI_OK;
|
|
578
|
+
},
|
|
579
|
+
napi_get_instance_data(env_id, data) {
|
|
580
|
+
let env = environments[env_id];
|
|
581
|
+
return env.setPointer(data, env.instanceData);
|
|
582
|
+
},
|
|
583
|
+
napi_get_boolean(env_id, value, result) {
|
|
584
|
+
let env = environments[env_id];
|
|
585
|
+
return env.setPointer(result, value ? 3 : 4);
|
|
586
|
+
},
|
|
587
|
+
napi_get_value_bool(env_id, value, result) {
|
|
588
|
+
let env = environments[env_id];
|
|
589
|
+
let val = env.get(value);
|
|
590
|
+
if (typeof val !== 'boolean') {
|
|
591
|
+
return NAPI_BOOLEAN_EXPECTED;
|
|
592
|
+
}
|
|
593
|
+
env.memory[result] = val ? 1 : 0;
|
|
594
|
+
return NAPI_OK;
|
|
595
|
+
},
|
|
596
|
+
napi_create_int32(env_id, value, result) {
|
|
597
|
+
let env = environments[env_id];
|
|
598
|
+
return env.createValue(value, result);
|
|
599
|
+
},
|
|
600
|
+
napi_get_value_int32(env_id, value, result) {
|
|
601
|
+
let env = environments[env_id];
|
|
602
|
+
let val = env.get(value);
|
|
603
|
+
if (typeof val !== 'number') {
|
|
604
|
+
return NAPI_NUMBER_EXPECTED;
|
|
605
|
+
}
|
|
606
|
+
env.i32[result >> 2] = val;
|
|
607
|
+
return NAPI_OK;
|
|
608
|
+
},
|
|
609
|
+
napi_create_uint32(env_id, value, result) {
|
|
610
|
+
let env = environments[env_id];
|
|
611
|
+
return env.createValue(value, result);
|
|
612
|
+
},
|
|
613
|
+
napi_get_value_uint32(env_id, value, result) {
|
|
614
|
+
let env = environments[env_id];
|
|
615
|
+
let val = env.get(value);
|
|
616
|
+
if (typeof val !== 'number') {
|
|
617
|
+
return NAPI_NUMBER_EXPECTED;
|
|
618
|
+
}
|
|
619
|
+
return env.setPointer(result, val);
|
|
620
|
+
},
|
|
621
|
+
napi_create_int64(env_id, value, result) {
|
|
622
|
+
let env = environments[env_id];
|
|
623
|
+
return env.createValue(Number(value), result);
|
|
624
|
+
},
|
|
625
|
+
napi_get_value_int64(env_id, value, result) {
|
|
626
|
+
let env = environments[env_id];
|
|
627
|
+
let val = env.get(value);
|
|
628
|
+
if (typeof val !== 'number') {
|
|
629
|
+
return NAPI_NUMBER_EXPECTED;
|
|
630
|
+
}
|
|
631
|
+
env.i64[result >> 3] = val;
|
|
632
|
+
return NAPI_OK;
|
|
633
|
+
},
|
|
634
|
+
napi_create_double(env_id, value, result) {
|
|
635
|
+
let env = environments[env_id];
|
|
636
|
+
return env.createValue(value, result);
|
|
637
|
+
},
|
|
638
|
+
napi_get_value_double(env_id, value, result) {
|
|
639
|
+
let env = environments[env_id];
|
|
640
|
+
let val = env.get(value);
|
|
641
|
+
if (typeof val !== 'number') {
|
|
642
|
+
return NAPI_NUMBER_EXPECTED;
|
|
643
|
+
}
|
|
644
|
+
env.f64[result >> 3] = val;
|
|
645
|
+
return NAPI_OK;
|
|
646
|
+
},
|
|
647
|
+
napi_create_bigint_int64(env_id, value, result) {
|
|
648
|
+
let env = environments[env_id];
|
|
649
|
+
return env.createValue(BigInt.asIntN(64, value), result);
|
|
650
|
+
},
|
|
651
|
+
napi_get_value_bigint_int64(env_id, value, result, lossless) {
|
|
652
|
+
let env = environments[env_id];
|
|
653
|
+
let val = env.get(value);
|
|
654
|
+
if (typeof val !== 'bigint') {
|
|
655
|
+
return NAPI_BIGINT_EXPECTED;
|
|
656
|
+
}
|
|
657
|
+
env.i64[result >> 3] = val;
|
|
658
|
+
if (lossless) {
|
|
659
|
+
env.memory[lossless] = BigInt.asIntN(64, val) === val ? 1 : 0;
|
|
660
|
+
}
|
|
661
|
+
return NAPI_OK;
|
|
662
|
+
},
|
|
663
|
+
napi_create_bigint_uint64(env_id, value, result) {
|
|
664
|
+
let env = environments[env_id];
|
|
665
|
+
return env.createValue(BigInt.asUintN(64, value), result);
|
|
666
|
+
},
|
|
667
|
+
napi_get_value_bigint_uint64(env_id, value, result, lossless) {
|
|
668
|
+
let env = environments[env_id];
|
|
669
|
+
let val = env.get(value);
|
|
670
|
+
if (typeof val !== 'bigint') {
|
|
671
|
+
return NAPI_BIGINT_EXPECTED;
|
|
672
|
+
}
|
|
673
|
+
env.u64[result >> 3] = val;
|
|
674
|
+
if (lossless) {
|
|
675
|
+
env.memory[lossless] = BigInt.asUintN(64, val) === val ? 1 : 0;
|
|
676
|
+
}
|
|
677
|
+
return NAPI_OK;
|
|
678
|
+
},
|
|
679
|
+
napi_create_bigint_words(env_id, sign_bit, word_count, words, result) {
|
|
680
|
+
let env = environments[env_id];
|
|
681
|
+
let buf = env.u64;
|
|
682
|
+
let ptr = words >> 3;
|
|
683
|
+
let res = 0n;
|
|
684
|
+
let shift = 0n;
|
|
685
|
+
|
|
686
|
+
for (let i = 0; i < word_count; i++) {
|
|
687
|
+
let word = buf[ptr++];
|
|
688
|
+
res += word << shift;
|
|
689
|
+
shift += 64n;
|
|
690
|
+
}
|
|
699
691
|
|
|
700
|
-
|
|
692
|
+
res *= BigInt((-1) ** sign_bit);
|
|
693
|
+
return env.createValue(res, result);
|
|
694
|
+
},
|
|
695
|
+
napi_get_value_bigint_words(env_id, value, sign_bit, word_count, words) {
|
|
696
|
+
let env = environments[env_id];
|
|
697
|
+
let val = env.get(value);
|
|
698
|
+
if (typeof val !== 'bigint') {
|
|
699
|
+
return NAPI_BIGINT_EXPECTED;
|
|
700
|
+
}
|
|
701
701
|
|
|
702
|
-
|
|
703
|
-
env.i32[sign_bit] = val < 0n ? 1 : 0;
|
|
704
|
-
}
|
|
702
|
+
let count = env.u32[word_count >> 2];
|
|
705
703
|
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
let buf = env.u64;
|
|
710
|
-
let ptr = words >> 3;
|
|
711
|
-
if (val < 0n) {
|
|
712
|
-
val = -val;
|
|
713
|
-
}
|
|
714
|
-
|
|
715
|
-
for (; i < count && val !== 0n; i++) {
|
|
716
|
-
buf[ptr++] = val & mask;
|
|
717
|
-
val >>= 64n;
|
|
718
|
-
}
|
|
719
|
-
}
|
|
704
|
+
if (sign_bit) {
|
|
705
|
+
env.i32[sign_bit] = val < 0n ? 1 : 0;
|
|
706
|
+
}
|
|
720
707
|
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
708
|
+
let i = 0;
|
|
709
|
+
if (words) {
|
|
710
|
+
let mask = (1n << 64n) - 1n;
|
|
711
|
+
let buf = env.u64;
|
|
712
|
+
let ptr = words >> 3;
|
|
713
|
+
if (val < 0n) {
|
|
714
|
+
val = -val;
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
for (; i < count && val !== 0n; i++) {
|
|
718
|
+
buf[ptr++] = val & mask;
|
|
719
|
+
val >>= 64n;
|
|
720
|
+
}
|
|
721
|
+
}
|
|
725
722
|
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
return env.setPointer(result, 1);
|
|
731
|
-
},
|
|
732
|
-
napi_create_array(env_id, result) {
|
|
733
|
-
let env = environments[env_id];
|
|
734
|
-
return env.createValue([], result);
|
|
735
|
-
},
|
|
736
|
-
napi_create_array_with_length(env_id, length, result) {
|
|
737
|
-
let env = environments[env_id];
|
|
738
|
-
return env.createValue(new Array(length), result);
|
|
739
|
-
},
|
|
740
|
-
napi_set_element(env_id, object, index, value) {
|
|
741
|
-
let env = environments[env_id];
|
|
742
|
-
let obj = env.get(object);
|
|
743
|
-
let val = env.get(value);
|
|
744
|
-
obj[index] = val;
|
|
745
|
-
return NAPI_OK;
|
|
746
|
-
},
|
|
747
|
-
napi_get_element(env_id, object, index, result) {
|
|
748
|
-
let env = environments[env_id];
|
|
749
|
-
let obj = env.get(object);
|
|
750
|
-
let val = obj[index];
|
|
751
|
-
return env.createValue(val, result);
|
|
752
|
-
},
|
|
753
|
-
napi_has_element(env_id, object, index, result) {
|
|
754
|
-
let env = environments[env_id];
|
|
755
|
-
let obj = env.get(object);
|
|
756
|
-
env.memory[result] = obj.hasOwnProperty(index) ? 1 : 0;
|
|
757
|
-
return NAPI_OK;
|
|
758
|
-
},
|
|
759
|
-
napi_delete_element(env_id, object, index, result) {
|
|
760
|
-
let env = environments[env_id];
|
|
761
|
-
let obj = env.get(object);
|
|
762
|
-
let res = false;
|
|
763
|
-
try {
|
|
764
|
-
res = delete obj[index];
|
|
765
|
-
} catch (err) {}
|
|
766
|
-
if (result) {
|
|
767
|
-
env.memory[result] = res ? 1 : 0;
|
|
768
|
-
}
|
|
769
|
-
return NAPI_OK;
|
|
770
|
-
},
|
|
771
|
-
napi_get_array_length(env_id, value, result) {
|
|
772
|
-
let env = environments[env_id];
|
|
773
|
-
let val = env.get(value);
|
|
774
|
-
return env.setPointer(result, val.length);
|
|
775
|
-
},
|
|
776
|
-
napi_get_undefined(env_id, result) {
|
|
777
|
-
let env = environments[env_id];
|
|
778
|
-
return env.setPointer(result, 0);
|
|
779
|
-
},
|
|
780
|
-
napi_create_function(env_id, utf8name, length, cb, data, result) {
|
|
781
|
-
let env = environments[env_id];
|
|
782
|
-
let func = env.createFunction(cb, data);
|
|
783
|
-
|
|
784
|
-
Object.defineProperty(func, 'name', {
|
|
785
|
-
value: env.getString(utf8name, length),
|
|
786
|
-
configurable: true
|
|
787
|
-
});
|
|
788
|
-
|
|
789
|
-
return env.createValue(func, result);
|
|
790
|
-
},
|
|
791
|
-
napi_call_function(env_id, recv, func, argc, argv, result) {
|
|
792
|
-
let env = environments[env_id];
|
|
793
|
-
let thisArg = env.get(recv);
|
|
794
|
-
let fn = env.get(func);
|
|
795
|
-
let args = new Array(argc);
|
|
796
|
-
let mem = env.u32;
|
|
797
|
-
for (let i = 0; i < argc; i++) {
|
|
798
|
-
args[i] = env.get(mem[argv >> 2]);
|
|
799
|
-
argv += 4;
|
|
800
|
-
}
|
|
723
|
+
while (val > 0n) {
|
|
724
|
+
i++;
|
|
725
|
+
val >>= 64n;
|
|
726
|
+
}
|
|
801
727
|
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
728
|
+
return env.setPointer(word_count, i);
|
|
729
|
+
},
|
|
730
|
+
napi_get_null(env_id, result) {
|
|
731
|
+
let env = environments[env_id];
|
|
732
|
+
return env.setPointer(result, 1);
|
|
733
|
+
},
|
|
734
|
+
napi_create_array(env_id, result) {
|
|
735
|
+
let env = environments[env_id];
|
|
736
|
+
return env.createValue([], result);
|
|
737
|
+
},
|
|
738
|
+
napi_create_array_with_length(env_id, length, result) {
|
|
739
|
+
let env = environments[env_id];
|
|
740
|
+
return env.createValue(Array.from({ length }), result);
|
|
741
|
+
},
|
|
742
|
+
napi_set_element(env_id, object, index, value) {
|
|
743
|
+
let env = environments[env_id];
|
|
744
|
+
let obj = env.get(object);
|
|
745
|
+
let val = env.get(value);
|
|
746
|
+
obj[index] = val;
|
|
747
|
+
return NAPI_OK;
|
|
748
|
+
},
|
|
749
|
+
napi_get_element(env_id, object, index, result) {
|
|
750
|
+
let env = environments[env_id];
|
|
751
|
+
let obj = env.get(object);
|
|
752
|
+
let val = obj[index];
|
|
753
|
+
return env.createValue(val, result);
|
|
754
|
+
},
|
|
755
|
+
napi_has_element(env_id, object, index, result) {
|
|
756
|
+
let env = environments[env_id];
|
|
757
|
+
let obj = env.get(object);
|
|
758
|
+
env.memory[result] = obj.hasOwnProperty(index) ? 1 : 0;
|
|
759
|
+
return NAPI_OK;
|
|
760
|
+
},
|
|
761
|
+
napi_delete_element(env_id, object, index, result) {
|
|
762
|
+
let env = environments[env_id];
|
|
763
|
+
let obj = env.get(object);
|
|
764
|
+
let res = false;
|
|
765
|
+
try {
|
|
766
|
+
res = delete obj[index];
|
|
767
|
+
} catch (_err) {}
|
|
768
|
+
if (result) {
|
|
769
|
+
env.memory[result] = res ? 1 : 0;
|
|
770
|
+
}
|
|
771
|
+
return NAPI_OK;
|
|
772
|
+
},
|
|
773
|
+
napi_get_array_length(env_id, value, result) {
|
|
774
|
+
let env = environments[env_id];
|
|
775
|
+
let val = env.get(value);
|
|
776
|
+
return env.setPointer(result, val.length);
|
|
777
|
+
},
|
|
778
|
+
napi_get_undefined(env_id, result) {
|
|
779
|
+
let env = environments[env_id];
|
|
780
|
+
return env.setPointer(result, 0);
|
|
781
|
+
},
|
|
782
|
+
napi_create_function(env_id, utf8name, length, cb, data, result) {
|
|
783
|
+
let env = environments[env_id];
|
|
784
|
+
let func = env.createFunction(cb, data);
|
|
785
|
+
|
|
786
|
+
Object.defineProperty(func, 'name', {
|
|
787
|
+
value: env.getString(utf8name, length),
|
|
788
|
+
configurable: true,
|
|
789
|
+
});
|
|
819
790
|
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
for (let i = 0; i < info.args.length; i++) {
|
|
833
|
-
env.createValue(info.args[i], argv);
|
|
834
|
-
argv += 4;
|
|
835
|
-
}
|
|
836
|
-
env.createValue(info.thisArg, thisArg);
|
|
837
|
-
env.setPointer(data, info.data);
|
|
838
|
-
return NAPI_OK;
|
|
839
|
-
},
|
|
840
|
-
napi_get_new_target(env_id, cbinfo, result) {
|
|
841
|
-
let env = environments[env_id];
|
|
842
|
-
let info = env.get(cbinfo);
|
|
843
|
-
return env.createValue(info.newTarget, result);
|
|
844
|
-
},
|
|
845
|
-
napi_create_threadsafe_function(
|
|
846
|
-
env_id,
|
|
847
|
-
func,
|
|
848
|
-
async_resource,
|
|
849
|
-
async_resource_name,
|
|
850
|
-
max_queue_size,
|
|
851
|
-
initial_thread_count,
|
|
852
|
-
thread_finalize_data,
|
|
853
|
-
thread_finalize_cb,
|
|
854
|
-
context,
|
|
855
|
-
call_js_cb,
|
|
856
|
-
result
|
|
857
|
-
) {
|
|
858
|
-
let env = environments[env_id];
|
|
859
|
-
let fn = func ? env.get(func) : undefined;
|
|
860
|
-
let cb = call_js_cb ? env.table.get(call_js_cb) : undefined;
|
|
861
|
-
let f = new ThreadSafeFunction(env, fn, cb, context);
|
|
862
|
-
|
|
863
|
-
if (thread_finalize_cb) {
|
|
864
|
-
let cb = env.table.get(thread_finalize_cb);
|
|
865
|
-
finalizationRegistry.register(f, new FinalizeRecord(env_id, cb, 0, f.id));
|
|
866
|
-
}
|
|
791
|
+
return env.createValue(func, result);
|
|
792
|
+
},
|
|
793
|
+
napi_call_function(env_id, recv, func, argc, argv, result) {
|
|
794
|
+
let env = environments[env_id];
|
|
795
|
+
let thisArg = env.get(recv);
|
|
796
|
+
let fn = env.get(func);
|
|
797
|
+
let args = Array.from({ length: argc });
|
|
798
|
+
let mem = env.u32;
|
|
799
|
+
for (let i = 0; i < argc; i++) {
|
|
800
|
+
args[i] = env.get(mem[argv >> 2]);
|
|
801
|
+
argv += 4;
|
|
802
|
+
}
|
|
867
803
|
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
let f = threadsafeFunctions[func];
|
|
886
|
-
f.env.pushScope();
|
|
887
|
-
try {
|
|
888
|
-
if (f.nativeFn) {
|
|
889
|
-
let id = f.fn ? f.env.pushValue(f.fn) : 0;
|
|
890
|
-
f.nativeFn(f.env.id, id, f.context, data);
|
|
891
|
-
} else if (f.fn) {
|
|
892
|
-
f.fn();
|
|
893
|
-
}
|
|
894
|
-
} finally {
|
|
895
|
-
f.env.popScope();
|
|
896
|
-
}
|
|
897
|
-
},
|
|
898
|
-
napi_get_threadsafe_function_context(func, result) {
|
|
899
|
-
let f = threadsafeFunctions[func];
|
|
900
|
-
f.env.setPointer(result, f.context);
|
|
901
|
-
return NAPI_OK;
|
|
902
|
-
},
|
|
903
|
-
napi_create_async_work(env_id, async_resource, async_resource_name, execute, complete, data, result) {
|
|
904
|
-
let env = environments[env_id];
|
|
905
|
-
let executeFn = execute ? env.table.get(execute) : undefined;
|
|
906
|
-
let completeFn = complete ? env.table.get(complete) : undefined;
|
|
907
|
-
let w = new AsyncWork(env, executeFn, completeFn, data);
|
|
908
|
-
env.setPointer(result, w.id);
|
|
909
|
-
return NAPI_OK;
|
|
910
|
-
},
|
|
911
|
-
napi_delete_async_work(env, work) {
|
|
912
|
-
asyncWork[work] = undefined;
|
|
913
|
-
return NAPI_OK;
|
|
914
|
-
},
|
|
915
|
-
napi_queue_async_work(env, work) {
|
|
916
|
-
queueMicrotask(() => {
|
|
917
|
-
let w = asyncWork[work];
|
|
918
|
-
if (w) {
|
|
919
|
-
w.execute(env, w.data);
|
|
920
|
-
w.complete(env, NAPI_OK, w.data);
|
|
921
|
-
}
|
|
922
|
-
});
|
|
923
|
-
return NAPI_OK;
|
|
924
|
-
},
|
|
925
|
-
napi_cancel_async_work() {
|
|
926
|
-
let w = asyncWork[work];
|
|
927
|
-
w.complete(env, NAPI_CANCELED, w.data);
|
|
928
|
-
asyncWork[work] = undefined;
|
|
929
|
-
return NAPI_OK;
|
|
930
|
-
},
|
|
931
|
-
napi_throw(env_id, error) {
|
|
932
|
-
let env = environments[env_id];
|
|
933
|
-
env.pendingException = env.get(error);
|
|
934
|
-
return NAPI_OK;
|
|
935
|
-
},
|
|
936
|
-
napi_throw_error(env_id, code, msg) {
|
|
937
|
-
let env = environments[env_id];
|
|
938
|
-
let err = new Error(env.getString(msg));
|
|
939
|
-
err.code = code;
|
|
940
|
-
env.pendingException = err;
|
|
941
|
-
return NAPI_OK;
|
|
942
|
-
},
|
|
943
|
-
napi_throw_type_error(env_id, code, msg) {
|
|
944
|
-
let env = environments[env_id];
|
|
945
|
-
let err = new TypeError(env.getString(msg));
|
|
946
|
-
err.code = code;
|
|
947
|
-
env.pendingException = err;
|
|
948
|
-
return NAPI_OK;
|
|
949
|
-
},
|
|
950
|
-
napi_throw_range_error(env_id, code, msg) {
|
|
951
|
-
let env = environments[env_id];
|
|
952
|
-
let err = new RangeError(env.getString(msg));
|
|
953
|
-
err.code = code;
|
|
954
|
-
env.pendingException = err;
|
|
955
|
-
return NAPI_OK;
|
|
956
|
-
},
|
|
957
|
-
napi_create_error(env_id, code, msg, result) {
|
|
958
|
-
let env = environments[env_id];
|
|
959
|
-
let err = new Error(env.get(msg));
|
|
960
|
-
err.code = env.get(code);
|
|
961
|
-
return env.createValue(err, result);
|
|
962
|
-
},
|
|
963
|
-
napi_create_type_error(env_id, code, msg, result) {
|
|
964
|
-
let env = environments[env_id];
|
|
965
|
-
let err = new TypeError(env.get(msg));
|
|
966
|
-
err.code = env.get(code);
|
|
967
|
-
return env.createValue(err, result);
|
|
968
|
-
},
|
|
969
|
-
napi_create_range_error(env_id, code, msg, result) {
|
|
970
|
-
let env = environments[env_id];
|
|
971
|
-
let err = new RangeError(env.get(msg));
|
|
972
|
-
err.code = env.get(code);
|
|
973
|
-
return env.createValue(err, result);
|
|
974
|
-
},
|
|
975
|
-
napi_get_and_clear_last_exception(env_id, result) {
|
|
976
|
-
let env = environments[env_id];
|
|
977
|
-
let e = env.pendingException;
|
|
978
|
-
env.pendingException = null;
|
|
979
|
-
return env.createValue(e, result);
|
|
980
|
-
},
|
|
981
|
-
napi_is_exception_pending(env_id, result) {
|
|
982
|
-
let env = environments[env_id];
|
|
983
|
-
env.memory[result] = env.pendingException ? 1 : 0;
|
|
984
|
-
return NAPI_OK;
|
|
985
|
-
},
|
|
986
|
-
napi_fatal_exception(env_id, err) {
|
|
987
|
-
throw new Error('not implemented');
|
|
988
|
-
},
|
|
989
|
-
napi_fatal_error(location, location_len, message, message_len) {
|
|
990
|
-
throw new Error('not implemented');
|
|
991
|
-
},
|
|
992
|
-
napi_get_global(env_id, result) {
|
|
993
|
-
let env = environments[env_id];
|
|
994
|
-
return env.setPointer(result, 2);
|
|
995
|
-
},
|
|
996
|
-
napi_create_buffer(env_id, length, data, result) {
|
|
997
|
-
let env = environments[env_id];
|
|
998
|
-
let ptr = env.instance.exports.napi_wasm_malloc(length);
|
|
999
|
-
if (data) {
|
|
1000
|
-
env.setPointer(data, ptr);
|
|
1001
|
-
}
|
|
804
|
+
try {
|
|
805
|
+
let res = fn.apply(thisArg, args);
|
|
806
|
+
return env.createValue(res, result);
|
|
807
|
+
} catch (err) {
|
|
808
|
+
env.pendingException = err;
|
|
809
|
+
return NAPI_PENDING_EXCEPTION;
|
|
810
|
+
}
|
|
811
|
+
},
|
|
812
|
+
napi_new_instance(env_id, cons, argc, argv, result) {
|
|
813
|
+
let env = environments[env_id];
|
|
814
|
+
let Class = env.get(cons);
|
|
815
|
+
let args = Array.from({ length: argc });
|
|
816
|
+
let mem = env.u32;
|
|
817
|
+
for (let i = 0; i < argc; i++) {
|
|
818
|
+
args[i] = env.get(mem[argv >> 2]);
|
|
819
|
+
argv += 4;
|
|
820
|
+
}
|
|
1002
821
|
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
822
|
+
try {
|
|
823
|
+
let value = new Class(...args);
|
|
824
|
+
return env.createValue(value, result);
|
|
825
|
+
} catch (err) {
|
|
826
|
+
env.pendingException = err;
|
|
827
|
+
return NAPI_PENDING_EXCEPTION;
|
|
828
|
+
}
|
|
829
|
+
},
|
|
830
|
+
napi_get_cb_info(env_id, cbinfo, argc, argv, thisArg, data) {
|
|
831
|
+
let env = environments[env_id];
|
|
832
|
+
let info = env.get(cbinfo);
|
|
833
|
+
env.setPointer(argc, info.args.length);
|
|
834
|
+
for (let i = 0; i < info.args.length; i++) {
|
|
835
|
+
env.createValue(info.args[i], argv);
|
|
836
|
+
argv += 4;
|
|
837
|
+
}
|
|
838
|
+
env.createValue(info.thisArg, thisArg);
|
|
839
|
+
env.setPointer(data, info.data);
|
|
840
|
+
return NAPI_OK;
|
|
841
|
+
},
|
|
842
|
+
napi_get_new_target(env_id, cbinfo, result) {
|
|
843
|
+
let env = environments[env_id];
|
|
844
|
+
let info = env.get(cbinfo);
|
|
845
|
+
return env.createValue(info.newTarget, result);
|
|
846
|
+
},
|
|
847
|
+
napi_create_threadsafe_function(
|
|
848
|
+
env_id,
|
|
849
|
+
func,
|
|
850
|
+
async_resource,
|
|
851
|
+
async_resource_name,
|
|
852
|
+
max_queue_size,
|
|
853
|
+
initial_thread_count,
|
|
854
|
+
thread_finalize_data,
|
|
855
|
+
thread_finalize_cb,
|
|
856
|
+
context,
|
|
857
|
+
call_js_cb,
|
|
858
|
+
result,
|
|
859
|
+
) {
|
|
860
|
+
let env = environments[env_id];
|
|
861
|
+
let fn = func ? env.get(func) : undefined;
|
|
862
|
+
let cb = call_js_cb ? env.table.get(call_js_cb) : undefined;
|
|
863
|
+
let f = new ThreadSafeFunction(env, fn, cb, context);
|
|
864
|
+
|
|
865
|
+
if (thread_finalize_cb) {
|
|
866
|
+
let cb = env.table.get(thread_finalize_cb);
|
|
867
|
+
finalizationRegistry.register(f, new FinalizeRecord(env_id, cb, 0, f.id));
|
|
868
|
+
}
|
|
1024
869
|
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
870
|
+
env.setPointer(result, f.id);
|
|
871
|
+
return NAPI_OK;
|
|
872
|
+
},
|
|
873
|
+
napi_ref_threadsafe_function() {
|
|
874
|
+
return NAPI_OK;
|
|
875
|
+
},
|
|
876
|
+
napi_unref_threadsafe_function() {
|
|
877
|
+
return NAPI_OK;
|
|
878
|
+
},
|
|
879
|
+
napi_acquire_threadsafe_function() {
|
|
880
|
+
return NAPI_OK;
|
|
881
|
+
},
|
|
882
|
+
napi_release_threadsafe_function(func, _mode) {
|
|
883
|
+
threadsafeFunctions[func] = undefined;
|
|
884
|
+
return NAPI_OK;
|
|
885
|
+
},
|
|
886
|
+
napi_call_threadsafe_function(func, data, _is_blocking) {
|
|
887
|
+
let f = threadsafeFunctions[func];
|
|
888
|
+
f.env.pushScope();
|
|
889
|
+
try {
|
|
890
|
+
if (f.nativeFn) {
|
|
891
|
+
let id = f.fn ? f.env.pushValue(f.fn) : 0;
|
|
892
|
+
f.nativeFn(f.env.id, id, f.context, data);
|
|
893
|
+
} else if (f.fn) {
|
|
894
|
+
f.fn();
|
|
895
|
+
}
|
|
896
|
+
} finally {
|
|
897
|
+
f.env.popScope();
|
|
898
|
+
}
|
|
899
|
+
},
|
|
900
|
+
napi_get_threadsafe_function_context(func, result) {
|
|
901
|
+
let f = threadsafeFunctions[func];
|
|
902
|
+
f.env.setPointer(result, f.context);
|
|
903
|
+
return NAPI_OK;
|
|
904
|
+
},
|
|
905
|
+
napi_create_async_work(env_id, async_resource, async_resource_name, execute, complete, data, result) {
|
|
906
|
+
let env = environments[env_id];
|
|
907
|
+
let executeFn = execute ? env.table.get(execute) : undefined;
|
|
908
|
+
let completeFn = complete ? env.table.get(complete) : undefined;
|
|
909
|
+
let w = new AsyncWork(env, executeFn, completeFn, data);
|
|
910
|
+
env.setPointer(result, w.id);
|
|
911
|
+
return NAPI_OK;
|
|
912
|
+
},
|
|
913
|
+
napi_delete_async_work(env, work) {
|
|
914
|
+
asyncWork[work] = undefined;
|
|
915
|
+
return NAPI_OK;
|
|
916
|
+
},
|
|
917
|
+
napi_queue_async_work(env, work) {
|
|
918
|
+
queueMicrotask(() => {
|
|
919
|
+
let w = asyncWork[work];
|
|
920
|
+
if (w) {
|
|
921
|
+
w.execute(env, w.data);
|
|
922
|
+
w.complete(env, NAPI_OK, w.data);
|
|
923
|
+
}
|
|
924
|
+
});
|
|
925
|
+
return NAPI_OK;
|
|
926
|
+
},
|
|
927
|
+
napi_cancel_async_work() {
|
|
928
|
+
let w = asyncWork[work];
|
|
929
|
+
w.complete(env, NAPI_CANCELED, w.data);
|
|
930
|
+
asyncWork[work] = undefined;
|
|
931
|
+
return NAPI_OK;
|
|
932
|
+
},
|
|
933
|
+
napi_throw(env_id, error) {
|
|
934
|
+
let env = environments[env_id];
|
|
935
|
+
env.pendingException = env.get(error);
|
|
936
|
+
return NAPI_OK;
|
|
937
|
+
},
|
|
938
|
+
napi_throw_error(env_id, code, msg) {
|
|
939
|
+
let env = environments[env_id];
|
|
940
|
+
let err = new Error(env.getString(msg));
|
|
941
|
+
err.code = code;
|
|
942
|
+
env.pendingException = err;
|
|
943
|
+
return NAPI_OK;
|
|
944
|
+
},
|
|
945
|
+
napi_throw_type_error(env_id, code, msg) {
|
|
946
|
+
let env = environments[env_id];
|
|
947
|
+
let err = new TypeError(env.getString(msg));
|
|
948
|
+
err.code = code;
|
|
949
|
+
env.pendingException = err;
|
|
950
|
+
return NAPI_OK;
|
|
951
|
+
},
|
|
952
|
+
napi_throw_range_error(env_id, code, msg) {
|
|
953
|
+
let env = environments[env_id];
|
|
954
|
+
let err = new RangeError(env.getString(msg));
|
|
955
|
+
err.code = code;
|
|
956
|
+
env.pendingException = err;
|
|
957
|
+
return NAPI_OK;
|
|
958
|
+
},
|
|
959
|
+
napi_create_error(env_id, code, msg, result) {
|
|
960
|
+
let env = environments[env_id];
|
|
961
|
+
let err = new Error(env.get(msg));
|
|
962
|
+
err.code = env.get(code);
|
|
963
|
+
return env.createValue(err, result);
|
|
964
|
+
},
|
|
965
|
+
napi_create_type_error(env_id, code, msg, result) {
|
|
966
|
+
let env = environments[env_id];
|
|
967
|
+
let err = new TypeError(env.get(msg));
|
|
968
|
+
err.code = env.get(code);
|
|
969
|
+
return env.createValue(err, result);
|
|
970
|
+
},
|
|
971
|
+
napi_create_range_error(env_id, code, msg, result) {
|
|
972
|
+
let env = environments[env_id];
|
|
973
|
+
let err = new RangeError(env.get(msg));
|
|
974
|
+
err.code = env.get(code);
|
|
975
|
+
return env.createValue(err, result);
|
|
976
|
+
},
|
|
977
|
+
napi_get_and_clear_last_exception(env_id, result) {
|
|
978
|
+
let env = environments[env_id];
|
|
979
|
+
let e = env.pendingException;
|
|
980
|
+
env.pendingException = null;
|
|
981
|
+
return env.createValue(e, result);
|
|
982
|
+
},
|
|
983
|
+
napi_is_exception_pending(env_id, result) {
|
|
984
|
+
let env = environments[env_id];
|
|
985
|
+
env.memory[result] = env.pendingException ? 1 : 0;
|
|
986
|
+
return NAPI_OK;
|
|
987
|
+
},
|
|
988
|
+
napi_fatal_exception(_env_id, _err) {
|
|
989
|
+
throw new Error('not implemented');
|
|
990
|
+
},
|
|
991
|
+
napi_fatal_error(_location, _location_len, _message, _message_len) {
|
|
992
|
+
throw new Error('not implemented');
|
|
993
|
+
},
|
|
994
|
+
napi_get_global(env_id, result) {
|
|
995
|
+
let env = environments[env_id];
|
|
996
|
+
return env.setPointer(result, 2);
|
|
997
|
+
},
|
|
998
|
+
napi_create_buffer(env_id, length, data, result) {
|
|
999
|
+
let env = environments[env_id];
|
|
1000
|
+
let ptr = env.instance.exports.napi_wasm_malloc(length);
|
|
1001
|
+
if (data) {
|
|
1002
|
+
env.setPointer(data, ptr);
|
|
1003
|
+
}
|
|
1048
1004
|
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
}
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
napi_get_arraybuffer_info(env_id, value, data, length) {
|
|
1072
|
-
let env = environments[env_id];
|
|
1073
|
-
let len = env.getBufferInfo(env.get(value), data);
|
|
1074
|
-
return env.setPointer(length, len);
|
|
1075
|
-
},
|
|
1076
|
-
napi_detach_arraybuffer(env_id, arraybuffer) {
|
|
1077
|
-
let env = environments[env_id];
|
|
1078
|
-
let buffer = env.get(arraybuffer);
|
|
1079
|
-
if (typeof structuredClone === 'function') {
|
|
1080
|
-
structuredClone(buffer, {transfer: [buffer]});
|
|
1081
|
-
}
|
|
1082
|
-
return NAPI_OK;
|
|
1083
|
-
},
|
|
1084
|
-
napi_is_detached_arraybuffer(env_id, arraybuffer, result) {
|
|
1085
|
-
let env = environments[env_id];
|
|
1086
|
-
let buffer = env.get(arraybuffer);
|
|
1087
|
-
env.memory[result] = buffer.byteLength === 0 ? 1 : 0; // ??
|
|
1088
|
-
return NAPI_OK;
|
|
1089
|
-
},
|
|
1090
|
-
napi_create_typedarray(env_id, type, length, arraybuffer, offset, result) {
|
|
1091
|
-
let env = environments[env_id];
|
|
1092
|
-
let Class = typedArrays[type];
|
|
1093
|
-
let buffer = env.get(arraybuffer);
|
|
1094
|
-
let buf = new Class(buffer, offset, length);
|
|
1095
|
-
return env.createValue(buf, result);
|
|
1096
|
-
},
|
|
1097
|
-
napi_create_dataview(env_id, byte_length, arraybuffer, byte_offset, result) {
|
|
1098
|
-
let env = environments[env_id];
|
|
1099
|
-
let buffer = env.get(arraybuffer);
|
|
1100
|
-
let view = new DataView(buffer, byte_offset, byte_length);
|
|
1101
|
-
return env.createValue(view, result);
|
|
1102
|
-
},
|
|
1103
|
-
napi_get_typedarray_info(env_id, typedarray, type, length, data, arraybuffer, byte_offset) {
|
|
1104
|
-
let env = environments[env_id];
|
|
1105
|
-
let val = env.get(typedarray);
|
|
1106
|
-
env.setPointer(type, typedArrays.findIndex(constructor => val instanceof constructor));
|
|
1107
|
-
env.setPointer(length, val.length);
|
|
1108
|
-
env.getBufferInfo(val, data);
|
|
1109
|
-
env.createValue(val.buffer, arraybuffer);
|
|
1110
|
-
return env.setPointer(byte_offset, val.byteOffset);
|
|
1111
|
-
},
|
|
1112
|
-
napi_get_dataview_info(env_id, dataview, byte_length, data, arraybuffer, byte_offset) {
|
|
1113
|
-
let env = environments[env_id];
|
|
1114
|
-
let val = env.get(dataview);
|
|
1115
|
-
env.setPointer(byte_length, val.byteLength);
|
|
1116
|
-
env.getBufferInfo(val, data);
|
|
1117
|
-
env.createValue(val.buffer, arraybuffer);
|
|
1118
|
-
return env.setPointer(byte_offset, val.byteOffset);
|
|
1119
|
-
},
|
|
1120
|
-
napi_create_string_utf8(env_id, str, length, result) {
|
|
1121
|
-
let env = environments[env_id];
|
|
1122
|
-
let s = decoder.decode(env.memory.subarray(str, str + length));
|
|
1123
|
-
return env.createValue(s, result);
|
|
1124
|
-
},
|
|
1125
|
-
napi_get_value_string_utf8(env_id, value, buf, bufsize, result) {
|
|
1126
|
-
let env = environments[env_id];
|
|
1127
|
-
let val = env.get(value);
|
|
1128
|
-
if (typeof val !== "string") {
|
|
1129
|
-
return NAPI_STRING_EXPECTED;
|
|
1130
|
-
}
|
|
1131
|
-
if (buf == 0) {
|
|
1132
|
-
return env.setPointer(result, utf8Length(val));
|
|
1133
|
-
}
|
|
1134
|
-
let res = encoder.encodeInto(val, env.memory.subarray(buf, buf + bufsize - 1));
|
|
1135
|
-
env.memory[buf + res.written] = 0; // null terminate
|
|
1136
|
-
return env.setPointer(result, res.written);
|
|
1137
|
-
},
|
|
1138
|
-
napi_create_string_latin1(env_id, str, length, result) {
|
|
1139
|
-
let env = environments[env_id];
|
|
1140
|
-
let s = latin1Decoder.decode(env.memory.subarray(str, str + length));
|
|
1141
|
-
return env.createValue(s, result);
|
|
1142
|
-
},
|
|
1143
|
-
napi_get_value_string_latin1(env_id, value, buf, bufsize, result) {
|
|
1144
|
-
let env = environments[env_id];
|
|
1145
|
-
let val = env.get(value);
|
|
1146
|
-
if (typeof val !== "string") {
|
|
1147
|
-
return NAPI_STRING_EXPECTED;
|
|
1148
|
-
}
|
|
1149
|
-
if (buf == 0) {
|
|
1150
|
-
return env.setPointer(result, val.length);
|
|
1151
|
-
}
|
|
1152
|
-
let mem = env.memory;
|
|
1153
|
-
let len = Math.min(val.length, bufsize - 1);
|
|
1154
|
-
for (let i = 0; i < len; i++) {
|
|
1155
|
-
let code = val.charCodeAt(i);
|
|
1156
|
-
mem[buf++] = code;
|
|
1157
|
-
}
|
|
1158
|
-
mem[buf] = 0; // null terminate
|
|
1159
|
-
return env.setPointer(result, len);
|
|
1160
|
-
},
|
|
1161
|
-
napi_create_string_utf16(env_id, str, length, result) {
|
|
1162
|
-
let env = environments[env_id];
|
|
1163
|
-
let s = utf16Decoder.decode(env.memory.subarray(str, str + length * 2));
|
|
1164
|
-
return env.createValue(s, result);
|
|
1165
|
-
},
|
|
1166
|
-
napi_get_value_string_utf16(env_id, value, buf, bufsize, result) {
|
|
1167
|
-
let env = environments[env_id];
|
|
1168
|
-
let val = env.get(value);
|
|
1169
|
-
if (typeof val !== "string") {
|
|
1170
|
-
return NAPI_STRING_EXPECTED;
|
|
1171
|
-
}
|
|
1172
|
-
if (buf == 0) {
|
|
1173
|
-
return env.setPointer(result, val.length);
|
|
1174
|
-
}
|
|
1175
|
-
let mem = env.u16;
|
|
1176
|
-
let ptr = buf >> 1;
|
|
1177
|
-
let len = Math.min(val.length, bufsize - 1);
|
|
1178
|
-
for (let i = 0; i < len; i++) {
|
|
1179
|
-
let code = val.charCodeAt(i);
|
|
1180
|
-
mem[ptr++] = code;
|
|
1181
|
-
}
|
|
1182
|
-
mem[ptr] = 0; // null terminate
|
|
1183
|
-
return env.setPointer(result, len);
|
|
1184
|
-
},
|
|
1185
|
-
napi_create_date(env_id, time, result) {
|
|
1186
|
-
let env = environments[env_id];
|
|
1187
|
-
return env.createValue(new Date(time), result);
|
|
1188
|
-
},
|
|
1189
|
-
napi_get_date_value(env_id, value, result) {
|
|
1190
|
-
let env = environments[env_id];
|
|
1191
|
-
let date = env.get(value);
|
|
1192
|
-
env.f64[result >> 3] = date.valueOf();
|
|
1193
|
-
},
|
|
1194
|
-
napi_create_symbol(env_id, description, result) {
|
|
1195
|
-
let env = environments[env_id];
|
|
1196
|
-
let desc = env.get(description);
|
|
1197
|
-
return env.createValue(Symbol(desc), result);
|
|
1198
|
-
},
|
|
1199
|
-
napi_coerce_to_bool(env_id, value, result) {
|
|
1200
|
-
let env = environments[env_id];
|
|
1201
|
-
return env.createValue(Boolean(env.get(value)), result);
|
|
1202
|
-
},
|
|
1203
|
-
napi_coerce_to_number(env_id, value, result) {
|
|
1204
|
-
let env = environments[env_id];
|
|
1205
|
-
return env.createValue(Number(env.get(value)), result);
|
|
1206
|
-
},
|
|
1207
|
-
napi_coerce_to_object(env_id, value, result) {
|
|
1208
|
-
let env = environments[env_id];
|
|
1209
|
-
return env.createValue(Object(env.get(value)), result);
|
|
1210
|
-
},
|
|
1211
|
-
napi_coerce_to_string(env_id, value, result) {
|
|
1212
|
-
let env = environments[env_id];
|
|
1213
|
-
return env.createValue(String(env.get(value)), result);
|
|
1214
|
-
},
|
|
1215
|
-
napi_typeof(env_id, value, result) {
|
|
1216
|
-
let env = environments[env_id];
|
|
1217
|
-
let val = env.get(value);
|
|
1218
|
-
return env.setPointer(result, (() => {
|
|
1219
|
-
switch (typeof val) {
|
|
1220
|
-
case 'undefined':
|
|
1221
|
-
return 0;
|
|
1222
|
-
case 'boolean':
|
|
1223
|
-
return 2;
|
|
1224
|
-
case 'number':
|
|
1225
|
-
return 3;
|
|
1226
|
-
case 'string':
|
|
1227
|
-
return 4;
|
|
1228
|
-
case 'symbol':
|
|
1229
|
-
return 5;
|
|
1230
|
-
case 'object':
|
|
1231
|
-
if (val === null) {
|
|
1232
|
-
return 1;
|
|
1233
|
-
} else if (val instanceof ExternalValue) {
|
|
1234
|
-
return 8;
|
|
1235
|
-
}
|
|
1236
|
-
return 6;
|
|
1237
|
-
case 'function':
|
|
1238
|
-
return 7;
|
|
1239
|
-
case 'bigint':
|
|
1240
|
-
return 9;
|
|
1241
|
-
}
|
|
1242
|
-
})());
|
|
1243
|
-
},
|
|
1244
|
-
napi_instanceof(env_id, object, constructor, result) {
|
|
1245
|
-
let env = environments[env_id];
|
|
1246
|
-
let obj = env.get(object);
|
|
1247
|
-
let cons = env.get(constructor);
|
|
1248
|
-
env.memory[result] = obj instanceof cons ? 1 : 0;
|
|
1249
|
-
return NAPI_OK;
|
|
1250
|
-
},
|
|
1251
|
-
napi_is_array(env_id, value, result) {
|
|
1252
|
-
let env = environments[env_id];
|
|
1253
|
-
let val = env.get(value);
|
|
1254
|
-
env.memory[result] = Array.isArray(val) ? 1 : 0;
|
|
1255
|
-
return NAPI_OK;
|
|
1256
|
-
},
|
|
1257
|
-
napi_is_buffer(env_id, value, result) {
|
|
1258
|
-
let env = environments[env_id];
|
|
1259
|
-
let val = env.get(value);
|
|
1260
|
-
env.memory[result] = (typeof globalThis.Buffer !== 'undefined' ? globalThis.Buffer.isBuffer(val) : val instanceof Uint8Array) ? 1 : 0;
|
|
1261
|
-
return NAPI_OK;
|
|
1262
|
-
},
|
|
1263
|
-
napi_is_date(env_id, value, result) {
|
|
1264
|
-
let env = environments[env_id];
|
|
1265
|
-
let val = env.get(value);
|
|
1266
|
-
env.memory[result] = val instanceof Date ? 1 : 0;
|
|
1267
|
-
return NAPI_OK;
|
|
1268
|
-
},
|
|
1269
|
-
napi_is_error(env_id, value, result) {
|
|
1270
|
-
let env = environments[env_id];
|
|
1271
|
-
let err = env.get(value);
|
|
1272
|
-
env.memory[result] = err instanceof Error ? 1 : 0;
|
|
1273
|
-
return NAPI_OK;
|
|
1274
|
-
},
|
|
1275
|
-
napi_is_typedarray(env_id, value, result) {
|
|
1276
|
-
let env = environments[env_id];
|
|
1277
|
-
let buf = env.get(value);
|
|
1278
|
-
env.memory[result] = ArrayBuffer.isView(buf) && !(buf instanceof DataView) ? 1 : 0;
|
|
1279
|
-
return NAPI_OK;
|
|
1280
|
-
},
|
|
1281
|
-
napi_is_dataview(env_id, value, result) {
|
|
1282
|
-
let env = environments[env_id];
|
|
1283
|
-
let val = env.get(value);
|
|
1284
|
-
env.memory[result] = val instanceof DataView ? 1 : 0;
|
|
1285
|
-
return NAPI_OK;
|
|
1286
|
-
},
|
|
1287
|
-
napi_strict_equals(env_id, lhs, rhs, result) {
|
|
1288
|
-
let env = environments[env_id];
|
|
1289
|
-
env.memory[result] = env.get(lhs) === env.get(rhs) ? 1 : 0;
|
|
1290
|
-
return NAPI_OK;
|
|
1291
|
-
},
|
|
1292
|
-
napi_wrap(env_id, js_object, native_object, finalize_cb, finalize_hint, result) {
|
|
1293
|
-
let env = environments[env_id];
|
|
1294
|
-
let obj = env.get(js_object);
|
|
1295
|
-
env.wrappedObjects.set(obj, native_object);
|
|
1296
|
-
if (finalize_cb) {
|
|
1297
|
-
let cb = env.table.get(finalize_cb);
|
|
1298
|
-
finalizationRegistry.register(obj, new FinalizeRecord(env_id, cb, finalize_hint, native_object));
|
|
1299
|
-
}
|
|
1005
|
+
// Return a view into WASM memory.
|
|
1006
|
+
let buf =
|
|
1007
|
+
typeof globalThis.Buffer !== 'undefined'
|
|
1008
|
+
? globalThis.Buffer.from(env.memory.buffer, ptr, length)
|
|
1009
|
+
: env.memory.subarray(ptr, ptr + length);
|
|
1010
|
+
|
|
1011
|
+
let finalize = (_env, data) => {
|
|
1012
|
+
if (env.instance.exports.napi_wasm_free) {
|
|
1013
|
+
env.instance.exports.napi_wasm_free(data);
|
|
1014
|
+
}
|
|
1015
|
+
};
|
|
1016
|
+
|
|
1017
|
+
finalizationRegistry.register(buf, new FinalizeRecord(env_id, finalize, 0, ptr));
|
|
1018
|
+
return env.createValue(buf, result);
|
|
1019
|
+
},
|
|
1020
|
+
napi_create_buffer_copy(env_id, length, data, result_data, result) {
|
|
1021
|
+
let env = environments[env_id];
|
|
1022
|
+
let ptr = env.instance.exports.napi_wasm_malloc(length);
|
|
1023
|
+
env.memory.set(env.memory.subarray(data, data + length), ptr);
|
|
1024
|
+
if (result_data) {
|
|
1025
|
+
env.setPointer(result_data, ptr);
|
|
1026
|
+
}
|
|
1300
1027
|
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1028
|
+
// Return a view into WASM memory.
|
|
1029
|
+
let res =
|
|
1030
|
+
typeof globalThis.Buffer !== 'undefined'
|
|
1031
|
+
? globalThis.Buffer.from(env.memory.buffer, ptr, length)
|
|
1032
|
+
: env.memory.subarray(ptr, ptr + length);
|
|
1033
|
+
|
|
1034
|
+
let finalize = (_env, data) => {
|
|
1035
|
+
if (env.instance.exports.napi_wasm_free) {
|
|
1036
|
+
env.instance.exports.napi_wasm_free(data);
|
|
1037
|
+
}
|
|
1038
|
+
};
|
|
1039
|
+
|
|
1040
|
+
finalizationRegistry.register(buf, new FinalizeRecord(env_id, finalize, 0, ptr));
|
|
1041
|
+
return env.createValue(res, result);
|
|
1042
|
+
},
|
|
1043
|
+
napi_create_external_buffer(env_id, length, data, finalize_cb, finalize_hint, result) {
|
|
1044
|
+
let env = environments[env_id];
|
|
1045
|
+
let buf =
|
|
1046
|
+
typeof globalThis.Buffer !== 'undefined'
|
|
1047
|
+
? globalThis.Buffer.from(env.memory.buffer, data, length)
|
|
1048
|
+
: env.memory.subarray(data, data + length);
|
|
1049
|
+
if (finalize_cb) {
|
|
1050
|
+
let cb = env.table.get(finalize_cb);
|
|
1051
|
+
finalizationRegistry.register(buf, new FinalizeRecord(env_id, cb, finalize_hint, data));
|
|
1052
|
+
}
|
|
1304
1053
|
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1054
|
+
return env.createValue(buf, result);
|
|
1055
|
+
},
|
|
1056
|
+
napi_get_buffer_info(env_id, value, data, length) {
|
|
1057
|
+
let env = environments[env_id];
|
|
1058
|
+
let buf = env.get(value);
|
|
1059
|
+
let len = env.getBufferInfo(buf, data);
|
|
1060
|
+
return env.setPointer(length, len);
|
|
1061
|
+
},
|
|
1062
|
+
napi_create_arraybuffer(env_id, length, data, result) {
|
|
1063
|
+
let env = environments[env_id];
|
|
1064
|
+
let buf = new ArrayBuffer(length);
|
|
1065
|
+
if (data) {
|
|
1066
|
+
// This copies the ArrayBuffer into the WASM memory.
|
|
1067
|
+
env.getBufferInfo(buf, data);
|
|
1068
|
+
}
|
|
1069
|
+
return env.createValue(buf, result);
|
|
1070
|
+
},
|
|
1071
|
+
napi_create_external_arraybuffer(_env_id, _data, _length, _finalize_cb, _finalize_hint, _result) {
|
|
1072
|
+
// There is no way to actually create an external ArrayBuffer without copying.
|
|
1073
|
+
// You can only create typed arrays as subarrays, not ArrayBuffer.
|
|
1074
|
+
return NAPI_NO_EXTERNAL_BUFFERS_ALLOWED;
|
|
1075
|
+
},
|
|
1076
|
+
napi_get_arraybuffer_info(env_id, value, data, length) {
|
|
1077
|
+
let env = environments[env_id];
|
|
1078
|
+
let len = env.getBufferInfo(env.get(value), data);
|
|
1079
|
+
return env.setPointer(length, len);
|
|
1080
|
+
},
|
|
1081
|
+
napi_detach_arraybuffer(env_id, arraybuffer) {
|
|
1082
|
+
let env = environments[env_id];
|
|
1083
|
+
let buffer = env.get(arraybuffer);
|
|
1084
|
+
if (typeof structuredClone === 'function') {
|
|
1085
|
+
structuredClone(buffer, { transfer: [buffer] });
|
|
1086
|
+
}
|
|
1087
|
+
return NAPI_OK;
|
|
1088
|
+
},
|
|
1089
|
+
napi_is_detached_arraybuffer(env_id, arraybuffer, result) {
|
|
1090
|
+
let env = environments[env_id];
|
|
1091
|
+
let buffer = env.get(arraybuffer);
|
|
1092
|
+
env.memory[result] = buffer.byteLength === 0 ? 1 : 0; // ??
|
|
1093
|
+
return NAPI_OK;
|
|
1094
|
+
},
|
|
1095
|
+
napi_create_typedarray(env_id, type, length, arraybuffer, offset, result) {
|
|
1096
|
+
let env = environments[env_id];
|
|
1097
|
+
let Class = typedArrays[type];
|
|
1098
|
+
let buffer = env.get(arraybuffer);
|
|
1099
|
+
let buf = new Class(buffer, offset, length);
|
|
1100
|
+
return env.createValue(buf, result);
|
|
1101
|
+
},
|
|
1102
|
+
napi_create_dataview(env_id, byte_length, arraybuffer, byte_offset, result) {
|
|
1103
|
+
let env = environments[env_id];
|
|
1104
|
+
let buffer = env.get(arraybuffer);
|
|
1105
|
+
let view = new DataView(buffer, byte_offset, byte_length);
|
|
1106
|
+
return env.createValue(view, result);
|
|
1107
|
+
},
|
|
1108
|
+
napi_get_typedarray_info(env_id, typedarray, type, length, data, arraybuffer, byte_offset) {
|
|
1109
|
+
let env = environments[env_id];
|
|
1110
|
+
let val = env.get(typedarray);
|
|
1111
|
+
env.setPointer(
|
|
1112
|
+
type,
|
|
1113
|
+
typedArrays.findIndex((constructor) => val instanceof constructor),
|
|
1114
|
+
);
|
|
1115
|
+
env.setPointer(length, val.length);
|
|
1116
|
+
env.getBufferInfo(val, data);
|
|
1117
|
+
env.createValue(val.buffer, arraybuffer);
|
|
1118
|
+
return env.setPointer(byte_offset, val.byteOffset);
|
|
1119
|
+
},
|
|
1120
|
+
napi_get_dataview_info(env_id, dataview, byte_length, data, arraybuffer, byte_offset) {
|
|
1121
|
+
let env = environments[env_id];
|
|
1122
|
+
let val = env.get(dataview);
|
|
1123
|
+
env.setPointer(byte_length, val.byteLength);
|
|
1124
|
+
env.getBufferInfo(val, data);
|
|
1125
|
+
env.createValue(val.buffer, arraybuffer);
|
|
1126
|
+
return env.setPointer(byte_offset, val.byteOffset);
|
|
1127
|
+
},
|
|
1128
|
+
napi_create_string_utf8(env_id, str, length, result) {
|
|
1129
|
+
let env = environments[env_id];
|
|
1130
|
+
let s = decoder.decode(env.memory.subarray(str, str + length));
|
|
1131
|
+
return env.createValue(s, result);
|
|
1132
|
+
},
|
|
1133
|
+
napi_get_value_string_utf8(env_id, value, buf, bufsize, result) {
|
|
1134
|
+
let env = environments[env_id];
|
|
1135
|
+
let val = env.get(value);
|
|
1136
|
+
if (typeof val !== 'string') {
|
|
1137
|
+
return NAPI_STRING_EXPECTED;
|
|
1138
|
+
}
|
|
1139
|
+
if (buf == 0) {
|
|
1140
|
+
return env.setPointer(result, utf8Length(val));
|
|
1141
|
+
}
|
|
1142
|
+
let res = encoder.encodeInto(val, env.memory.subarray(buf, buf + bufsize - 1));
|
|
1143
|
+
env.memory[buf + res.written] = 0; // null terminate
|
|
1144
|
+
return env.setPointer(result, res.written);
|
|
1145
|
+
},
|
|
1146
|
+
napi_create_string_latin1(env_id, str, length, result) {
|
|
1147
|
+
let env = environments[env_id];
|
|
1148
|
+
let s = latin1Decoder.decode(env.memory.subarray(str, str + length));
|
|
1149
|
+
return env.createValue(s, result);
|
|
1150
|
+
},
|
|
1151
|
+
napi_get_value_string_latin1(env_id, value, buf, bufsize, result) {
|
|
1152
|
+
let env = environments[env_id];
|
|
1153
|
+
let val = env.get(value);
|
|
1154
|
+
if (typeof val !== 'string') {
|
|
1155
|
+
return NAPI_STRING_EXPECTED;
|
|
1156
|
+
}
|
|
1157
|
+
if (buf == 0) {
|
|
1158
|
+
return env.setPointer(result, val.length);
|
|
1159
|
+
}
|
|
1160
|
+
let mem = env.memory;
|
|
1161
|
+
let len = Math.min(val.length, bufsize - 1);
|
|
1162
|
+
for (let i = 0; i < len; i++) {
|
|
1163
|
+
let code = val.charCodeAt(i);
|
|
1164
|
+
mem[buf++] = code;
|
|
1165
|
+
}
|
|
1166
|
+
mem[buf] = 0; // null terminate
|
|
1167
|
+
return env.setPointer(result, len);
|
|
1168
|
+
},
|
|
1169
|
+
napi_create_string_utf16(env_id, str, length, result) {
|
|
1170
|
+
let env = environments[env_id];
|
|
1171
|
+
let s = utf16Decoder.decode(env.memory.subarray(str, str + length * 2));
|
|
1172
|
+
return env.createValue(s, result);
|
|
1173
|
+
},
|
|
1174
|
+
napi_get_value_string_utf16(env_id, value, buf, bufsize, result) {
|
|
1175
|
+
let env = environments[env_id];
|
|
1176
|
+
let val = env.get(value);
|
|
1177
|
+
if (typeof val !== 'string') {
|
|
1178
|
+
return NAPI_STRING_EXPECTED;
|
|
1179
|
+
}
|
|
1180
|
+
if (buf == 0) {
|
|
1181
|
+
return env.setPointer(result, val.length);
|
|
1182
|
+
}
|
|
1183
|
+
let mem = env.u16;
|
|
1184
|
+
let ptr = buf >> 1;
|
|
1185
|
+
let len = Math.min(val.length, bufsize - 1);
|
|
1186
|
+
for (let i = 0; i < len; i++) {
|
|
1187
|
+
let code = val.charCodeAt(i);
|
|
1188
|
+
mem[ptr++] = code;
|
|
1189
|
+
}
|
|
1190
|
+
mem[ptr] = 0; // null terminate
|
|
1191
|
+
return env.setPointer(result, len);
|
|
1192
|
+
},
|
|
1193
|
+
napi_create_date(env_id, time, result) {
|
|
1194
|
+
let env = environments[env_id];
|
|
1195
|
+
return env.createValue(new Date(time), result);
|
|
1196
|
+
},
|
|
1197
|
+
napi_get_date_value(env_id, value, result) {
|
|
1198
|
+
let env = environments[env_id];
|
|
1199
|
+
let date = env.get(value);
|
|
1200
|
+
env.f64[result >> 3] = date.valueOf();
|
|
1201
|
+
},
|
|
1202
|
+
napi_create_symbol(env_id, description, result) {
|
|
1203
|
+
let env = environments[env_id];
|
|
1204
|
+
let desc = env.get(description);
|
|
1205
|
+
return env.createValue(Symbol(desc), result);
|
|
1206
|
+
},
|
|
1207
|
+
napi_coerce_to_bool(env_id, value, result) {
|
|
1208
|
+
let env = environments[env_id];
|
|
1209
|
+
return env.createValue(Boolean(env.get(value)), result);
|
|
1210
|
+
},
|
|
1211
|
+
napi_coerce_to_number(env_id, value, result) {
|
|
1212
|
+
let env = environments[env_id];
|
|
1213
|
+
return env.createValue(Number(env.get(value)), result);
|
|
1214
|
+
},
|
|
1215
|
+
napi_coerce_to_object(env_id, value, result) {
|
|
1216
|
+
let env = environments[env_id];
|
|
1217
|
+
return env.createValue(Object(env.get(value)), result);
|
|
1218
|
+
},
|
|
1219
|
+
napi_coerce_to_string(env_id, value, result) {
|
|
1220
|
+
let env = environments[env_id];
|
|
1221
|
+
return env.createValue(String(env.get(value)), result);
|
|
1222
|
+
},
|
|
1223
|
+
napi_typeof(env_id, value, result) {
|
|
1224
|
+
let env = environments[env_id];
|
|
1225
|
+
let val = env.get(value);
|
|
1226
|
+
return env.setPointer(
|
|
1227
|
+
result,
|
|
1228
|
+
(() => {
|
|
1229
|
+
switch (typeof val) {
|
|
1230
|
+
case 'undefined':
|
|
1231
|
+
return 0;
|
|
1232
|
+
case 'boolean':
|
|
1233
|
+
return 2;
|
|
1234
|
+
case 'number':
|
|
1235
|
+
return 3;
|
|
1236
|
+
case 'string':
|
|
1237
|
+
return 4;
|
|
1238
|
+
case 'symbol':
|
|
1239
|
+
return 5;
|
|
1240
|
+
case 'object':
|
|
1241
|
+
if (val === null) {
|
|
1242
|
+
return 1;
|
|
1243
|
+
} else if (val instanceof ExternalValue) {
|
|
1244
|
+
return 8;
|
|
1245
|
+
}
|
|
1246
|
+
return 6;
|
|
1247
|
+
case 'function':
|
|
1248
|
+
return 7;
|
|
1249
|
+
case 'bigint':
|
|
1250
|
+
return 9;
|
|
1251
|
+
}
|
|
1252
|
+
})(),
|
|
1253
|
+
);
|
|
1254
|
+
},
|
|
1255
|
+
napi_instanceof(env_id, object, constructor, result) {
|
|
1256
|
+
let env = environments[env_id];
|
|
1257
|
+
let obj = env.get(object);
|
|
1258
|
+
let cons = env.get(constructor);
|
|
1259
|
+
env.memory[result] = obj instanceof cons ? 1 : 0;
|
|
1260
|
+
return NAPI_OK;
|
|
1261
|
+
},
|
|
1262
|
+
napi_is_array(env_id, value, result) {
|
|
1263
|
+
let env = environments[env_id];
|
|
1264
|
+
let val = env.get(value);
|
|
1265
|
+
env.memory[result] = Array.isArray(val) ? 1 : 0;
|
|
1266
|
+
return NAPI_OK;
|
|
1267
|
+
},
|
|
1268
|
+
napi_is_buffer(env_id, value, result) {
|
|
1269
|
+
let env = environments[env_id];
|
|
1270
|
+
let val = env.get(value);
|
|
1271
|
+
env.memory[result] = (
|
|
1272
|
+
typeof globalThis.Buffer !== 'undefined' ? globalThis.Buffer.isBuffer(val) : val instanceof Uint8Array
|
|
1273
|
+
)
|
|
1274
|
+
? 1
|
|
1275
|
+
: 0;
|
|
1276
|
+
return NAPI_OK;
|
|
1277
|
+
},
|
|
1278
|
+
napi_is_date(env_id, value, result) {
|
|
1279
|
+
let env = environments[env_id];
|
|
1280
|
+
let val = env.get(value);
|
|
1281
|
+
env.memory[result] = val instanceof Date ? 1 : 0;
|
|
1282
|
+
return NAPI_OK;
|
|
1283
|
+
},
|
|
1284
|
+
napi_is_error(env_id, value, result) {
|
|
1285
|
+
let env = environments[env_id];
|
|
1286
|
+
let err = env.get(value);
|
|
1287
|
+
env.memory[result] = err instanceof Error ? 1 : 0;
|
|
1288
|
+
return NAPI_OK;
|
|
1289
|
+
},
|
|
1290
|
+
napi_is_typedarray(env_id, value, result) {
|
|
1291
|
+
let env = environments[env_id];
|
|
1292
|
+
let buf = env.get(value);
|
|
1293
|
+
env.memory[result] = ArrayBuffer.isView(buf) && !(buf instanceof DataView) ? 1 : 0;
|
|
1294
|
+
return NAPI_OK;
|
|
1295
|
+
},
|
|
1296
|
+
napi_is_dataview(env_id, value, result) {
|
|
1297
|
+
let env = environments[env_id];
|
|
1298
|
+
let val = env.get(value);
|
|
1299
|
+
env.memory[result] = val instanceof DataView ? 1 : 0;
|
|
1300
|
+
return NAPI_OK;
|
|
1301
|
+
},
|
|
1302
|
+
napi_strict_equals(env_id, lhs, rhs, result) {
|
|
1303
|
+
let env = environments[env_id];
|
|
1304
|
+
env.memory[result] = env.get(lhs) === env.get(rhs) ? 1 : 0;
|
|
1305
|
+
return NAPI_OK;
|
|
1306
|
+
},
|
|
1307
|
+
napi_wrap(env_id, js_object, native_object, finalize_cb, finalize_hint, result) {
|
|
1308
|
+
let env = environments[env_id];
|
|
1309
|
+
let obj = env.get(js_object);
|
|
1310
|
+
env.wrappedObjects.set(obj, native_object);
|
|
1311
|
+
if (finalize_cb) {
|
|
1312
|
+
let cb = env.table.get(finalize_cb);
|
|
1313
|
+
finalizationRegistry.register(obj, new FinalizeRecord(env_id, cb, finalize_hint, native_object));
|
|
1314
|
+
}
|
|
1336
1315
|
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
}
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1316
|
+
if (result) {
|
|
1317
|
+
return napi.napi_create_reference(env_id, js_object, 1, result);
|
|
1318
|
+
}
|
|
1319
|
+
|
|
1320
|
+
return NAPI_OK;
|
|
1321
|
+
},
|
|
1322
|
+
napi_unwrap(env_id, js_object, result) {
|
|
1323
|
+
let env = environments[env_id];
|
|
1324
|
+
let obj = env.get(js_object);
|
|
1325
|
+
let native_object = env.wrappedObjects.get(obj);
|
|
1326
|
+
env.setPointer(result, native_object);
|
|
1327
|
+
return NAPI_OK;
|
|
1328
|
+
},
|
|
1329
|
+
napi_remove_wrap(env_id, js_object, result) {
|
|
1330
|
+
let env = environments[env_id];
|
|
1331
|
+
let obj = env.get(js_object);
|
|
1332
|
+
let native_object = env.wrappedObjects.get(obj);
|
|
1333
|
+
finalizationRegistry.unregister(obj);
|
|
1334
|
+
env.wrappedObjects.delete(obj);
|
|
1335
|
+
return env.setPointer(result, native_object);
|
|
1336
|
+
},
|
|
1337
|
+
napi_type_tag_object(_env_id, _js_object, _type_tag) {
|
|
1338
|
+
throw new Error('not implemented');
|
|
1339
|
+
},
|
|
1340
|
+
napi_check_object_type_tag(_env_id, _js_object, _type_tag) {
|
|
1341
|
+
throw new Error('not implemented');
|
|
1342
|
+
},
|
|
1343
|
+
napi_add_finalizer(env_id, js_object, native_object, finalize_cb, finalize_hint, result) {
|
|
1344
|
+
let env = environments[env_id];
|
|
1345
|
+
let obj = env.get(js_object);
|
|
1346
|
+
let cb = env.table.get(finalize_cb);
|
|
1347
|
+
finalizationRegistry.register(obj, new FinalizeRecord(env_id, cb, finalize_hint, native_object));
|
|
1348
|
+
if (result) {
|
|
1349
|
+
return napi.napi_create_reference(env_id, js_object, 1, result);
|
|
1350
|
+
}
|
|
1351
|
+
|
|
1352
|
+
return NAPI_OK;
|
|
1353
|
+
},
|
|
1354
|
+
napi_create_promise(env_id, deferred, promise) {
|
|
1355
|
+
let env = environments[env_id];
|
|
1356
|
+
let p = new Promise((resolve, reject) => {
|
|
1357
|
+
let id = env.deferred.length;
|
|
1358
|
+
env.deferred.push({ resolve, reject });
|
|
1359
|
+
env.setPointer(deferred, id);
|
|
1360
|
+
});
|
|
1361
|
+
return env.createValue(p, promise);
|
|
1362
|
+
},
|
|
1363
|
+
napi_resolve_deferred(env_id, deferred, resolution) {
|
|
1364
|
+
let env = environments[env_id];
|
|
1365
|
+
let { resolve } = env.deferred[deferred];
|
|
1366
|
+
let value = env.get(resolution);
|
|
1367
|
+
resolve(value);
|
|
1368
|
+
env.deferred[deferred] = undefined;
|
|
1369
|
+
return NAPI_OK;
|
|
1370
|
+
},
|
|
1371
|
+
napi_reject_deferred(env_id, deferred, rejection) {
|
|
1372
|
+
let env = environments[env_id];
|
|
1373
|
+
let { reject } = env.deferred[deferred];
|
|
1374
|
+
let value = env.get(rejection);
|
|
1375
|
+
reject(value);
|
|
1376
|
+
env.deferred[deferred] = undefined;
|
|
1377
|
+
return NAPI_OK;
|
|
1378
|
+
},
|
|
1379
|
+
napi_is_promise(env_id, value, result) {
|
|
1380
|
+
let env = environments[env_id];
|
|
1381
|
+
let val = env.get(value);
|
|
1382
|
+
env.memory[result] = val instanceof Promise ? 1 : 0;
|
|
1383
|
+
return NAPI_OK;
|
|
1384
|
+
},
|
|
1385
|
+
napi_run_script(env_id, script, result) {
|
|
1386
|
+
let env = environments[env_id];
|
|
1387
|
+
let source = env.get(script);
|
|
1388
|
+
let res = (0, eval)(source);
|
|
1389
|
+
return env.createValue(res, result);
|
|
1390
|
+
},
|
|
1391
|
+
napi_create_external(env_id, data, finalize_cb, finalize_hint, result) {
|
|
1392
|
+
let env = environments[env_id];
|
|
1393
|
+
let external = new ExternalValue();
|
|
1394
|
+
env.externalObjects.set(external, data);
|
|
1395
|
+
if (finalize_cb) {
|
|
1396
|
+
let cb = env.table.get(finalize_cb);
|
|
1397
|
+
finalizationRegistry.register(external, new FinalizeRecord(env_id, cb, finalize_hint, data));
|
|
1398
|
+
}
|
|
1399
|
+
return env.createValue(external, result);
|
|
1400
|
+
},
|
|
1401
|
+
napi_get_value_external(env_id, value, result) {
|
|
1402
|
+
let env = environments[env_id];
|
|
1403
|
+
let external = env.get(value);
|
|
1404
|
+
let val = env.externalObjects.get(external);
|
|
1405
|
+
if (!val) {
|
|
1406
|
+
return NAPI_INVALID_ARG;
|
|
1407
|
+
}
|
|
1408
|
+
return env.setPointer(result, val);
|
|
1409
|
+
},
|
|
1410
|
+
napi_adjust_external_memory() {
|
|
1411
|
+
return NAPI_OK;
|
|
1412
|
+
},
|
|
1398
1413
|
};
|
|
1399
1414
|
|
|
1400
1415
|
function strlen(buf, ptr) {
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1416
|
+
let len = 0;
|
|
1417
|
+
while (buf[ptr] !== 0) {
|
|
1418
|
+
len++;
|
|
1419
|
+
ptr++;
|
|
1420
|
+
}
|
|
1406
1421
|
|
|
1407
|
-
|
|
1422
|
+
return len;
|
|
1408
1423
|
}
|
|
1409
1424
|
|
|
1410
1425
|
function utf8Length(string) {
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1426
|
+
let len = 0;
|
|
1427
|
+
for (let i = 0; i < string.length; i++) {
|
|
1428
|
+
let c = string.charCodeAt(i);
|
|
1429
|
+
|
|
1430
|
+
if (c >= 0xd800 && c <= 0xdbff && i < string.length - 1) {
|
|
1431
|
+
let c2 = string.charCodeAt(++i);
|
|
1432
|
+
if ((c2 & 0xfc00) === 0xdc00) {
|
|
1433
|
+
c = ((c & 0x3ff) << 10) + (c2 & 0x3ff) + 0x10000;
|
|
1434
|
+
} else {
|
|
1435
|
+
// unmatched surrogate.
|
|
1436
|
+
i--;
|
|
1437
|
+
}
|
|
1438
|
+
}
|
|
1424
1439
|
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1440
|
+
if ((c & 0xffffff80) === 0) {
|
|
1441
|
+
len++;
|
|
1442
|
+
} else if ((c & 0xfffff800) === 0) {
|
|
1443
|
+
len += 2;
|
|
1444
|
+
} else if ((c & 0xffff0000) === 0) {
|
|
1445
|
+
len += 3;
|
|
1446
|
+
} else if ((c & 0xffe00000) === 0) {
|
|
1447
|
+
len += 4;
|
|
1448
|
+
}
|
|
1433
1449
|
}
|
|
1434
|
-
|
|
1435
|
-
return len;
|
|
1450
|
+
return len;
|
|
1436
1451
|
}
|