@gjsify/lightningcss-wasm 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +37 -0
- package/src/async.mjs +74 -0
- package/src/browserslistToTargets.js +48 -0
- package/src/composeVisitors.js +450 -0
- package/src/flags.js +28 -0
- package/src/index.mjs +110 -0
- package/src/napi-wasm.mjs +1436 -0
- package/wasm/lightningcss_node.wasm +0 -0
|
@@ -0,0 +1,1436 @@
|
|
|
1
|
+
const NAPI_OK = 0;
|
|
2
|
+
const NAPI_INVALID_ARG = 1;
|
|
3
|
+
const NAPI_STRING_EXPECTED = 3;
|
|
4
|
+
const NAPI_NUMBER_EXPECTED = 6;
|
|
5
|
+
const NAPI_BOOLEAN_EXPECTED = 7;
|
|
6
|
+
const NAPI_GENERIC_FAILURE = 9;
|
|
7
|
+
const NAPI_PENDING_EXCEPTION = 10;
|
|
8
|
+
const NAPI_CANCELED = 11;
|
|
9
|
+
const NAPI_HANDLE_SCOPE_MISMATCH = 13;
|
|
10
|
+
const NAPI_BIGINT_EXPECTED = 17;
|
|
11
|
+
const NAPI_NO_EXTERNAL_BUFFERS_ALLOWED = 22;
|
|
12
|
+
|
|
13
|
+
// https://nodejs.org/api/n-api.html#napi_property_attributes
|
|
14
|
+
const NAPI_WRITABLE = 1 << 0;
|
|
15
|
+
const NAPI_ENUMERABLE = 1 << 1;
|
|
16
|
+
const NAPI_CONFIGURABLE = 1 << 2;
|
|
17
|
+
const NAPI_STATIC = 1 << 10;
|
|
18
|
+
|
|
19
|
+
// https://nodejs.org/api/n-api.html#napi_typedarray_type
|
|
20
|
+
const typedArrays = [
|
|
21
|
+
Int8Array,
|
|
22
|
+
Uint8Array,
|
|
23
|
+
Uint8ClampedArray,
|
|
24
|
+
Int16Array,
|
|
25
|
+
Uint16Array,
|
|
26
|
+
Int32Array,
|
|
27
|
+
Uint32Array,
|
|
28
|
+
Float32Array,
|
|
29
|
+
Float64Array,
|
|
30
|
+
BigInt64Array,
|
|
31
|
+
BigUint64Array
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
const environments = [];
|
|
35
|
+
|
|
36
|
+
export class Environment {
|
|
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
|
+
throw e;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
destroy() {
|
|
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
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
this.buffers.clear();
|
|
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;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
let id = this.pushValue(value, scope);
|
|
137
|
+
this.setPointer(result, id);
|
|
138
|
+
return NAPI_OK;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
setPointer(ptr, value) {
|
|
142
|
+
this.u32[ptr >> 2] = value;
|
|
143
|
+
return NAPI_OK;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
_u32 = new Uint32Array();
|
|
147
|
+
get u32() {
|
|
148
|
+
if (this._u32.byteLength === 0) {
|
|
149
|
+
this._u32 = new Uint32Array(this.instance.exports.memory.buffer);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return this._u32;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
_i32 = new Int32Array();
|
|
156
|
+
get i32() {
|
|
157
|
+
if (this._i32.byteLength === 0) {
|
|
158
|
+
this._i32 = new Int32Array(this.instance.exports.memory.buffer);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return this._i32;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
_u16 = new Uint16Array();
|
|
165
|
+
get u16() {
|
|
166
|
+
if (this._u16.byteLength === 0) {
|
|
167
|
+
this._u16 = new Uint16Array(this.instance.exports.memory.buffer);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return this._u16;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
_u64 = new BigUint64Array();
|
|
174
|
+
get u64() {
|
|
175
|
+
if (this._u64.byteLength === 0) {
|
|
176
|
+
this._u64 = new BigUint64Array(this.instance.exports.memory.buffer);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return this._u64;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
_i64 = new BigInt64Array();
|
|
183
|
+
get i64() {
|
|
184
|
+
if (this._i64.byteLength === 0) {
|
|
185
|
+
this._i64 = new BigInt64Array(this.instance.exports.memory.buffer);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return this._i64;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
_f64 = new Float64Array();
|
|
192
|
+
get f64() {
|
|
193
|
+
if (this._f64.byteLength === 0) {
|
|
194
|
+
this._f64 = new Float64Array(this.instance.exports.memory.buffer);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return this._f64;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
_buf = new Uint8Array();
|
|
201
|
+
get memory() {
|
|
202
|
+
if (this._buf.byteLength === 0) {
|
|
203
|
+
this._buf = new Uint8Array(this.instance.exports.memory.buffer);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return this._buf;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
getBufferInfo(buf, ptr) {
|
|
210
|
+
if (this.buffers.has(buf)) {
|
|
211
|
+
let b = this.buffers.get(buf);
|
|
212
|
+
this.setPointer(ptr, b.byteOffset);
|
|
213
|
+
return b.byteLength;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
if (buf instanceof ArrayBuffer) {
|
|
217
|
+
let b = this.copyBuffer(new Uint8Array(buf));
|
|
218
|
+
this.setPointer(ptr, b.byteOffset);
|
|
219
|
+
return b.byteLength;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// If this is a view into WASM memory, no copies needed.
|
|
223
|
+
if (buf.buffer === this.instance.exports.memory.buffer) {
|
|
224
|
+
this.setPointer(ptr, buf.byteOffset);
|
|
225
|
+
return buf.byteLength;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
let b = this.copyBuffer(new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength));
|
|
229
|
+
this.setPointer(ptr, b.byteOffset);
|
|
230
|
+
return b.byteLength;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
copyBuffer(data) {
|
|
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
|
+
});
|
|
264
|
+
|
|
265
|
+
let res = fn(env.id, info);
|
|
266
|
+
return env.get(res);
|
|
267
|
+
} finally {
|
|
268
|
+
env.popScope();
|
|
269
|
+
if (env.pendingException) {
|
|
270
|
+
let e = env.pendingException;
|
|
271
|
+
env.pendingException = null;
|
|
272
|
+
throw e;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
|
|
277
|
+
return func;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
readPropertyDescriptor(ptr) {
|
|
281
|
+
// https://nodejs.org/api/n-api.html#napi_property_descriptor
|
|
282
|
+
let buf = this.u32;
|
|
283
|
+
let utf8name = buf[ptr++];
|
|
284
|
+
let nameValue = buf[ptr++];
|
|
285
|
+
let method = buf[ptr++];
|
|
286
|
+
let getter = buf[ptr++];
|
|
287
|
+
let setter = buf[ptr++];
|
|
288
|
+
let val = buf[ptr++];
|
|
289
|
+
let attrs = buf[ptr++];
|
|
290
|
+
let data = buf[ptr++];
|
|
291
|
+
|
|
292
|
+
let name = utf8name ? this.getString(utf8name) : this.get(nameValue);
|
|
293
|
+
let writable = Boolean(attrs & NAPI_WRITABLE);
|
|
294
|
+
let enumerable = Boolean(attrs & NAPI_ENUMERABLE);
|
|
295
|
+
let configurable = Boolean(attrs & NAPI_CONFIGURABLE);
|
|
296
|
+
let isStatic = Boolean(attrs & NAPI_STATIC);
|
|
297
|
+
let get = getter ? this.createFunction(getter, data) : undefined;
|
|
298
|
+
let set = setter ? this.createFunction(setter, data) : undefined;
|
|
299
|
+
let value = method ? this.createFunction(method, data) : val ? this.get(val) : undefined;
|
|
300
|
+
|
|
301
|
+
let descriptor = {
|
|
302
|
+
name,
|
|
303
|
+
static: isStatic,
|
|
304
|
+
configurable,
|
|
305
|
+
enumerable
|
|
306
|
+
};
|
|
307
|
+
if (get || set) {
|
|
308
|
+
descriptor.get = get;
|
|
309
|
+
descriptor.set = set;
|
|
310
|
+
} else if (value) {
|
|
311
|
+
descriptor.writable = writable;
|
|
312
|
+
descriptor.value = value;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
return descriptor;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
const decoder = new TextDecoder("utf-8", { ignoreBOM: true, fatal: true });
|
|
320
|
+
const latin1Decoder = new TextDecoder('latin1');
|
|
321
|
+
const utf16Decoder = new TextDecoder('utf-16');
|
|
322
|
+
const encoder = new TextEncoder();
|
|
323
|
+
|
|
324
|
+
class FinalizeRecord {
|
|
325
|
+
constructor(env, finalize, hint, data) {
|
|
326
|
+
this.env = env;
|
|
327
|
+
this.finalize = finalize;
|
|
328
|
+
this.hint = hint;
|
|
329
|
+
this.data = data;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
const finalizationRegistry = new FinalizationRegistry(buffer => {
|
|
334
|
+
if (buffer.finalize) {
|
|
335
|
+
buffer.finalize(buffer.env, buffer.data, buffer.hint);
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
class ExternalValue {}
|
|
340
|
+
|
|
341
|
+
const threadsafeFunctions = [];
|
|
342
|
+
|
|
343
|
+
class ThreadSafeFunction {
|
|
344
|
+
constructor(env, fn, nativeFn, context) {
|
|
345
|
+
this.env = env;
|
|
346
|
+
this.fn = fn;
|
|
347
|
+
this.nativeFn = nativeFn;
|
|
348
|
+
this.context = context;
|
|
349
|
+
this.id = threadsafeFunctions.length;
|
|
350
|
+
threadsafeFunctions.push(this);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
const asyncWork = [null];
|
|
355
|
+
|
|
356
|
+
class AsyncWork {
|
|
357
|
+
constructor(env, execute, complete, data) {
|
|
358
|
+
this.env = env;
|
|
359
|
+
this.execute = execute;
|
|
360
|
+
this.complete = complete;
|
|
361
|
+
this.data = data;
|
|
362
|
+
this.id = asyncWork.length;
|
|
363
|
+
asyncWork.push(this);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
export const napi = {
|
|
368
|
+
napi_open_handle_scope(env_id, result) {
|
|
369
|
+
let env = environments[env_id];
|
|
370
|
+
let id = env.pushScope();
|
|
371
|
+
return env.setPointer(result, id);
|
|
372
|
+
},
|
|
373
|
+
napi_close_handle_scope(env_id, scope) {
|
|
374
|
+
let env = environments[env_id];
|
|
375
|
+
if (scope !== env.scopes.length - 1) {
|
|
376
|
+
return NAPI_HANDLE_SCOPE_MISMATCH;
|
|
377
|
+
}
|
|
378
|
+
env.popScope();
|
|
379
|
+
return NAPI_OK;
|
|
380
|
+
},
|
|
381
|
+
napi_open_escapable_handle_scope(env_id, result) {
|
|
382
|
+
let env = environments[env_id];
|
|
383
|
+
let id = env.pushScope();
|
|
384
|
+
return env.setPointer(result, id);
|
|
385
|
+
},
|
|
386
|
+
napi_close_escapable_handle_scope(env_id, scope) {
|
|
387
|
+
let env = environments[env_id];
|
|
388
|
+
if (scope !== env.scopes.length - 1) {
|
|
389
|
+
return NAPI_HANDLE_SCOPE_MISMATCH;
|
|
390
|
+
}
|
|
391
|
+
env.popScope();
|
|
392
|
+
return NAPI_OK;
|
|
393
|
+
},
|
|
394
|
+
napi_escape_handle(env_id, scope_id, escapee, result) {
|
|
395
|
+
let env = environments[env_id];
|
|
396
|
+
let value = env.get(escapee);
|
|
397
|
+
// Create a value in the outer scope.
|
|
398
|
+
return env.createValue(value, result, scope_id - 1);
|
|
399
|
+
},
|
|
400
|
+
napi_create_object(env_id, result) {
|
|
401
|
+
let env = environments[env_id];
|
|
402
|
+
return env.createValue({}, result);
|
|
403
|
+
},
|
|
404
|
+
napi_set_property(env_id, object, key, value) {
|
|
405
|
+
let env = environments[env_id];
|
|
406
|
+
let obj = env.get(object);
|
|
407
|
+
let name = env.get(key);
|
|
408
|
+
let val = env.get(value);
|
|
409
|
+
obj[name] = val;
|
|
410
|
+
return NAPI_OK;
|
|
411
|
+
},
|
|
412
|
+
napi_get_property(env_id, object, key, result) {
|
|
413
|
+
let env = environments[env_id];
|
|
414
|
+
let obj = env.get(object);
|
|
415
|
+
let name = env.get(key);
|
|
416
|
+
return env.createValue(obj[name], result);
|
|
417
|
+
},
|
|
418
|
+
napi_delete_property(env_id, object, key, result) {
|
|
419
|
+
let env = environments[env_id];
|
|
420
|
+
let obj = env.get(object);
|
|
421
|
+
let name = env.get(key);
|
|
422
|
+
let res = false;
|
|
423
|
+
try {
|
|
424
|
+
res = delete obj[name];
|
|
425
|
+
} catch (err) {}
|
|
426
|
+
if (result) {
|
|
427
|
+
env.memory[result] = res ? 1 : 0;
|
|
428
|
+
}
|
|
429
|
+
return NAPI_OK;
|
|
430
|
+
},
|
|
431
|
+
napi_has_property(env_id, object, key, result) {
|
|
432
|
+
let env = environments[env_id];
|
|
433
|
+
let obj = env.get(object);
|
|
434
|
+
let name = env.get(key);
|
|
435
|
+
// return env.setPointer(result, name in obj ? 1 : 0);
|
|
436
|
+
env.memory[result] = name in obj ? 1 : 0;
|
|
437
|
+
return NAPI_OK;
|
|
438
|
+
},
|
|
439
|
+
napi_has_own_property(env_id, object, key, result) {
|
|
440
|
+
let env = environments[env_id];
|
|
441
|
+
let obj = env.get(object);
|
|
442
|
+
let name = env.get(key);
|
|
443
|
+
env.memory[result] = obj.hasOwnProperty(name) ? 1 : 0;
|
|
444
|
+
return NAPI_OK;
|
|
445
|
+
},
|
|
446
|
+
napi_set_named_property(env_id, object, utf8Name, value) {
|
|
447
|
+
let env = environments[env_id];
|
|
448
|
+
let obj = env.get(object);
|
|
449
|
+
let val = env.get(value);
|
|
450
|
+
let name = env.getString(utf8Name);
|
|
451
|
+
obj[name] = val;
|
|
452
|
+
return NAPI_OK;
|
|
453
|
+
},
|
|
454
|
+
napi_get_named_property(env_id, object, utf8Name, result) {
|
|
455
|
+
let env = environments[env_id];
|
|
456
|
+
let obj = env.get(object);
|
|
457
|
+
let name = env.getString(utf8Name);
|
|
458
|
+
return env.createValue(obj[name], result);
|
|
459
|
+
},
|
|
460
|
+
napi_has_named_property(env_id, object, utf8Name, result) {
|
|
461
|
+
let env = environments[env_id];
|
|
462
|
+
let obj = env.get(object);
|
|
463
|
+
let name = env.getString(utf8Name);
|
|
464
|
+
env.memory[result] = name in obj ? 1 : 0;
|
|
465
|
+
return NAPI_OK;
|
|
466
|
+
},
|
|
467
|
+
napi_get_property_names(env_id, object, result) {
|
|
468
|
+
let env = environments[env_id];
|
|
469
|
+
let obj = env.get(object);
|
|
470
|
+
let properties = Object.keys(obj);
|
|
471
|
+
return env.createValue(properties, result);
|
|
472
|
+
},
|
|
473
|
+
napi_get_all_property_names(env_id, object, key_mode, key_filter, key_conversion, result) {
|
|
474
|
+
throw new Error('not implemented');
|
|
475
|
+
},
|
|
476
|
+
napi_define_properties(env_id, object, property_count, properties) {
|
|
477
|
+
let env = environments[env_id];
|
|
478
|
+
let obj = env.get(object);
|
|
479
|
+
let ptr = properties >> 2;
|
|
480
|
+
for (let i = 0; i < property_count; i++) {
|
|
481
|
+
let descriptor = env.readPropertyDescriptor(ptr);
|
|
482
|
+
Object.defineProperty(obj, descriptor.name, descriptor);
|
|
483
|
+
ptr += 8;
|
|
484
|
+
}
|
|
485
|
+
return NAPI_OK;
|
|
486
|
+
},
|
|
487
|
+
napi_object_freeze(env_id, object) {
|
|
488
|
+
let env = environments[env_id];
|
|
489
|
+
let obj = env.get(object);
|
|
490
|
+
Object.freeze(obj);
|
|
491
|
+
return NAPI_OK;
|
|
492
|
+
},
|
|
493
|
+
napi_object_seal(env_id, object) {
|
|
494
|
+
let env = environments[env_id];
|
|
495
|
+
let obj = env.get(object);
|
|
496
|
+
Object.seal(obj);
|
|
497
|
+
return NAPI_OK;
|
|
498
|
+
},
|
|
499
|
+
napi_get_prototype(env_id, object, result) {
|
|
500
|
+
let env = environments[env_id];
|
|
501
|
+
let obj = env.get(object);
|
|
502
|
+
return env.createValue(Object.getPrototypeOf(obj), result);
|
|
503
|
+
},
|
|
504
|
+
napi_define_class(env_id, utf8name, length, constructor, data, property_count, properties, result) {
|
|
505
|
+
let env = environments[env_id];
|
|
506
|
+
let func = env.createFunction(constructor, data);
|
|
507
|
+
|
|
508
|
+
Object.defineProperty(func, 'name', {
|
|
509
|
+
value: env.getString(utf8name, length),
|
|
510
|
+
configurable: true
|
|
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
|
+
}
|
|
523
|
+
|
|
524
|
+
return env.createValue(func, result);
|
|
525
|
+
},
|
|
526
|
+
napi_create_reference(env_id, value, refcount, result) {
|
|
527
|
+
let env = environments[env_id];
|
|
528
|
+
let id = env.referenceId++;
|
|
529
|
+
env.references.set(id, {
|
|
530
|
+
value: env.get(value),
|
|
531
|
+
refcount
|
|
532
|
+
});
|
|
533
|
+
return env.setPointer(result, id);
|
|
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
|
+
}
|
|
689
|
+
|
|
690
|
+
res *= BigInt((-1) ** sign_bit);
|
|
691
|
+
return env.createValue(res, result);
|
|
692
|
+
},
|
|
693
|
+
napi_get_value_bigint_words(env_id, value, sign_bit, word_count, words) {
|
|
694
|
+
let env = environments[env_id];
|
|
695
|
+
let val = env.get(value);
|
|
696
|
+
if (typeof val !== "bigint") {
|
|
697
|
+
return NAPI_BIGINT_EXPECTED;
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
let count = env.u32[word_count >> 2];
|
|
701
|
+
|
|
702
|
+
if (sign_bit) {
|
|
703
|
+
env.i32[sign_bit] = val < 0n ? 1 : 0;
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
let i = 0;
|
|
707
|
+
if (words) {
|
|
708
|
+
let mask = (1n << 64n) - 1n;
|
|
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
|
+
}
|
|
720
|
+
|
|
721
|
+
while (val > 0n) {
|
|
722
|
+
i++;
|
|
723
|
+
val >>= 64n;
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
return env.setPointer(word_count, i);
|
|
727
|
+
},
|
|
728
|
+
napi_get_null(env_id, result) {
|
|
729
|
+
let env = environments[env_id];
|
|
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
|
+
}
|
|
801
|
+
|
|
802
|
+
try {
|
|
803
|
+
let res = fn.apply(thisArg, args);
|
|
804
|
+
return env.createValue(res, result);
|
|
805
|
+
} catch (err) {
|
|
806
|
+
env.pendingException = err;
|
|
807
|
+
return NAPI_PENDING_EXCEPTION;
|
|
808
|
+
}
|
|
809
|
+
},
|
|
810
|
+
napi_new_instance(env_id, cons, argc, argv, result) {
|
|
811
|
+
let env = environments[env_id];
|
|
812
|
+
let Class = env.get(cons);
|
|
813
|
+
let args = new Array(argc);
|
|
814
|
+
let mem = env.u32;
|
|
815
|
+
for (let i = 0; i < argc; i++) {
|
|
816
|
+
args[i] = env.get(mem[argv >> 2]);
|
|
817
|
+
argv += 4;
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
try {
|
|
821
|
+
let value = new Class(...args);
|
|
822
|
+
return env.createValue(value, result);
|
|
823
|
+
} catch (err) {
|
|
824
|
+
env.pendingException = err;
|
|
825
|
+
return NAPI_PENDING_EXCEPTION;
|
|
826
|
+
}
|
|
827
|
+
},
|
|
828
|
+
napi_get_cb_info(env_id, cbinfo, argc, argv, thisArg, data) {
|
|
829
|
+
let env = environments[env_id];
|
|
830
|
+
let info = env.get(cbinfo);
|
|
831
|
+
env.setPointer(argc, info.args.length);
|
|
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
|
+
}
|
|
867
|
+
|
|
868
|
+
env.setPointer(result, f.id);
|
|
869
|
+
return NAPI_OK;
|
|
870
|
+
},
|
|
871
|
+
napi_ref_threadsafe_function() {
|
|
872
|
+
return NAPI_OK;
|
|
873
|
+
},
|
|
874
|
+
napi_unref_threadsafe_function() {
|
|
875
|
+
return NAPI_OK;
|
|
876
|
+
},
|
|
877
|
+
napi_acquire_threadsafe_function() {
|
|
878
|
+
return NAPI_OK;
|
|
879
|
+
},
|
|
880
|
+
napi_release_threadsafe_function(func, mode) {
|
|
881
|
+
threadsafeFunctions[func] = undefined;
|
|
882
|
+
return NAPI_OK;
|
|
883
|
+
},
|
|
884
|
+
napi_call_threadsafe_function(func, data, is_blocking) {
|
|
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
|
+
}
|
|
1002
|
+
|
|
1003
|
+
// Return a view into WASM memory.
|
|
1004
|
+
let buf = typeof globalThis.Buffer !== 'undefined'
|
|
1005
|
+
? globalThis.Buffer.from(env.memory.buffer, ptr, length)
|
|
1006
|
+
: env.memory.subarray(ptr, ptr + length);
|
|
1007
|
+
|
|
1008
|
+
let finalize = (_env, data) => {
|
|
1009
|
+
if (env.instance.exports.napi_wasm_free) {
|
|
1010
|
+
env.instance.exports.napi_wasm_free(data);
|
|
1011
|
+
}
|
|
1012
|
+
};
|
|
1013
|
+
|
|
1014
|
+
finalizationRegistry.register(buf, new FinalizeRecord(env_id, finalize, 0, ptr));
|
|
1015
|
+
return env.createValue(buf, result);
|
|
1016
|
+
},
|
|
1017
|
+
napi_create_buffer_copy(env_id, length, data, result_data, result) {
|
|
1018
|
+
let env = environments[env_id];
|
|
1019
|
+
let ptr = env.instance.exports.napi_wasm_malloc(length);
|
|
1020
|
+
env.memory.set(env.memory.subarray(data, data + length), ptr);
|
|
1021
|
+
if (result_data) {
|
|
1022
|
+
env.setPointer(result_data, ptr);
|
|
1023
|
+
}
|
|
1024
|
+
|
|
1025
|
+
// Return a view into WASM memory.
|
|
1026
|
+
let res = typeof globalThis.Buffer !== 'undefined'
|
|
1027
|
+
? globalThis.Buffer.from(env.memory.buffer, ptr, length)
|
|
1028
|
+
: env.memory.subarray(ptr, ptr + length);
|
|
1029
|
+
|
|
1030
|
+
let finalize = (_env, data) => {
|
|
1031
|
+
if (env.instance.exports.napi_wasm_free) {
|
|
1032
|
+
env.instance.exports.napi_wasm_free(data);
|
|
1033
|
+
}
|
|
1034
|
+
};
|
|
1035
|
+
|
|
1036
|
+
finalizationRegistry.register(buf, new FinalizeRecord(env_id, finalize, 0, ptr));
|
|
1037
|
+
return env.createValue(res, result);
|
|
1038
|
+
},
|
|
1039
|
+
napi_create_external_buffer(env_id, length, data, finalize_cb, finalize_hint, result) {
|
|
1040
|
+
let env = environments[env_id];
|
|
1041
|
+
let buf = typeof globalThis.Buffer !== 'undefined'
|
|
1042
|
+
? globalThis.Buffer.from(env.memory.buffer, data, length)
|
|
1043
|
+
: env.memory.subarray(data, data + length);
|
|
1044
|
+
if (finalize_cb) {
|
|
1045
|
+
let cb = env.table.get(finalize_cb);
|
|
1046
|
+
finalizationRegistry.register(buf, new FinalizeRecord(env_id, cb, finalize_hint, data));
|
|
1047
|
+
}
|
|
1048
|
+
|
|
1049
|
+
return env.createValue(buf, result);
|
|
1050
|
+
},
|
|
1051
|
+
napi_get_buffer_info(env_id, value, data, length) {
|
|
1052
|
+
let env = environments[env_id];
|
|
1053
|
+
let buf = env.get(value);
|
|
1054
|
+
let len = env.getBufferInfo(buf, data);
|
|
1055
|
+
return env.setPointer(length, len);
|
|
1056
|
+
},
|
|
1057
|
+
napi_create_arraybuffer(env_id, length, data, result) {
|
|
1058
|
+
let env = environments[env_id];
|
|
1059
|
+
let buf = new ArrayBuffer(length);
|
|
1060
|
+
if (data) {
|
|
1061
|
+
// This copies the ArrayBuffer into the WASM memory.
|
|
1062
|
+
env.getBufferInfo(buf, data);
|
|
1063
|
+
}
|
|
1064
|
+
return env.createValue(buf, result);
|
|
1065
|
+
},
|
|
1066
|
+
napi_create_external_arraybuffer(env_id, data, length, finalize_cb, finalize_hint, result) {
|
|
1067
|
+
// There is no way to actually create an external ArrayBuffer without copying.
|
|
1068
|
+
// You can only create typed arrays as subarrays, not ArrayBuffer.
|
|
1069
|
+
return NAPI_NO_EXTERNAL_BUFFERS_ALLOWED;
|
|
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
|
+
}
|
|
1300
|
+
|
|
1301
|
+
if (result) {
|
|
1302
|
+
return napi.napi_create_reference(env_id, js_object, 1, result);
|
|
1303
|
+
}
|
|
1304
|
+
|
|
1305
|
+
return NAPI_OK;
|
|
1306
|
+
},
|
|
1307
|
+
napi_unwrap(env_id, js_object, result) {
|
|
1308
|
+
let env = environments[env_id];
|
|
1309
|
+
let obj = env.get(js_object);
|
|
1310
|
+
let native_object = env.wrappedObjects.get(obj);
|
|
1311
|
+
env.setPointer(result, native_object);
|
|
1312
|
+
return NAPI_OK;
|
|
1313
|
+
},
|
|
1314
|
+
napi_remove_wrap(env_id, js_object, result) {
|
|
1315
|
+
let env = environments[env_id];
|
|
1316
|
+
let obj = env.get(js_object);
|
|
1317
|
+
let native_object = env.wrappedObjects.get(obj);
|
|
1318
|
+
finalizationRegistry.unregister(obj);
|
|
1319
|
+
env.wrappedObjects.delete(obj);
|
|
1320
|
+
return env.setPointer(result, native_object);
|
|
1321
|
+
},
|
|
1322
|
+
napi_type_tag_object(env_id, js_object, type_tag) {
|
|
1323
|
+
throw new Error('not implemented');
|
|
1324
|
+
},
|
|
1325
|
+
napi_check_object_type_tag(env_id, js_object, type_tag) {
|
|
1326
|
+
throw new Error('not implemented');
|
|
1327
|
+
},
|
|
1328
|
+
napi_add_finalizer(env_id, js_object, native_object, finalize_cb, finalize_hint, result) {
|
|
1329
|
+
let env = environments[env_id];
|
|
1330
|
+
let obj = env.get(js_object);
|
|
1331
|
+
let cb = env.table.get(finalize_cb);
|
|
1332
|
+
finalizationRegistry.register(obj, new FinalizeRecord(env_id, cb, finalize_hint, native_object));
|
|
1333
|
+
if (result) {
|
|
1334
|
+
return napi.napi_create_reference(env_id, js_object, 1, result);
|
|
1335
|
+
}
|
|
1336
|
+
|
|
1337
|
+
return NAPI_OK;
|
|
1338
|
+
},
|
|
1339
|
+
napi_create_promise(env_id, deferred, promise) {
|
|
1340
|
+
let env = environments[env_id];
|
|
1341
|
+
let p = new Promise((resolve, reject) => {
|
|
1342
|
+
let id = env.deferred.length;
|
|
1343
|
+
env.deferred.push({resolve, reject});
|
|
1344
|
+
env.setPointer(deferred, id);
|
|
1345
|
+
});
|
|
1346
|
+
return env.createValue(p, promise);
|
|
1347
|
+
},
|
|
1348
|
+
napi_resolve_deferred(env_id, deferred, resolution) {
|
|
1349
|
+
let env = environments[env_id];
|
|
1350
|
+
let { resolve } = env.deferred[deferred];
|
|
1351
|
+
let value = env.get(resolution);
|
|
1352
|
+
resolve(value);
|
|
1353
|
+
env.deferred[deferred] = undefined;
|
|
1354
|
+
return NAPI_OK;
|
|
1355
|
+
},
|
|
1356
|
+
napi_reject_deferred(env_id, deferred, rejection) {
|
|
1357
|
+
let env = environments[env_id];
|
|
1358
|
+
let { reject } = env.deferred[deferred];
|
|
1359
|
+
let value = env.get(rejection);
|
|
1360
|
+
reject(value);
|
|
1361
|
+
env.deferred[deferred] = undefined;
|
|
1362
|
+
return NAPI_OK;
|
|
1363
|
+
},
|
|
1364
|
+
napi_is_promise(env_id, value, result) {
|
|
1365
|
+
let env = environments[env_id];
|
|
1366
|
+
let val = env.get(value);
|
|
1367
|
+
env.memory[result] = val instanceof Promise ? 1 : 0;
|
|
1368
|
+
return NAPI_OK;
|
|
1369
|
+
},
|
|
1370
|
+
napi_run_script(env_id, script, result) {
|
|
1371
|
+
let env = environments[env_id];
|
|
1372
|
+
let source = env.get(script);
|
|
1373
|
+
let res = (0, eval)(source);
|
|
1374
|
+
return env.createValue(res, result);
|
|
1375
|
+
},
|
|
1376
|
+
napi_create_external(env_id, data, finalize_cb, finalize_hint, result) {
|
|
1377
|
+
let env = environments[env_id];
|
|
1378
|
+
let external = new ExternalValue;
|
|
1379
|
+
env.externalObjects.set(external, data);
|
|
1380
|
+
if (finalize_cb) {
|
|
1381
|
+
let cb = env.table.get(finalize_cb);
|
|
1382
|
+
finalizationRegistry.register(external, new FinalizeRecord(env_id, cb, finalize_hint, data));
|
|
1383
|
+
}
|
|
1384
|
+
return env.createValue(external, result);
|
|
1385
|
+
},
|
|
1386
|
+
napi_get_value_external(env_id, value, result) {
|
|
1387
|
+
let env = environments[env_id];
|
|
1388
|
+
let external = env.get(value);
|
|
1389
|
+
let val = env.externalObjects.get(external);
|
|
1390
|
+
if (!val) {
|
|
1391
|
+
return NAPI_INVALID_ARG;
|
|
1392
|
+
}
|
|
1393
|
+
return env.setPointer(result, val);
|
|
1394
|
+
},
|
|
1395
|
+
napi_adjust_external_memory() {
|
|
1396
|
+
return NAPI_OK;
|
|
1397
|
+
}
|
|
1398
|
+
};
|
|
1399
|
+
|
|
1400
|
+
function strlen(buf, ptr) {
|
|
1401
|
+
let len = 0;
|
|
1402
|
+
while (buf[ptr] !== 0) {
|
|
1403
|
+
len++;
|
|
1404
|
+
ptr++;
|
|
1405
|
+
}
|
|
1406
|
+
|
|
1407
|
+
return len;
|
|
1408
|
+
}
|
|
1409
|
+
|
|
1410
|
+
function utf8Length(string) {
|
|
1411
|
+
let len = 0;
|
|
1412
|
+
for (let i = 0; i < string.length; i++) {
|
|
1413
|
+
let c = string.charCodeAt(i);
|
|
1414
|
+
|
|
1415
|
+
if (c >= 0xd800 && c <= 0xdbff && i < string.length - 1) {
|
|
1416
|
+
let c2 = string.charCodeAt(++i);
|
|
1417
|
+
if ((c2 & 0xfc00) === 0xdc00) {
|
|
1418
|
+
c = ((c & 0x3ff) << 10) + (c2 & 0x3ff) + 0x10000;
|
|
1419
|
+
} else {
|
|
1420
|
+
// unmatched surrogate.
|
|
1421
|
+
i--;
|
|
1422
|
+
}
|
|
1423
|
+
}
|
|
1424
|
+
|
|
1425
|
+
if ((c & 0xffffff80) === 0) {
|
|
1426
|
+
len++;
|
|
1427
|
+
} else if ((c & 0xfffff800) === 0) {
|
|
1428
|
+
len += 2;
|
|
1429
|
+
} else if ((c & 0xffff0000) === 0) {
|
|
1430
|
+
len += 3;
|
|
1431
|
+
} else if ((c & 0xffe00000) === 0) {
|
|
1432
|
+
len += 4;
|
|
1433
|
+
}
|
|
1434
|
+
}
|
|
1435
|
+
return len;
|
|
1436
|
+
}
|