@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/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
- Int8Array,
22
- Uint8Array,
23
- Uint8ClampedArray,
24
- Int16Array,
25
- Uint16Array,
26
- Int32Array,
27
- Uint32Array,
28
- Float32Array,
29
- Float64Array,
30
- BigInt64Array,
31
- BigUint64Array
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
- 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
- }
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
- 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
- }
78
+
79
+ destroy() {
80
+ environments[this.id] = undefined;
101
81
  }
102
82
 
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;
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
- let id = this.pushValue(value, scope);
137
- this.setPointer(result, id);
138
- return NAPI_OK;
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
- setPointer(ptr, value) {
142
- this.u32[ptr >> 2] = value;
143
- return NAPI_OK;
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
- _u32 = new Uint32Array();
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
- return this._u32;
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
- _i32 = new Int32Array();
156
- get i32() {
157
- if (this._i32.byteLength === 0) {
158
- this._i32 = new Int32Array(this.instance.exports.memory.buffer);
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
- return this._i32;
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
- _u16 = new Uint16Array();
165
- get u16() {
166
- if (this._u16.byteLength === 0) {
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
- return this._u16;
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
- _u64 = new BigUint64Array();
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
- return this._u64;
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
- _i64 = new BigInt64Array();
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
- return this._i64;
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
- _f64 = new Float64Array();
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
- return this._f64;
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
- _buf = new Uint8Array();
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
- return this._buf;
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
- 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;
189
+ return this._i64;
214
190
  }
215
191
 
216
- if (buf instanceof ArrayBuffer) {
217
- let b = this.copyBuffer(new Uint8Array(buf));
218
- this.setPointer(ptr, b.byteOffset);
219
- return b.byteLength;
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
- // 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;
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
- 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
- });
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
- 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;
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
- 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;
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
- return descriptor;
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("utf-8", { ignoreBOM: true, fatal: true });
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
- constructor(env, finalize, hint, data) {
326
- this.env = env;
327
- this.finalize = finalize;
328
- this.hint = hint;
329
- this.data = data;
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
- if (buffer.finalize) {
335
- buffer.finalize(buffer.env, buffer.data, buffer.hint);
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
- 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
- }
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
- 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
- }
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
- 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
- }
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
- 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
- }
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
- 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
- }
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
- let count = env.u32[word_count >> 2];
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
- if (sign_bit) {
703
- env.i32[sign_bit] = val < 0n ? 1 : 0;
704
- }
702
+ let count = env.u32[word_count >> 2];
705
703
 
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
- }
704
+ if (sign_bit) {
705
+ env.i32[sign_bit] = val < 0n ? 1 : 0;
706
+ }
720
707
 
721
- while (val > 0n) {
722
- i++;
723
- val >>= 64n;
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
- 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
- }
723
+ while (val > 0n) {
724
+ i++;
725
+ val >>= 64n;
726
+ }
801
727
 
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
- }
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
- 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
- }
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
- 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
- }
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
- // 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
- }
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
- // 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
- }
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
- 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
- }
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
- if (result) {
1302
- return napi.napi_create_reference(env_id, js_object, 1, result);
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
- 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
- }
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
- 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
- }
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
- let len = 0;
1402
- while (buf[ptr] !== 0) {
1403
- len++;
1404
- ptr++;
1405
- }
1416
+ let len = 0;
1417
+ while (buf[ptr] !== 0) {
1418
+ len++;
1419
+ ptr++;
1420
+ }
1406
1421
 
1407
- return len;
1422
+ return len;
1408
1423
  }
1409
1424
 
1410
1425
  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
- }
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
- 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;
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
  }