Skip to content

Commit a1434b2

Browse files
authored
Use DataView in bindings generation (#2599)
1 parent 7a35ff8 commit a1434b2

17 files changed

+3797
-1218
lines changed

Diff for: src/bindings/js.ts

+252-132
Large diffs are not rendered by default.

Diff for: tests/compiler/bindings/esm.debug.d.ts

+9-2
Original file line numberDiff line numberDiff line change
@@ -118,13 +118,20 @@ export declare function staticarrayI64(a: ArrayLike<bigint>): ArrayLike<bigint>;
118118
* @returns `~lib/array/Array<i32>`
119119
*/
120120
export declare function arrayFunction(a: Array<number>, b: Array<number>): Array<number>;
121+
/**
122+
* bindings/esm/arrayOfStringsFunction
123+
* @param a `~lib/array/Array<~lib/string/String>`
124+
* @param b `~lib/array/Array<~lib/string/String>`
125+
* @returns `~lib/array/Array<~lib/string/String>`
126+
*/
127+
export declare function arrayOfStringsFunction(a: Array<string>, b: Array<string>): Array<string>;
121128
/**
122129
* bindings/esm/objectFunction
123130
* @param a `bindings/esm/PlainObject`
124131
* @param b `bindings/esm/PlainObject`
125132
* @returns `bindings/esm/PlainObject`
126133
*/
127-
export declare function objectFunction(a: __Record12<undefined>, b: __Record12<undefined>): __Record12<never>;
134+
export declare function objectFunction(a: __Record13<undefined>, b: __Record13<undefined>): __Record13<never>;
128135
/**
129136
* bindings/esm/newInternref
130137
* @returns `bindings/esm/NonPlainObject`
@@ -149,7 +156,7 @@ export declare const fn: {
149156
get value(): __Internref4
150157
};
151158
/** bindings/esm/PlainObject */
152-
declare interface __Record12<TOmittable> {
159+
declare interface __Record13<TOmittable> {
153160
/** @type `i8` */
154161
a: number | TOmittable;
155162
/** @type `i16` */

Diff for: tests/compiler/bindings/esm.debug.js

+201-68
Original file line numberDiff line numberDiff line change
@@ -137,40 +137,50 @@ async function instantiate(module, imports = {}) {
137137
},
138138
staticarrayFunction(a, b) {
139139
// bindings/esm/staticarrayFunction(~lib/staticarray/StaticArray<i32>, ~lib/staticarray/StaticArray<i32>) => ~lib/staticarray/StaticArray<i32>
140-
a = __retain(__lowerStaticArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 8, 2, a, Int32Array) || __notnull());
141-
b = __lowerStaticArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 8, 2, b, Int32Array) || __notnull();
140+
a = __retain(__lowerStaticArray(__setU32, 8, 2, a, Int32Array) || __notnull());
141+
b = __lowerStaticArray(__setU32, 8, 2, b, Int32Array) || __notnull();
142142
try {
143-
return __liftStaticArray(pointer => new Int32Array(memory.buffer)[pointer >>> 2], 2, exports.staticarrayFunction(a, b) >>> 0);
143+
return __liftStaticArray(__getI32, 2, exports.staticarrayFunction(a, b) >>> 0);
144144
} finally {
145145
__release(a);
146146
}
147147
},
148148
staticarrayU16(a) {
149149
// bindings/esm/staticarrayU16(~lib/staticarray/StaticArray<u16>) => ~lib/staticarray/StaticArray<u16>
150-
a = __lowerStaticArray((pointer, value) => { new Uint16Array(memory.buffer)[pointer >>> 1] = value; }, 9, 1, a, Uint16Array) || __notnull();
151-
return __liftStaticArray(pointer => new Uint16Array(memory.buffer)[pointer >>> 1], 1, exports.staticarrayU16(a) >>> 0);
150+
a = __lowerStaticArray(__setU16, 9, 1, a, Uint16Array) || __notnull();
151+
return __liftStaticArray(__getU16, 1, exports.staticarrayU16(a) >>> 0);
152152
},
153153
staticarrayI64(a) {
154154
// bindings/esm/staticarrayI64(~lib/staticarray/StaticArray<i64>) => ~lib/staticarray/StaticArray<i64>
155-
a = __lowerStaticArray((pointer, value) => { new BigInt64Array(memory.buffer)[pointer >>> 3] = value || 0n; }, 10, 3, a, BigInt64Array) || __notnull();
156-
return __liftStaticArray(pointer => new BigInt64Array(memory.buffer)[pointer >>> 3], 3, exports.staticarrayI64(a) >>> 0);
155+
a = __lowerStaticArray(__setU64, 10, 3, a, BigInt64Array) || __notnull();
156+
return __liftStaticArray(__getI64, 3, exports.staticarrayI64(a) >>> 0);
157157
},
158158
arrayFunction(a, b) {
159159
// bindings/esm/arrayFunction(~lib/array/Array<i32>, ~lib/array/Array<i32>) => ~lib/array/Array<i32>
160-
a = __retain(__lowerArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 11, 2, a) || __notnull());
161-
b = __lowerArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 11, 2, b) || __notnull();
160+
a = __retain(__lowerArray(__setU32, 11, 2, a) || __notnull());
161+
b = __lowerArray(__setU32, 11, 2, b) || __notnull();
162162
try {
163-
return __liftArray(pointer => new Int32Array(memory.buffer)[pointer >>> 2], 2, exports.arrayFunction(a, b) >>> 0);
163+
return __liftArray(__getI32, 2, exports.arrayFunction(a, b) >>> 0);
164+
} finally {
165+
__release(a);
166+
}
167+
},
168+
arrayOfStringsFunction(a, b) {
169+
// bindings/esm/arrayOfStringsFunction(~lib/array/Array<~lib/string/String>, ~lib/array/Array<~lib/string/String>) => ~lib/array/Array<~lib/string/String>
170+
a = __retain(__lowerArray((pointer, value) => { __setU32(pointer, __lowerString(value) || __notnull()); }, 12, 2, a) || __notnull());
171+
b = __lowerArray((pointer, value) => { __setU32(pointer, __lowerString(value) || __notnull()); }, 12, 2, b) || __notnull();
172+
try {
173+
return __liftArray(pointer => __liftString(__getU32(pointer)), 2, exports.arrayOfStringsFunction(a, b) >>> 0);
164174
} finally {
165175
__release(a);
166176
}
167177
},
168178
objectFunction(a, b) {
169179
// bindings/esm/objectFunction(bindings/esm/PlainObject, bindings/esm/PlainObject) => bindings/esm/PlainObject
170-
a = __retain(__lowerRecord12(a) || __notnull());
171-
b = __lowerRecord12(b) || __notnull();
180+
a = __retain(__lowerRecord13(a) || __notnull());
181+
b = __lowerRecord13(b) || __notnull();
172182
try {
173-
return __liftRecord12(exports.objectFunction(a, b) >>> 0);
183+
return __liftRecord13(exports.objectFunction(a, b) >>> 0);
174184
} finally {
175185
__release(a);
176186
}
@@ -202,51 +212,51 @@ async function instantiate(module, imports = {}) {
202212
}
203213
},
204214
}, exports);
205-
function __lowerRecord12(value) {
215+
function __lowerRecord13(value) {
206216
// bindings/esm/PlainObject
207217
// Hint: Opt-out from lowering as a record by providing an empty constructor
208218
if (value == null) return 0;
209-
const pointer = exports.__pin(exports.__new(68, 12));
210-
new Int8Array(memory.buffer)[pointer + 0 >>> 0] = value.a;
211-
new Int16Array(memory.buffer)[pointer + 2 >>> 1] = value.b;
212-
new Int32Array(memory.buffer)[pointer + 4 >>> 2] = value.c;
213-
new BigInt64Array(memory.buffer)[pointer + 8 >>> 3] = value.d || 0n;
214-
new Uint8Array(memory.buffer)[pointer + 16 >>> 0] = value.e;
215-
new Uint16Array(memory.buffer)[pointer + 18 >>> 1] = value.f;
216-
new Uint32Array(memory.buffer)[pointer + 20 >>> 2] = value.g;
217-
new BigUint64Array(memory.buffer)[pointer + 24 >>> 3] = value.h || 0n;
218-
new Int32Array(memory.buffer)[pointer + 32 >>> 2] = value.i;
219-
new Uint32Array(memory.buffer)[pointer + 36 >>> 2] = value.j;
220-
new Uint8Array(memory.buffer)[pointer + 40 >>> 0] = value.k ? 1 : 0;
221-
new Float32Array(memory.buffer)[pointer + 44 >>> 2] = value.l;
222-
new Float64Array(memory.buffer)[pointer + 48 >>> 3] = value.m;
223-
__store_ref(pointer + 56, __lowerString(value.n));
224-
__store_ref(pointer + 60, __lowerTypedArray(Uint8Array, 13, 0, value.o));
225-
__store_ref(pointer + 64, __lowerArray((pointer, value) => { __store_ref(pointer, __lowerString(value) || __notnull()); }, 14, 2, value.p));
219+
const pointer = exports.__pin(exports.__new(68, 13));
220+
__setU8(pointer + 0, value.a);
221+
__setU16(pointer + 2, value.b);
222+
__setU32(pointer + 4, value.c);
223+
__setU64(pointer + 8, value.d || 0n);
224+
__setU8(pointer + 16, value.e);
225+
__setU16(pointer + 18, value.f);
226+
__setU32(pointer + 20, value.g);
227+
__setU64(pointer + 24, value.h || 0n);
228+
__setU32(pointer + 32, value.i);
229+
__setU32(pointer + 36, value.j);
230+
__setU8(pointer + 40, value.k ? 1 : 0);
231+
__setF32(pointer + 44, value.l);
232+
__setF64(pointer + 48, value.m);
233+
__setU32(pointer + 56, __lowerString(value.n));
234+
__setU32(pointer + 60, __lowerTypedArray(Uint8Array, 14, 0, value.o));
235+
__setU32(pointer + 64, __lowerArray((pointer, value) => { __setU32(pointer, __lowerString(value) || __notnull()); }, 12, 2, value.p));
226236
exports.__unpin(pointer);
227237
return pointer;
228238
}
229-
function __liftRecord12(pointer) {
239+
function __liftRecord13(pointer) {
230240
// bindings/esm/PlainObject
231241
// Hint: Opt-out from lifting as a record by providing an empty constructor
232242
if (!pointer) return null;
233243
return {
234-
a: new Int8Array(memory.buffer)[pointer + 0 >>> 0],
235-
b: new Int16Array(memory.buffer)[pointer + 2 >>> 1],
236-
c: new Int32Array(memory.buffer)[pointer + 4 >>> 2],
237-
d: new BigInt64Array(memory.buffer)[pointer + 8 >>> 3],
238-
e: new Uint8Array(memory.buffer)[pointer + 16 >>> 0],
239-
f: new Uint16Array(memory.buffer)[pointer + 18 >>> 1],
240-
g: new Uint32Array(memory.buffer)[pointer + 20 >>> 2],
241-
h: new BigUint64Array(memory.buffer)[pointer + 24 >>> 3],
242-
i: new Int32Array(memory.buffer)[pointer + 32 >>> 2],
243-
j: new Uint32Array(memory.buffer)[pointer + 36 >>> 2],
244-
k: new Uint8Array(memory.buffer)[pointer + 40 >>> 0] != 0,
245-
l: new Float32Array(memory.buffer)[pointer + 44 >>> 2],
246-
m: new Float64Array(memory.buffer)[pointer + 48 >>> 3],
247-
n: __liftString(new Uint32Array(memory.buffer)[pointer + 56 >>> 2]),
248-
o: __liftTypedArray(Uint8Array, new Uint32Array(memory.buffer)[pointer + 60 >>> 2]),
249-
p: __liftArray(pointer => __liftString(new Uint32Array(memory.buffer)[pointer >>> 2]), 2, new Uint32Array(memory.buffer)[pointer + 64 >>> 2]),
244+
a: __getI8(pointer + 0),
245+
b: __getI16(pointer + 2),
246+
c: __getI32(pointer + 4),
247+
d: __getI64(pointer + 8),
248+
e: __getU8(pointer + 16),
249+
f: __getU16(pointer + 18),
250+
g: __getU32(pointer + 20),
251+
h: __getU64(pointer + 24),
252+
i: __getI32(pointer + 32),
253+
j: __getU32(pointer + 36),
254+
k: __getU8(pointer + 40) != 0,
255+
l: __getF32(pointer + 44),
256+
m: __getF64(pointer + 48),
257+
n: __liftString(__getU32(pointer + 56)),
258+
o: __liftTypedArray(Uint8Array, __getU32(pointer + 60)),
259+
p: __liftArray(pointer => __liftString(__getU32(pointer)), 2, __getU32(pointer + 64)),
250260
};
251261
}
252262
function __liftBuffer(pointer) {
@@ -282,9 +292,8 @@ async function instantiate(module, imports = {}) {
282292
function __liftArray(liftElement, align, pointer) {
283293
if (!pointer) return null;
284294
const
285-
memoryU32 = new Uint32Array(memory.buffer),
286-
dataStart = memoryU32[pointer + 4 >>> 2],
287-
length = memoryU32[pointer + 12 >>> 2],
295+
dataStart = __getU32(pointer + 4),
296+
length = __dataview.getUint32(pointer + 12, true),
288297
values = new Array(length);
289298
for (let i = 0; i < length; ++i) values[i] = liftElement(dataStart + (i << align >>> 0));
290299
return values;
@@ -294,44 +303,41 @@ async function instantiate(module, imports = {}) {
294303
const
295304
length = values.length,
296305
buffer = exports.__pin(exports.__new(length << align, 1)) >>> 0,
297-
header = exports.__pin(exports.__new(16, id)) >>> 0,
298-
memoryU32 = new Uint32Array(memory.buffer);
299-
memoryU32[header + 0 >>> 2] = buffer;
300-
memoryU32[header + 4 >>> 2] = buffer;
301-
memoryU32[header + 8 >>> 2] = length << align;
302-
memoryU32[header + 12 >>> 2] = length;
306+
header = exports.__pin(exports.__new(16, id)) >>> 0;
307+
__setU32(header + 0, buffer);
308+
__dataview.setUint32(header + 4, buffer, true);
309+
__dataview.setUint32(header + 8, length << align, true);
310+
__dataview.setUint32(header + 12, length, true);
303311
for (let i = 0; i < length; ++i) lowerElement(buffer + (i << align >>> 0), values[i]);
304312
exports.__unpin(buffer);
305313
exports.__unpin(header);
306314
return header;
307315
}
308316
function __liftTypedArray(constructor, pointer) {
309317
if (!pointer) return null;
310-
const memoryU32 = new Uint32Array(memory.buffer);
311318
return new constructor(
312319
memory.buffer,
313-
memoryU32[pointer + 4 >>> 2],
314-
memoryU32[pointer + 8 >>> 2] / constructor.BYTES_PER_ELEMENT
320+
__getU32(pointer + 4),
321+
__dataview.getUint32(pointer + 8, true) / constructor.BYTES_PER_ELEMENT
315322
).slice();
316323
}
317324
function __lowerTypedArray(constructor, id, align, values) {
318325
if (values == null) return 0;
319326
const
320327
length = values.length,
321328
buffer = exports.__pin(exports.__new(length << align, 1)) >>> 0,
322-
header = exports.__new(12, id) >>> 0,
323-
memoryU32 = new Uint32Array(memory.buffer);
324-
memoryU32[header + 0 >>> 2] = buffer;
325-
memoryU32[header + 4 >>> 2] = buffer;
326-
memoryU32[header + 8 >>> 2] = length << align;
329+
header = exports.__new(12, id) >>> 0;
330+
__setU32(header + 0, buffer);
331+
__dataview.setUint32(header + 4, buffer, true);
332+
__dataview.setUint32(header + 8, length << align, true);
327333
new constructor(memory.buffer, buffer, length).set(values);
328334
exports.__unpin(buffer);
329335
return header;
330336
}
331337
function __liftStaticArray(liftElement, align, pointer) {
332338
if (!pointer) return null;
333339
const
334-
length = new Uint32Array(memory.buffer)[pointer - 4 >>> 2] >>> align,
340+
length = __getU32(pointer - 4) >>> align,
335341
values = new Array(length);
336342
for (let i = 0; i < length; ++i) values[i] = liftElement(pointer + (i << align >>> 0));
337343
return values;
@@ -382,8 +388,134 @@ async function instantiate(module, imports = {}) {
382388
function __notnull() {
383389
throw TypeError("value must not be null");
384390
}
385-
function __store_ref(pointer, value) {
386-
new Uint32Array(memory.buffer)[pointer >>> 2] = value;
391+
let __dataview = new DataView(memory.buffer);
392+
function __setU8(pointer, value) {
393+
try {
394+
__dataview.setUint8(pointer, value, true);
395+
} catch {
396+
__dataview = new DataView(memory.buffer);
397+
__dataview.setUint8(pointer, value, true);
398+
}
399+
}
400+
function __setU16(pointer, value) {
401+
try {
402+
__dataview.setUint16(pointer, value, true);
403+
} catch {
404+
__dataview = new DataView(memory.buffer);
405+
__dataview.setUint16(pointer, value, true);
406+
}
407+
}
408+
function __setU32(pointer, value) {
409+
try {
410+
__dataview.setUint32(pointer, value, true);
411+
} catch {
412+
__dataview = new DataView(memory.buffer);
413+
__dataview.setUint32(pointer, value, true);
414+
}
415+
}
416+
function __setU64(pointer, value) {
417+
try {
418+
__dataview.setBigUint64(pointer, value, true);
419+
} catch {
420+
__dataview = new DataView(memory.buffer);
421+
__dataview.setBigUint64(pointer, value, true);
422+
}
423+
}
424+
function __setF32(pointer, value) {
425+
try {
426+
__dataview.setFloat32(pointer, value, true);
427+
} catch {
428+
__dataview = new DataView(memory.buffer);
429+
__dataview.setFloat32(pointer, value, true);
430+
}
431+
}
432+
function __setF64(pointer, value) {
433+
try {
434+
__dataview.setFloat64(pointer, value, true);
435+
} catch {
436+
__dataview = new DataView(memory.buffer);
437+
__dataview.setFloat64(pointer, value, true);
438+
}
439+
}
440+
function __getI8(pointer) {
441+
try {
442+
return __dataview.getInt8(pointer, true);
443+
} catch {
444+
__dataview = new DataView(memory.buffer);
445+
return __dataview.getInt8(pointer, true);
446+
}
447+
}
448+
function __getU8(pointer) {
449+
try {
450+
return __dataview.getUint8(pointer, true);
451+
} catch {
452+
__dataview = new DataView(memory.buffer);
453+
return __dataview.getUint8(pointer, true);
454+
}
455+
}
456+
function __getI16(pointer) {
457+
try {
458+
return __dataview.getInt16(pointer, true);
459+
} catch {
460+
__dataview = new DataView(memory.buffer);
461+
return __dataview.getInt16(pointer, true);
462+
}
463+
}
464+
function __getU16(pointer) {
465+
try {
466+
return __dataview.getUint16(pointer, true);
467+
} catch {
468+
__dataview = new DataView(memory.buffer);
469+
return __dataview.getUint16(pointer, true);
470+
}
471+
}
472+
function __getI32(pointer) {
473+
try {
474+
return __dataview.getInt32(pointer, true);
475+
} catch {
476+
__dataview = new DataView(memory.buffer);
477+
return __dataview.getInt32(pointer, true);
478+
}
479+
}
480+
function __getU32(pointer) {
481+
try {
482+
return __dataview.getUint32(pointer, true);
483+
} catch {
484+
__dataview = new DataView(memory.buffer);
485+
return __dataview.getUint32(pointer, true);
486+
}
487+
}
488+
function __getI64(pointer) {
489+
try {
490+
return __dataview.getBigInt64(pointer, true);
491+
} catch {
492+
__dataview = new DataView(memory.buffer);
493+
return __dataview.getBigInt64(pointer, true);
494+
}
495+
}
496+
function __getU64(pointer) {
497+
try {
498+
return __dataview.getBigUint64(pointer, true);
499+
} catch {
500+
__dataview = new DataView(memory.buffer);
501+
return __dataview.getBigUint64(pointer, true);
502+
}
503+
}
504+
function __getF32(pointer) {
505+
try {
506+
return __dataview.getFloat32(pointer, true);
507+
} catch {
508+
__dataview = new DataView(memory.buffer);
509+
return __dataview.getFloat32(pointer, true);
510+
}
511+
}
512+
function __getF64(pointer) {
513+
try {
514+
return __dataview.getFloat64(pointer, true);
515+
} catch {
516+
__dataview = new DataView(memory.buffer);
517+
return __dataview.getFloat64(pointer, true);
518+
}
387519
}
388520
exports._start();
389521
return adaptedExports;
@@ -408,6 +540,7 @@ export const {
408540
staticarrayU16,
409541
staticarrayI64,
410542
arrayFunction,
543+
arrayOfStringsFunction,
411544
objectFunction,
412545
newInternref,
413546
internrefFunction,

0 commit comments

Comments
 (0)