diff --git a/src/bindings/js.ts b/src/bindings/js.ts index 43833f0283..1dae4fde8b 100644 --- a/src/bindings/js.ts +++ b/src/bindings/js.ts @@ -784,12 +784,16 @@ export class JSBuilder extends ExportsWalker { `); } if (this.needsLowerStaticArray) { - sb.push(` function __lowerStaticArray(lowerElement, id, align, values) { + sb.push(` function __lowerStaticArray(lowerElement, id, align, values, typedConstructor) { if (values == null) return 0; const length = values.length, buffer = exports.__pin(exports.__new(length << align, id)) >>> 0; - for (let i = 0; i < length; i++) lowerElement(buffer + (i << align >>> 0), values[i]); + if (typedConstructor) { + new typedConstructor(memory.buffer, buffer, length).set(values); + } else { + for (let i = 0; i < length; i++) lowerElement(buffer + (i << align >>> 0), values[i]); + } exports.__unpin(buffer); return buffer; } @@ -1051,7 +1055,7 @@ export class JSBuilder extends ExportsWalker { sb.push(", "); sb.push(clazz.id.toString()); sb.push(", "); - sb.push(clazz.getArrayValueType().alignLog2.toString()); + sb.push(valueType.alignLog2.toString()); sb.push(", "); this.needsLowerStaticArray = true; } else if (clazz.extends(this.program.arrayBufferViewInstance.prototype)) { @@ -1086,6 +1090,37 @@ export class JSBuilder extends ExportsWalker { this.needsLowerInternref = true; } sb.push(name); + if (clazz.extends(this.program.staticArrayPrototype)) { + // optional last argument for __lowerStaticArray + let valueType = clazz.getArrayValueType(); + if (valueType.isNumericValue) { + sb.push(", "); + if (valueType == Type.u8 || valueType == Type.bool) { + sb.push("Uint8Array"); + } else if (valueType == Type.i8) { + sb.push("Int8Array"); + } else if (valueType == Type.u16) { + sb.push("Uint16Array"); + } else if (valueType == Type.i16) { + sb.push("Int16Array"); + } else if (valueType == Type.u32) { + sb.push("Uint32Array"); + } else if (valueType == Type.i32) { + sb.push("Int32Array"); + } else if (valueType == Type.u64) { + sb.push("BigUint64Array"); + } else if (valueType == Type.i64) { + sb.push("BigInt64Array"); + } else if (valueType == Type.f32) { + sb.push("Float32Array"); + } else if (valueType == Type.f64) { + sb.push("Float64Array"); + } else { + // unreachable + assert(false); + } + } + } sb.push(")"); if (!type.is(TypeFlags.NULLABLE)) { this.needsNotNull = true; diff --git a/src/bindings/tsd.ts b/src/bindings/tsd.ts index 6eafb57908..59b3362954 100644 --- a/src/bindings/tsd.ts +++ b/src/bindings/tsd.ts @@ -253,14 +253,16 @@ export class TSDBuilder extends ExportsWalker { sb.push("ArrayBuffer"); } else if (clazz.extends(this.program.stringInstance.prototype)) { sb.push("string"); - } else if ( - clazz.extends(this.program.arrayPrototype) || - clazz.extends(this.program.staticArrayPrototype) - ) { + } else if (clazz.extends(this.program.arrayPrototype)) { const valueType = clazz.getArrayValueType(); sb.push("Array<"); sb.push(this.toTypeScriptType(valueType, mode)); sb.push(">"); + } else if (clazz.extends(this.program.staticArrayPrototype)) { + const valueType = clazz.getArrayValueType(); + sb.push("ArrayLike<"); + sb.push(this.toTypeScriptType(valueType, mode)); + sb.push(">"); } else if (clazz.extends(this.program.arrayBufferViewInstance.prototype)) { const valueType = clazz.getArrayValueType(); if (valueType == Type.i8) { diff --git a/tests/compiler/bindings/esm.debug.d.ts b/tests/compiler/bindings/esm.debug.d.ts index 0bd3b0a5d1..d4b27a1ee2 100644 --- a/tests/compiler/bindings/esm.debug.d.ts +++ b/tests/compiler/bindings/esm.debug.d.ts @@ -98,7 +98,19 @@ export declare function typedarrayFunction(a: Int16Array, b: Float32Array): BigU * @param b `~lib/staticarray/StaticArray` * @returns `~lib/staticarray/StaticArray` */ -export declare function staticarrayFunction(a: Array, b: Array): Array; +export declare function staticarrayFunction(a: ArrayLike, b: ArrayLike): ArrayLike; +/** + * bindings/esm/staticarrayU16 + * @param a `~lib/staticarray/StaticArray` + * @returns `~lib/staticarray/StaticArray` + */ +export declare function staticarrayU16(a: ArrayLike): ArrayLike; +/** + * bindings/esm/staticarrayI64 + * @param a `~lib/staticarray/StaticArray` + * @returns `~lib/staticarray/StaticArray` + */ +export declare function staticarrayI64(a: ArrayLike): ArrayLike; /** * bindings/esm/arrayFunction * @param a `~lib/array/Array` @@ -112,21 +124,21 @@ export declare function arrayFunction(a: Array, b: Array): Array * @param b `bindings/esm/PlainObject` * @returns `bindings/esm/PlainObject` */ -export declare function objectFunction(a: __Record8, b: __Record8): __Record8; +export declare function objectFunction(a: __Record10, b: __Record10): __Record10; /** * bindings/esm/newInternref * @returns `bindings/esm/NonPlainObject` */ -export declare function newInternref(): __Internref11; +export declare function newInternref(): __Internref13; /** * bindings/esm/internrefFunction * @param a `bindings/esm/NonPlainObject` * @param b `bindings/esm/NonPlainObject` * @returns `bindings/esm/NonPlainObject` */ -export declare function internrefFunction(a: __Internref11, b: __Internref11): __Internref11; +export declare function internrefFunction(a: __Internref13, b: __Internref13): __Internref13; /** bindings/esm/PlainObject */ -declare interface __Record8 { +declare interface __Record10 { /** @type `i8` */ a: number | TOmittable; /** @type `i16` */ @@ -161,6 +173,6 @@ declare interface __Record8 { p: Array | null | TOmittable; } /** bindings/esm/NonPlainObject */ -declare class __Internref11 extends Number { - private __nominal11: symbol; +declare class __Internref13 extends Number { + private __nominal13: symbol; } diff --git a/tests/compiler/bindings/esm.debug.js b/tests/compiler/bindings/esm.debug.js index e1dce5ef83..fdc6303178 100644 --- a/tests/compiler/bindings/esm.debug.js +++ b/tests/compiler/bindings/esm.debug.js @@ -137,18 +137,28 @@ async function instantiate(module, imports = {}) { }, staticarrayFunction(a, b) { // bindings/esm/staticarrayFunction(~lib/staticarray/StaticArray, ~lib/staticarray/StaticArray) => ~lib/staticarray/StaticArray - a = __retain(__lowerStaticArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 6, 2, a) || __notnull()); - b = __lowerStaticArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 6, 2, b) || __notnull(); + a = __retain(__lowerStaticArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 6, 2, a, Int32Array) || __notnull()); + b = __lowerStaticArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 6, 2, b, Int32Array) || __notnull(); try { return __liftStaticArray(pointer => new Int32Array(memory.buffer)[pointer >>> 2], 2, exports.staticarrayFunction(a, b) >>> 0); } finally { __release(a); } }, + staticarrayU16(a) { + // bindings/esm/staticarrayU16(~lib/staticarray/StaticArray) => ~lib/staticarray/StaticArray + a = __lowerStaticArray((pointer, value) => { new Uint16Array(memory.buffer)[pointer >>> 1] = value; }, 7, 1, a, Uint16Array) || __notnull(); + return __liftStaticArray(pointer => new Uint16Array(memory.buffer)[pointer >>> 1], 1, exports.staticarrayU16(a) >>> 0); + }, + staticarrayI64(a) { + // bindings/esm/staticarrayI64(~lib/staticarray/StaticArray) => ~lib/staticarray/StaticArray + a = __lowerStaticArray((pointer, value) => { new BigInt64Array(memory.buffer)[pointer >>> 3] = value || 0n; }, 8, 3, a, BigInt64Array) || __notnull(); + return __liftStaticArray(pointer => new BigInt64Array(memory.buffer)[pointer >>> 3], 3, exports.staticarrayI64(a) >>> 0); + }, arrayFunction(a, b) { // bindings/esm/arrayFunction(~lib/array/Array, ~lib/array/Array) => ~lib/array/Array - a = __retain(__lowerArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 7, 2, a) || __notnull()); - b = __lowerArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 7, 2, b) || __notnull(); + a = __retain(__lowerArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 9, 2, a) || __notnull()); + b = __lowerArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 9, 2, b) || __notnull(); try { return __liftArray(pointer => new Int32Array(memory.buffer)[pointer >>> 2], 2, exports.arrayFunction(a, b) >>> 0); } finally { @@ -157,10 +167,10 @@ async function instantiate(module, imports = {}) { }, objectFunction(a, b) { // bindings/esm/objectFunction(bindings/esm/PlainObject, bindings/esm/PlainObject) => bindings/esm/PlainObject - a = __retain(__lowerRecord8(a) || __notnull()); - b = __lowerRecord8(b) || __notnull(); + a = __retain(__lowerRecord10(a) || __notnull()); + b = __lowerRecord10(b) || __notnull(); try { - return __liftRecord8(exports.objectFunction(a, b) >>> 0); + return __liftRecord10(exports.objectFunction(a, b) >>> 0); } finally { __release(a); } @@ -180,11 +190,11 @@ async function instantiate(module, imports = {}) { } }, }, exports); - function __lowerRecord8(value) { + function __lowerRecord10(value) { // bindings/esm/PlainObject // Hint: Opt-out from lowering as a record by providing an empty constructor if (value == null) return 0; - const pointer = exports.__pin(exports.__new(68, 8)); + const pointer = exports.__pin(exports.__new(68, 10)); new Int8Array(memory.buffer)[pointer + 0 >>> 0] = value.a; new Int16Array(memory.buffer)[pointer + 2 >>> 1] = value.b; new Int32Array(memory.buffer)[pointer + 4 >>> 2] = value.c; @@ -199,12 +209,12 @@ async function instantiate(module, imports = {}) { new Float32Array(memory.buffer)[pointer + 44 >>> 2] = value.l; new Float64Array(memory.buffer)[pointer + 48 >>> 3] = value.m; new Uint32Array(memory.buffer)[pointer + 56 >>> 2] = __lowerString(value.n); - new Uint32Array(memory.buffer)[pointer + 60 >>> 2] = __lowerTypedArray(Uint8Array, 9, 0, value.o); - new Uint32Array(memory.buffer)[pointer + 64 >>> 2] = __lowerArray((pointer, value) => { new Uint32Array(memory.buffer)[pointer >>> 2] = __lowerString(value) || __notnull(); }, 10, 2, value.p); + new Uint32Array(memory.buffer)[pointer + 60 >>> 2] = __lowerTypedArray(Uint8Array, 11, 0, value.o); + new Uint32Array(memory.buffer)[pointer + 64 >>> 2] = __lowerArray((pointer, value) => { new Uint32Array(memory.buffer)[pointer >>> 2] = __lowerString(value) || __notnull(); }, 12, 2, value.p); exports.__unpin(pointer); return pointer; } - function __liftRecord8(pointer) { + function __liftRecord10(pointer) { // bindings/esm/PlainObject // Hint: Opt-out from lifting as a record by providing an empty constructor if (!pointer) return null; @@ -314,12 +324,16 @@ async function instantiate(module, imports = {}) { for (let i = 0; i < length; ++i) values[i] = liftElement(pointer + (i << align >>> 0)); return values; } - function __lowerStaticArray(lowerElement, id, align, values) { + function __lowerStaticArray(lowerElement, id, align, values, typedConstructor) { if (values == null) return 0; const length = values.length, buffer = exports.__pin(exports.__new(length << align, id)) >>> 0; - for (let i = 0; i < length; i++) lowerElement(buffer + (i << align >>> 0), values[i]); + if (typedConstructor) { + new typedConstructor(memory.buffer, buffer, length).set(values); + } else { + for (let i = 0; i < length; i++) lowerElement(buffer + (i << align >>> 0), values[i]); + } exports.__unpin(buffer); return buffer; } @@ -376,6 +390,8 @@ export const { stringFunctionOptional, typedarrayFunction, staticarrayFunction, + staticarrayU16, + staticarrayI64, arrayFunction, objectFunction, newInternref, diff --git a/tests/compiler/bindings/esm.debug.wat b/tests/compiler/bindings/esm.debug.wat index f045953ecc..659e4f2005 100644 --- a/tests/compiler/bindings/esm.debug.wat +++ b/tests/compiler/bindings/esm.debug.wat @@ -54,9 +54,9 @@ (global $~lib/native/ASC_RUNTIME i32 (i32.const 2)) (global $~argumentsLength (mut i32) (i32.const 0)) (global $~lib/rt/__rtti_base i32 (i32.const 1024)) - (global $~lib/memory/__data_end i32 (i32.const 1124)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17508)) - (global $~lib/memory/__heap_base i32 (i32.const 17508)) + (global $~lib/memory/__data_end i32 (i32.const 1140)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17524)) + (global $~lib/memory/__heap_base i32 (i32.const 17524)) (global $~started (mut i32) (i32.const 0)) (memory $0 1) (data (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00a\00\00\00\00\00\00\00\00\00\00\00") @@ -79,7 +79,7 @@ (data (i32.const 844) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00\00\00") (data (i32.const 892) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00*\00\00\00O\00b\00j\00e\00c\00t\00 \00a\00l\00r\00e\00a\00d\00y\00 \00p\00i\00n\00n\00e\00d\00\00\00") (data (i32.const 956) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00(\00\00\00O\00b\00j\00e\00c\00t\00 \00i\00s\00 \00n\00o\00t\00 \00p\00i\00n\00n\00e\00d\00\00\00\00\00") - (data (i32.const 1024) "\0c\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\81\08\00\00\02\00\00\00\01\19\00\00\02\00\00\00\01\02\00\00\02\00\00\00$\t\00\00\00\00\00\00\02\t\00\00\00\00\00\00\00\00\00\00\00\00\00\00A\00\00\00\02\00\00\00\02A\00\00\00\00\00\00 \00\00\00\00\00\00\00") + (data (i32.const 1024) "\0e\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\81\08\00\00\02\00\00\00\01\19\00\00\02\00\00\00\01\02\00\00\02\00\00\00$\t\00\00\00\00\00\00\a4\00\00\00\00\00\00\00$\n\00\00\00\00\00\00\02\t\00\00\00\00\00\00\00\00\00\00\00\00\00\00A\00\00\00\02\00\00\00\02A\00\00\00\00\00\00 \00\00\00\00\00\00\00") (table $0 1 1 funcref) (elem $0 (i32.const 1)) (export "plainGlobal" (global $bindings/esm/plainGlobal)) @@ -110,6 +110,8 @@ (export "stringFunctionOptional" (func $export:bindings/esm/stringFunctionOptional@varargs)) (export "typedarrayFunction" (func $export:bindings/esm/typedarrayFunction)) (export "staticarrayFunction" (func $export:bindings/esm/staticarrayFunction)) + (export "staticarrayU16" (func $export:bindings/esm/staticarrayU16)) + (export "staticarrayI64" (func $export:bindings/esm/staticarrayI64)) (export "arrayFunction" (func $export:bindings/esm/arrayFunction)) (export "objectFunction" (func $export:bindings/esm/objectFunction)) (export "internrefFunction" (func $export:bindings/esm/internrefFunction)) @@ -2461,6 +2463,12 @@ local.get $2 call $~lib/staticarray/StaticArray#__uset ) + (func $bindings/esm/staticarrayU16 (param $0 i32) (result i32) + local.get $0 + ) + (func $bindings/esm/staticarrayI64 (param $0 i32) (result i32) + local.get $0 + ) (func $~lib/array/Array#set:buffer (param $0 i32) (param $1 i32) local.get $0 local.get $1 @@ -3075,41 +3083,47 @@ block $~lib/typedarray/Uint8Array block $bindings/esm/PlainObject block $~lib/array/Array - block $~lib/staticarray/StaticArray - block $~lib/typedarray/Uint64Array - block $~lib/typedarray/Float32Array - block $~lib/typedarray/Int16Array - block $~lib/arraybuffer/ArrayBufferView - block $~lib/string/String - block $~lib/arraybuffer/ArrayBuffer - local.get $0 - i32.const 8 - i32.sub - i32.load - br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $~lib/typedarray/Int16Array $~lib/typedarray/Float32Array $~lib/typedarray/Uint64Array $~lib/staticarray/StaticArray $~lib/array/Array $bindings/esm/PlainObject $~lib/typedarray/Uint8Array $~lib/array/Array<~lib/string/String> $bindings/esm/NonPlainObject $invalid + block $~lib/staticarray/StaticArray + block $~lib/staticarray/StaticArray + block $~lib/staticarray/StaticArray + block $~lib/typedarray/Uint64Array + block $~lib/typedarray/Float32Array + block $~lib/typedarray/Int16Array + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $~lib/typedarray/Int16Array $~lib/typedarray/Float32Array $~lib/typedarray/Uint64Array $~lib/staticarray/StaticArray $~lib/staticarray/StaticArray $~lib/staticarray/StaticArray $~lib/array/Array $bindings/esm/PlainObject $~lib/typedarray/Uint8Array $~lib/array/Array<~lib/string/String> $bindings/esm/NonPlainObject $invalid + end + return + end + return end + local.get $0 + local.get $1 + call $~lib/arraybuffer/ArrayBufferView~visit return end + local.get $0 + local.get $1 + call $~lib/typedarray/Int16Array~visit return end local.get $0 local.get $1 - call $~lib/arraybuffer/ArrayBufferView~visit + call $~lib/typedarray/Float32Array~visit return end local.get $0 local.get $1 - call $~lib/typedarray/Int16Array~visit + call $~lib/typedarray/Uint64Array~visit return end - local.get $0 - local.get $1 - call $~lib/typedarray/Float32Array~visit return end - local.get $0 - local.get $1 - call $~lib/typedarray/Uint64Array~visit return end return @@ -3173,8 +3187,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 17536 - i32.const 17584 + i32.const 17552 + i32.const 17600 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3746,7 +3760,7 @@ if global.get $~lib/memory/__stack_pointer i32.const 16 - i32.const 7 + i32.const 9 call $~lib/rt/itcms/__new local.tee $0 i32.store @@ -3912,7 +3926,7 @@ if global.get $~lib/memory/__stack_pointer i32.const 68 - i32.const 8 + i32.const 10 call $~lib/rt/itcms/__new local.tee $0 i32.store @@ -4026,7 +4040,7 @@ if global.get $~lib/memory/__stack_pointer i32.const 0 - i32.const 11 + i32.const 13 call $~lib/rt/itcms/__new local.tee $0 i32.store @@ -4154,6 +4168,44 @@ global.set $~lib/memory/__stack_pointer local.get $2 ) + (func $export:bindings/esm/staticarrayU16 (param $0 i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + call $bindings/esm/staticarrayU16 + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) + (func $export:bindings/esm/staticarrayI64 (param $0 i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + call $bindings/esm/staticarrayI64 + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) (func $export:bindings/esm/arrayFunction (param $0 i32) (param $1 i32) (result i32) (local $2 i32) global.get $~lib/memory/__stack_pointer diff --git a/tests/compiler/bindings/esm.js b/tests/compiler/bindings/esm.js index 63c6fc8792..1ce52d1901 100644 --- a/tests/compiler/bindings/esm.js +++ b/tests/compiler/bindings/esm.js @@ -58,6 +58,10 @@ export async function postInstantiate(instance) { assert.deepStrictEqual(exports.staticarrayFunction([1, 2, 3], [4, 5, 6]), [1, 2, 3, 4, 5, 6]); + assert.deepStrictEqual(exports.staticarrayU16(Uint16Array.of(1, 2, 3)), [1, 2, 3]); + + assert.deepStrictEqual(exports.staticarrayI64(BigInt64Array.of(1n, 2n, 3n)), [1n, 2n, 3n]); + assert.deepStrictEqual(exports.arrayFunction([1, 2, 3], [4, 5, 6]), [1, 2, 3, 4, 5, 6]); { diff --git a/tests/compiler/bindings/esm.release.d.ts b/tests/compiler/bindings/esm.release.d.ts index 0bd3b0a5d1..d4b27a1ee2 100644 --- a/tests/compiler/bindings/esm.release.d.ts +++ b/tests/compiler/bindings/esm.release.d.ts @@ -98,7 +98,19 @@ export declare function typedarrayFunction(a: Int16Array, b: Float32Array): BigU * @param b `~lib/staticarray/StaticArray` * @returns `~lib/staticarray/StaticArray` */ -export declare function staticarrayFunction(a: Array, b: Array): Array; +export declare function staticarrayFunction(a: ArrayLike, b: ArrayLike): ArrayLike; +/** + * bindings/esm/staticarrayU16 + * @param a `~lib/staticarray/StaticArray` + * @returns `~lib/staticarray/StaticArray` + */ +export declare function staticarrayU16(a: ArrayLike): ArrayLike; +/** + * bindings/esm/staticarrayI64 + * @param a `~lib/staticarray/StaticArray` + * @returns `~lib/staticarray/StaticArray` + */ +export declare function staticarrayI64(a: ArrayLike): ArrayLike; /** * bindings/esm/arrayFunction * @param a `~lib/array/Array` @@ -112,21 +124,21 @@ export declare function arrayFunction(a: Array, b: Array): Array * @param b `bindings/esm/PlainObject` * @returns `bindings/esm/PlainObject` */ -export declare function objectFunction(a: __Record8, b: __Record8): __Record8; +export declare function objectFunction(a: __Record10, b: __Record10): __Record10; /** * bindings/esm/newInternref * @returns `bindings/esm/NonPlainObject` */ -export declare function newInternref(): __Internref11; +export declare function newInternref(): __Internref13; /** * bindings/esm/internrefFunction * @param a `bindings/esm/NonPlainObject` * @param b `bindings/esm/NonPlainObject` * @returns `bindings/esm/NonPlainObject` */ -export declare function internrefFunction(a: __Internref11, b: __Internref11): __Internref11; +export declare function internrefFunction(a: __Internref13, b: __Internref13): __Internref13; /** bindings/esm/PlainObject */ -declare interface __Record8 { +declare interface __Record10 { /** @type `i8` */ a: number | TOmittable; /** @type `i16` */ @@ -161,6 +173,6 @@ declare interface __Record8 { p: Array | null | TOmittable; } /** bindings/esm/NonPlainObject */ -declare class __Internref11 extends Number { - private __nominal11: symbol; +declare class __Internref13 extends Number { + private __nominal13: symbol; } diff --git a/tests/compiler/bindings/esm.release.js b/tests/compiler/bindings/esm.release.js index b17ae2c4e0..e38479066a 100644 --- a/tests/compiler/bindings/esm.release.js +++ b/tests/compiler/bindings/esm.release.js @@ -137,18 +137,28 @@ async function instantiate(module, imports = {}) { }, staticarrayFunction(a, b) { // bindings/esm/staticarrayFunction(~lib/staticarray/StaticArray, ~lib/staticarray/StaticArray) => ~lib/staticarray/StaticArray - a = __retain(__lowerStaticArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 6, 2, a) || __notnull()); - b = __lowerStaticArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 6, 2, b) || __notnull(); + a = __retain(__lowerStaticArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 6, 2, a, Int32Array) || __notnull()); + b = __lowerStaticArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 6, 2, b, Int32Array) || __notnull(); try { return __liftStaticArray(pointer => new Int32Array(memory.buffer)[pointer >>> 2], 2, exports.staticarrayFunction(a, b) >>> 0); } finally { __release(a); } }, + staticarrayU16(a) { + // bindings/esm/staticarrayU16(~lib/staticarray/StaticArray) => ~lib/staticarray/StaticArray + a = __lowerStaticArray((pointer, value) => { new Uint16Array(memory.buffer)[pointer >>> 1] = value; }, 7, 1, a, Uint16Array) || __notnull(); + return __liftStaticArray(pointer => new Uint16Array(memory.buffer)[pointer >>> 1], 1, exports.staticarrayU16(a) >>> 0); + }, + staticarrayI64(a) { + // bindings/esm/staticarrayI64(~lib/staticarray/StaticArray) => ~lib/staticarray/StaticArray + a = __lowerStaticArray((pointer, value) => { new BigInt64Array(memory.buffer)[pointer >>> 3] = value || 0n; }, 8, 3, a, BigInt64Array) || __notnull(); + return __liftStaticArray(pointer => new BigInt64Array(memory.buffer)[pointer >>> 3], 3, exports.staticarrayI64(a) >>> 0); + }, arrayFunction(a, b) { // bindings/esm/arrayFunction(~lib/array/Array, ~lib/array/Array) => ~lib/array/Array - a = __retain(__lowerArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 7, 2, a) || __notnull()); - b = __lowerArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 7, 2, b) || __notnull(); + a = __retain(__lowerArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 9, 2, a) || __notnull()); + b = __lowerArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 9, 2, b) || __notnull(); try { return __liftArray(pointer => new Int32Array(memory.buffer)[pointer >>> 2], 2, exports.arrayFunction(a, b) >>> 0); } finally { @@ -157,10 +167,10 @@ async function instantiate(module, imports = {}) { }, objectFunction(a, b) { // bindings/esm/objectFunction(bindings/esm/PlainObject, bindings/esm/PlainObject) => bindings/esm/PlainObject - a = __retain(__lowerRecord8(a) || __notnull()); - b = __lowerRecord8(b) || __notnull(); + a = __retain(__lowerRecord10(a) || __notnull()); + b = __lowerRecord10(b) || __notnull(); try { - return __liftRecord8(exports.objectFunction(a, b) >>> 0); + return __liftRecord10(exports.objectFunction(a, b) >>> 0); } finally { __release(a); } @@ -180,11 +190,11 @@ async function instantiate(module, imports = {}) { } }, }, exports); - function __lowerRecord8(value) { + function __lowerRecord10(value) { // bindings/esm/PlainObject // Hint: Opt-out from lowering as a record by providing an empty constructor if (value == null) return 0; - const pointer = exports.__pin(exports.__new(68, 8)); + const pointer = exports.__pin(exports.__new(68, 10)); new Int8Array(memory.buffer)[pointer + 0 >>> 0] = value.a; new Int16Array(memory.buffer)[pointer + 2 >>> 1] = value.b; new Int32Array(memory.buffer)[pointer + 4 >>> 2] = value.c; @@ -199,12 +209,12 @@ async function instantiate(module, imports = {}) { new Float32Array(memory.buffer)[pointer + 44 >>> 2] = value.l; new Float64Array(memory.buffer)[pointer + 48 >>> 3] = value.m; new Uint32Array(memory.buffer)[pointer + 56 >>> 2] = __lowerString(value.n); - new Uint32Array(memory.buffer)[pointer + 60 >>> 2] = __lowerTypedArray(Uint8Array, 9, 0, value.o); - new Uint32Array(memory.buffer)[pointer + 64 >>> 2] = __lowerArray((pointer, value) => { new Uint32Array(memory.buffer)[pointer >>> 2] = __lowerString(value) || __notnull(); }, 10, 2, value.p); + new Uint32Array(memory.buffer)[pointer + 60 >>> 2] = __lowerTypedArray(Uint8Array, 11, 0, value.o); + new Uint32Array(memory.buffer)[pointer + 64 >>> 2] = __lowerArray((pointer, value) => { new Uint32Array(memory.buffer)[pointer >>> 2] = __lowerString(value) || __notnull(); }, 12, 2, value.p); exports.__unpin(pointer); return pointer; } - function __liftRecord8(pointer) { + function __liftRecord10(pointer) { // bindings/esm/PlainObject // Hint: Opt-out from lifting as a record by providing an empty constructor if (!pointer) return null; @@ -314,12 +324,16 @@ async function instantiate(module, imports = {}) { for (let i = 0; i < length; ++i) values[i] = liftElement(pointer + (i << align >>> 0)); return values; } - function __lowerStaticArray(lowerElement, id, align, values) { + function __lowerStaticArray(lowerElement, id, align, values, typedConstructor) { if (values == null) return 0; const length = values.length, buffer = exports.__pin(exports.__new(length << align, id)) >>> 0; - for (let i = 0; i < length; i++) lowerElement(buffer + (i << align >>> 0), values[i]); + if (typedConstructor) { + new typedConstructor(memory.buffer, buffer, length).set(values); + } else { + for (let i = 0; i < length; i++) lowerElement(buffer + (i << align >>> 0), values[i]); + } exports.__unpin(buffer); return buffer; } @@ -376,6 +390,8 @@ export const { stringFunctionOptional, typedarrayFunction, staticarrayFunction, + staticarrayU16, + staticarrayI64, arrayFunction, objectFunction, newInternref, diff --git a/tests/compiler/bindings/esm.release.wat b/tests/compiler/bindings/esm.release.wat index 76483b93d9..ba446b9f95 100644 --- a/tests/compiler/bindings/esm.release.wat +++ b/tests/compiler/bindings/esm.release.wat @@ -5,13 +5,13 @@ (type $none_=>_none (func)) (type $i32_i32_=>_none (func (param i32 i32))) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) + (type $i32_=>_i32 (func (param i32) (result i32))) (type $i32_i32_f64_f64_f64_f64_f64_=>_none (func (param i32 i32 f64 f64 f64 f64 f64))) (type $f64_=>_f64 (func (param f64) (result f64))) (type $i64_i64_=>_i64 (func (param i64 i64) (result i64))) (type $none_=>_i64 (func (result i64))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) (type $i32_i32_i64_=>_none (func (param i32 i32 i64))) - (type $i32_=>_i32 (func (param i32) (result i32))) (import "env" "Math.E" (global $~lib/bindings/dom/Math.E f64)) (import "env" "trace" (func $~lib/builtins/trace (param i32 i32 f64 f64 f64 f64 f64))) (import "env" "console.log" (func $~lib/bindings/dom/console.log (param i32))) @@ -40,7 +40,7 @@ (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) (global $~argumentsLength (mut i32) (i32.const 0)) (global $~lib/rt/__rtti_base i32 (i32.const 2048)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18532)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18548)) (global $~started (mut i32) (i32.const 0)) (memory $0 1) (data (i32.const 1036) "\1c") @@ -77,9 +77,9 @@ (data (i32.const 1928) "\01\00\00\00*\00\00\00O\00b\00j\00e\00c\00t\00 \00a\00l\00r\00e\00a\00d\00y\00 \00p\00i\00n\00n\00e\00d") (data (i32.const 1980) "<") (data (i32.const 1992) "\01\00\00\00(\00\00\00O\00b\00j\00e\00c\00t\00 \00i\00s\00 \00n\00o\00t\00 \00p\00i\00n\00n\00e\00d") - (data (i32.const 2048) "\0c\00\00\00 \00\00\00\00\00\00\00 ") - (data (i32.const 2076) "\81\08\00\00\02\00\00\00\01\19\00\00\02\00\00\00\01\02\00\00\02\00\00\00$\t\00\00\00\00\00\00\02\t") - (data (i32.const 2124) "A\00\00\00\02\00\00\00\02A\00\00\00\00\00\00 ") + (data (i32.const 2048) "\0e\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 2076) "\81\08\00\00\02\00\00\00\01\19\00\00\02\00\00\00\01\02\00\00\02\00\00\00$\t\00\00\00\00\00\00\a4\00\00\00\00\00\00\00$\n\00\00\00\00\00\00\02\t") + (data (i32.const 2140) "A\00\00\00\02\00\00\00\02A\00\00\00\00\00\00 ") (export "plainGlobal" (global $bindings/esm/plainGlobal)) (export "plainMutableGlobal" (global $bindings/esm/plainMutableGlobal)) (export "stringGlobal" (global $bindings/esm/stringGlobal)) @@ -108,6 +108,8 @@ (export "stringFunctionOptional" (func $export:bindings/esm/stringFunctionOptional@varargs)) (export "typedarrayFunction" (func $export:bindings/esm/typedarrayFunction)) (export "staticarrayFunction" (func $export:bindings/esm/staticarrayFunction)) + (export "staticarrayU16" (func $export:bindings/esm/staticarrayU16)) + (export "staticarrayI64" (func $export:bindings/esm/staticarrayU16)) (export "arrayFunction" (func $export:bindings/esm/arrayFunction)) (export "objectFunction" (func $export:bindings/esm/objectFunction)) (export "internrefFunction" (func $export:bindings/esm/internrefFunction)) @@ -197,7 +199,7 @@ if i32.const 0 local.get $0 - i32.const 18532 + i32.const 18548 i32.lt_u local.get $0 i32.load offset=8 @@ -852,10 +854,10 @@ if unreachable end - i32.const 18544 + i32.const 18560 i32.const 0 i32.store - i32.const 20112 + i32.const 20128 i32.const 0 i32.store loop $for-loop|0 @@ -866,7 +868,7 @@ local.get $0 i32.const 2 i32.shl - i32.const 18544 + i32.const 18560 i32.add i32.const 0 i32.store offset=4 @@ -884,7 +886,7 @@ i32.add i32.const 2 i32.shl - i32.const 18544 + i32.const 18560 i32.add i32.const 0 i32.store offset=96 @@ -902,13 +904,13 @@ br $for-loop|0 end end - i32.const 18544 - i32.const 20116 + i32.const 18560 + i32.const 20132 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 18544 + i32.const 18560 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -993,7 +995,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 18532 + i32.const 18548 i32.lt_u if local.get $0 @@ -1093,7 +1095,7 @@ unreachable end local.get $0 - i32.const 18532 + i32.const 18548 i32.lt_u if local.get $0 @@ -1116,7 +1118,7 @@ i32.const 4 i32.add local.tee $0 - i32.const 18532 + i32.const 18548 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -1617,11 +1619,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s if - i32.const 18560 - i32.const 18608 + i32.const 18576 + i32.const 18624 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -1925,11 +1927,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s if - i32.const 18560 - i32.const 18608 + i32.const 18576 + i32.const 18624 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -1941,7 +1943,7 @@ i32.store local.get $0 i32.const 0 - i32.const 11 + i32.const 13 call $~lib/rt/itcms/__new local.tee $0 i32.store @@ -2106,14 +2108,20 @@ block $bindings/esm/NonPlainObject block $~lib/array/Array<~lib/string/String> block $bindings/esm/PlainObject - block $~lib/staticarray/StaticArray - block $~lib/string/String - block $~lib/arraybuffer/ArrayBuffer - local.get $0 - i32.const 8 - i32.sub - i32.load - br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $folding-inner1 $folding-inner0 $folding-inner0 $folding-inner0 $~lib/staticarray/StaticArray $folding-inner1 $bindings/esm/PlainObject $folding-inner0 $~lib/array/Array<~lib/string/String> $bindings/esm/NonPlainObject $invalid + block $~lib/staticarray/StaticArray + block $~lib/staticarray/StaticArray + block $~lib/staticarray/StaticArray + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $folding-inner1 $folding-inner0 $folding-inner0 $folding-inner0 $~lib/staticarray/StaticArray $~lib/staticarray/StaticArray $~lib/staticarray/StaticArray $folding-inner1 $bindings/esm/PlainObject $folding-inner0 $~lib/array/Array<~lib/string/String> $bindings/esm/NonPlainObject $invalid + end + return + end + return end return end @@ -2212,11 +2220,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s if - i32.const 18560 - i32.const 18608 + i32.const 18576 + i32.const 18624 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2254,7 +2262,7 @@ memory.size i32.const 16 i32.shl - i32.const 18532 + i32.const 18548 i32.sub i32.const 1 i32.shr_u @@ -2295,7 +2303,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2310,7 +2318,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2334,7 +2342,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2385,8 +2393,8 @@ local.get $5 return end - i32.const 18560 - i32.const 18608 + i32.const 18576 + i32.const 18624 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2399,11 +2407,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s if - i32.const 18560 - i32.const 18608 + i32.const 18576 + i32.const 18624 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2432,7 +2440,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2447,7 +2455,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2482,8 +2490,8 @@ global.set $~lib/memory/__stack_pointer return end - i32.const 18560 - i32.const 18608 + i32.const 18576 + i32.const 18624 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2501,7 +2509,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner1 global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner1 global.get $~lib/memory/__stack_pointer @@ -2516,7 +2524,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner1 global.get $~lib/memory/__stack_pointer @@ -2541,7 +2549,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner00 global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner00 global.get $~lib/memory/__stack_pointer @@ -2560,7 +2568,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner00 global.get $~lib/memory/__stack_pointer @@ -2737,8 +2745,8 @@ local.get $2 return end - i32.const 18560 - i32.const 18608 + i32.const 18576 + i32.const 18624 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2754,7 +2762,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner1 global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner1 global.get $~lib/memory/__stack_pointer @@ -2771,7 +2779,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2797,7 +2805,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2899,13 +2907,40 @@ global.set $~lib/memory/__stack_pointer return end - i32.const 18560 - i32.const 18608 + i32.const 18576 + i32.const 18624 i32.const 1 i32.const 1 call $~lib/builtins/abort unreachable ) + (func $export:bindings/esm/staticarrayU16 (param $0 i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2164 + i32.lt_s + if + i32.const 18576 + i32.const 18624 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.tee $1 + local.get $0 + i32.store + local.get $1 + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + ) (func $export:bindings/esm/arrayFunction (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) @@ -2918,7 +2953,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner1 global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner1 global.get $~lib/memory/__stack_pointer @@ -2937,7 +2972,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2955,7 +2990,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2964,7 +2999,7 @@ i64.store local.get $0 i32.const 16 - i32.const 7 + i32.const 9 call $~lib/rt/itcms/__new local.tee $2 i32.store @@ -3090,8 +3125,8 @@ global.set $~lib/memory/__stack_pointer return end - i32.const 18560 - i32.const 18608 + i32.const 18576 + i32.const 18624 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3106,7 +3141,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner1 global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner1 global.get $~lib/memory/__stack_pointer @@ -3123,7 +3158,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -3135,7 +3170,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -3144,7 +3179,7 @@ i32.store local.get $3 i32.const 68 - i32.const 8 + i32.const 10 call $~lib/rt/itcms/__new local.tee $3 i32.store @@ -3232,8 +3267,8 @@ global.set $~lib/memory/__stack_pointer return end - i32.const 18560 - i32.const 18608 + i32.const 18576 + i32.const 18624 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3246,11 +3281,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s if - i32.const 18560 - i32.const 18608 + i32.const 18576 + i32.const 18624 i32.const 1 i32.const 1 call $~lib/builtins/abort diff --git a/tests/compiler/bindings/esm.ts b/tests/compiler/bindings/esm.ts index 3a000c534a..75debd1de2 100644 --- a/tests/compiler/bindings/esm.ts +++ b/tests/compiler/bindings/esm.ts @@ -73,6 +73,14 @@ export function staticarrayFunction(a: StaticArray, b: StaticArray): S return c; } +export function staticarrayU16(a: StaticArray): StaticArray { + return a; +} + +export function staticarrayI64(a: StaticArray): StaticArray { + return a; +} + export function arrayFunction(a: Array, b: Array): Array { var c = new Array(a.length + b.length); for (let i = 0; i < a.length; ++i) { diff --git a/tests/compiler/bindings/raw.debug.d.ts b/tests/compiler/bindings/raw.debug.d.ts index 2769451b2f..930fee4422 100644 --- a/tests/compiler/bindings/raw.debug.d.ts +++ b/tests/compiler/bindings/raw.debug.d.ts @@ -99,7 +99,19 @@ declare namespace __AdaptedExports { * @param b `~lib/staticarray/StaticArray` * @returns `~lib/staticarray/StaticArray` */ - export function staticarrayFunction(a: Array, b: Array): Array; + export function staticarrayFunction(a: ArrayLike, b: ArrayLike): ArrayLike; + /** + * bindings/esm/staticarrayU16 + * @param a `~lib/staticarray/StaticArray` + * @returns `~lib/staticarray/StaticArray` + */ + export function staticarrayU16(a: ArrayLike): ArrayLike; + /** + * bindings/esm/staticarrayI64 + * @param a `~lib/staticarray/StaticArray` + * @returns `~lib/staticarray/StaticArray` + */ + export function staticarrayI64(a: ArrayLike): ArrayLike; /** * bindings/esm/arrayFunction * @param a `~lib/array/Array` @@ -113,22 +125,22 @@ declare namespace __AdaptedExports { * @param b `bindings/esm/PlainObject` * @returns `bindings/esm/PlainObject` */ - export function objectFunction(a: __Record8, b: __Record8): __Record8; + export function objectFunction(a: __Record10, b: __Record10): __Record10; /** * bindings/esm/newInternref * @returns `bindings/esm/NonPlainObject` */ - export function newInternref(): __Internref11; + export function newInternref(): __Internref13; /** * bindings/esm/internrefFunction * @param a `bindings/esm/NonPlainObject` * @param b `bindings/esm/NonPlainObject` * @returns `bindings/esm/NonPlainObject` */ - export function internrefFunction(a: __Internref11, b: __Internref11): __Internref11; + export function internrefFunction(a: __Internref13, b: __Internref13): __Internref13; } /** bindings/esm/PlainObject */ -declare interface __Record8 { +declare interface __Record10 { /** @type `i8` */ a: number | TOmittable; /** @type `i16` */ @@ -163,8 +175,8 @@ declare interface __Record8 { p: Array | null | TOmittable; } /** bindings/esm/NonPlainObject */ -declare class __Internref11 extends Number { - private __nominal11: symbol; +declare class __Internref13 extends Number { + private __nominal13: symbol; } /** Instantiates the compiled WebAssembly module with the given imports. */ export declare function instantiate(module: WebAssembly.Module, imports: { diff --git a/tests/compiler/bindings/raw.debug.js b/tests/compiler/bindings/raw.debug.js index 1091069c5b..11516eb03f 100644 --- a/tests/compiler/bindings/raw.debug.js +++ b/tests/compiler/bindings/raw.debug.js @@ -137,18 +137,28 @@ export async function instantiate(module, imports = {}) { }, staticarrayFunction(a, b) { // bindings/esm/staticarrayFunction(~lib/staticarray/StaticArray, ~lib/staticarray/StaticArray) => ~lib/staticarray/StaticArray - a = __retain(__lowerStaticArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 6, 2, a) || __notnull()); - b = __lowerStaticArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 6, 2, b) || __notnull(); + a = __retain(__lowerStaticArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 6, 2, a, Int32Array) || __notnull()); + b = __lowerStaticArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 6, 2, b, Int32Array) || __notnull(); try { return __liftStaticArray(pointer => new Int32Array(memory.buffer)[pointer >>> 2], 2, exports.staticarrayFunction(a, b) >>> 0); } finally { __release(a); } }, + staticarrayU16(a) { + // bindings/esm/staticarrayU16(~lib/staticarray/StaticArray) => ~lib/staticarray/StaticArray + a = __lowerStaticArray((pointer, value) => { new Uint16Array(memory.buffer)[pointer >>> 1] = value; }, 7, 1, a, Uint16Array) || __notnull(); + return __liftStaticArray(pointer => new Uint16Array(memory.buffer)[pointer >>> 1], 1, exports.staticarrayU16(a) >>> 0); + }, + staticarrayI64(a) { + // bindings/esm/staticarrayI64(~lib/staticarray/StaticArray) => ~lib/staticarray/StaticArray + a = __lowerStaticArray((pointer, value) => { new BigInt64Array(memory.buffer)[pointer >>> 3] = value || 0n; }, 8, 3, a, BigInt64Array) || __notnull(); + return __liftStaticArray(pointer => new BigInt64Array(memory.buffer)[pointer >>> 3], 3, exports.staticarrayI64(a) >>> 0); + }, arrayFunction(a, b) { // bindings/esm/arrayFunction(~lib/array/Array, ~lib/array/Array) => ~lib/array/Array - a = __retain(__lowerArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 7, 2, a) || __notnull()); - b = __lowerArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 7, 2, b) || __notnull(); + a = __retain(__lowerArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 9, 2, a) || __notnull()); + b = __lowerArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 9, 2, b) || __notnull(); try { return __liftArray(pointer => new Int32Array(memory.buffer)[pointer >>> 2], 2, exports.arrayFunction(a, b) >>> 0); } finally { @@ -157,10 +167,10 @@ export async function instantiate(module, imports = {}) { }, objectFunction(a, b) { // bindings/esm/objectFunction(bindings/esm/PlainObject, bindings/esm/PlainObject) => bindings/esm/PlainObject - a = __retain(__lowerRecord8(a) || __notnull()); - b = __lowerRecord8(b) || __notnull(); + a = __retain(__lowerRecord10(a) || __notnull()); + b = __lowerRecord10(b) || __notnull(); try { - return __liftRecord8(exports.objectFunction(a, b) >>> 0); + return __liftRecord10(exports.objectFunction(a, b) >>> 0); } finally { __release(a); } @@ -180,11 +190,11 @@ export async function instantiate(module, imports = {}) { } }, }, exports); - function __lowerRecord8(value) { + function __lowerRecord10(value) { // bindings/esm/PlainObject // Hint: Opt-out from lowering as a record by providing an empty constructor if (value == null) return 0; - const pointer = exports.__pin(exports.__new(68, 8)); + const pointer = exports.__pin(exports.__new(68, 10)); new Int8Array(memory.buffer)[pointer + 0 >>> 0] = value.a; new Int16Array(memory.buffer)[pointer + 2 >>> 1] = value.b; new Int32Array(memory.buffer)[pointer + 4 >>> 2] = value.c; @@ -199,12 +209,12 @@ export async function instantiate(module, imports = {}) { new Float32Array(memory.buffer)[pointer + 44 >>> 2] = value.l; new Float64Array(memory.buffer)[pointer + 48 >>> 3] = value.m; new Uint32Array(memory.buffer)[pointer + 56 >>> 2] = __lowerString(value.n); - new Uint32Array(memory.buffer)[pointer + 60 >>> 2] = __lowerTypedArray(Uint8Array, 9, 0, value.o); - new Uint32Array(memory.buffer)[pointer + 64 >>> 2] = __lowerArray((pointer, value) => { new Uint32Array(memory.buffer)[pointer >>> 2] = __lowerString(value) || __notnull(); }, 10, 2, value.p); + new Uint32Array(memory.buffer)[pointer + 60 >>> 2] = __lowerTypedArray(Uint8Array, 11, 0, value.o); + new Uint32Array(memory.buffer)[pointer + 64 >>> 2] = __lowerArray((pointer, value) => { new Uint32Array(memory.buffer)[pointer >>> 2] = __lowerString(value) || __notnull(); }, 12, 2, value.p); exports.__unpin(pointer); return pointer; } - function __liftRecord8(pointer) { + function __liftRecord10(pointer) { // bindings/esm/PlainObject // Hint: Opt-out from lifting as a record by providing an empty constructor if (!pointer) return null; @@ -314,12 +324,16 @@ export async function instantiate(module, imports = {}) { for (let i = 0; i < length; ++i) values[i] = liftElement(pointer + (i << align >>> 0)); return values; } - function __lowerStaticArray(lowerElement, id, align, values) { + function __lowerStaticArray(lowerElement, id, align, values, typedConstructor) { if (values == null) return 0; const length = values.length, buffer = exports.__pin(exports.__new(length << align, id)) >>> 0; - for (let i = 0; i < length; i++) lowerElement(buffer + (i << align >>> 0), values[i]); + if (typedConstructor) { + new typedConstructor(memory.buffer, buffer, length).set(values); + } else { + for (let i = 0; i < length; i++) lowerElement(buffer + (i << align >>> 0), values[i]); + } exports.__unpin(buffer); return buffer; } diff --git a/tests/compiler/bindings/raw.debug.wat b/tests/compiler/bindings/raw.debug.wat index 863c18d4e5..1adeadd9c0 100644 --- a/tests/compiler/bindings/raw.debug.wat +++ b/tests/compiler/bindings/raw.debug.wat @@ -54,9 +54,9 @@ (global $~lib/native/ASC_RUNTIME i32 (i32.const 2)) (global $~argumentsLength (mut i32) (i32.const 0)) (global $~lib/rt/__rtti_base i32 (i32.const 1024)) - (global $~lib/memory/__data_end i32 (i32.const 1124)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17508)) - (global $~lib/memory/__heap_base i32 (i32.const 17508)) + (global $~lib/memory/__data_end i32 (i32.const 1140)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17524)) + (global $~lib/memory/__heap_base i32 (i32.const 17524)) (global $~started (mut i32) (i32.const 0)) (memory $0 1) (data (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00a\00\00\00\00\00\00\00\00\00\00\00") @@ -79,7 +79,7 @@ (data (i32.const 844) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00\00\00") (data (i32.const 892) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00*\00\00\00O\00b\00j\00e\00c\00t\00 \00a\00l\00r\00e\00a\00d\00y\00 \00p\00i\00n\00n\00e\00d\00\00\00") (data (i32.const 956) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00(\00\00\00O\00b\00j\00e\00c\00t\00 \00i\00s\00 \00n\00o\00t\00 \00p\00i\00n\00n\00e\00d\00\00\00\00\00") - (data (i32.const 1024) "\0c\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\81\08\00\00\02\00\00\00\01\19\00\00\02\00\00\00\01\02\00\00\02\00\00\00$\t\00\00\00\00\00\00\02\t\00\00\00\00\00\00\00\00\00\00\00\00\00\00A\00\00\00\02\00\00\00\02A\00\00\00\00\00\00 \00\00\00\00\00\00\00") + (data (i32.const 1024) "\0e\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\81\08\00\00\02\00\00\00\01\19\00\00\02\00\00\00\01\02\00\00\02\00\00\00$\t\00\00\00\00\00\00\a4\00\00\00\00\00\00\00$\n\00\00\00\00\00\00\02\t\00\00\00\00\00\00\00\00\00\00\00\00\00\00A\00\00\00\02\00\00\00\02A\00\00\00\00\00\00 \00\00\00\00\00\00\00") (table $0 1 1 funcref) (elem $0 (i32.const 1)) (export "plainGlobal" (global $bindings/esm/plainGlobal)) @@ -110,6 +110,8 @@ (export "stringFunctionOptional" (func $export:bindings/esm/stringFunctionOptional@varargs)) (export "typedarrayFunction" (func $export:bindings/esm/typedarrayFunction)) (export "staticarrayFunction" (func $export:bindings/esm/staticarrayFunction)) + (export "staticarrayU16" (func $export:bindings/esm/staticarrayU16)) + (export "staticarrayI64" (func $export:bindings/esm/staticarrayI64)) (export "arrayFunction" (func $export:bindings/esm/arrayFunction)) (export "objectFunction" (func $export:bindings/esm/objectFunction)) (export "internrefFunction" (func $export:bindings/esm/internrefFunction)) @@ -2464,6 +2466,12 @@ local.get $2 call $~lib/staticarray/StaticArray#__uset ) + (func $bindings/esm/staticarrayU16 (param $0 i32) (result i32) + local.get $0 + ) + (func $bindings/esm/staticarrayI64 (param $0 i32) (result i32) + local.get $0 + ) (func $~lib/array/Array#set:buffer (param $0 i32) (param $1 i32) local.get $0 local.get $1 @@ -3078,41 +3086,47 @@ block $~lib/typedarray/Uint8Array block $bindings/esm/PlainObject block $~lib/array/Array - block $~lib/staticarray/StaticArray - block $~lib/typedarray/Uint64Array - block $~lib/typedarray/Float32Array - block $~lib/typedarray/Int16Array - block $~lib/arraybuffer/ArrayBufferView - block $~lib/string/String - block $~lib/arraybuffer/ArrayBuffer - local.get $0 - i32.const 8 - i32.sub - i32.load - br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $~lib/typedarray/Int16Array $~lib/typedarray/Float32Array $~lib/typedarray/Uint64Array $~lib/staticarray/StaticArray $~lib/array/Array $bindings/esm/PlainObject $~lib/typedarray/Uint8Array $~lib/array/Array<~lib/string/String> $bindings/esm/NonPlainObject $invalid + block $~lib/staticarray/StaticArray + block $~lib/staticarray/StaticArray + block $~lib/staticarray/StaticArray + block $~lib/typedarray/Uint64Array + block $~lib/typedarray/Float32Array + block $~lib/typedarray/Int16Array + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $~lib/typedarray/Int16Array $~lib/typedarray/Float32Array $~lib/typedarray/Uint64Array $~lib/staticarray/StaticArray $~lib/staticarray/StaticArray $~lib/staticarray/StaticArray $~lib/array/Array $bindings/esm/PlainObject $~lib/typedarray/Uint8Array $~lib/array/Array<~lib/string/String> $bindings/esm/NonPlainObject $invalid + end + return + end + return end + local.get $0 + local.get $1 + call $~lib/arraybuffer/ArrayBufferView~visit return end + local.get $0 + local.get $1 + call $~lib/typedarray/Int16Array~visit return end local.get $0 local.get $1 - call $~lib/arraybuffer/ArrayBufferView~visit + call $~lib/typedarray/Float32Array~visit return end local.get $0 local.get $1 - call $~lib/typedarray/Int16Array~visit + call $~lib/typedarray/Uint64Array~visit return end - local.get $0 - local.get $1 - call $~lib/typedarray/Float32Array~visit return end - local.get $0 - local.get $1 - call $~lib/typedarray/Uint64Array~visit return end return @@ -3176,8 +3190,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 17536 - i32.const 17584 + i32.const 17552 + i32.const 17600 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3749,7 +3763,7 @@ if global.get $~lib/memory/__stack_pointer i32.const 16 - i32.const 7 + i32.const 9 call $~lib/rt/itcms/__new local.tee $0 i32.store @@ -3915,7 +3929,7 @@ if global.get $~lib/memory/__stack_pointer i32.const 68 - i32.const 8 + i32.const 10 call $~lib/rt/itcms/__new local.tee $0 i32.store @@ -4029,7 +4043,7 @@ if global.get $~lib/memory/__stack_pointer i32.const 0 - i32.const 11 + i32.const 13 call $~lib/rt/itcms/__new local.tee $0 i32.store @@ -4157,6 +4171,44 @@ global.set $~lib/memory/__stack_pointer local.get $2 ) + (func $export:bindings/esm/staticarrayU16 (param $0 i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + call $bindings/esm/staticarrayU16 + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) + (func $export:bindings/esm/staticarrayI64 (param $0 i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + call $bindings/esm/staticarrayI64 + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) (func $export:bindings/esm/arrayFunction (param $0 i32) (param $1 i32) (result i32) (local $2 i32) global.get $~lib/memory/__stack_pointer diff --git a/tests/compiler/bindings/raw.release.d.ts b/tests/compiler/bindings/raw.release.d.ts index 2769451b2f..930fee4422 100644 --- a/tests/compiler/bindings/raw.release.d.ts +++ b/tests/compiler/bindings/raw.release.d.ts @@ -99,7 +99,19 @@ declare namespace __AdaptedExports { * @param b `~lib/staticarray/StaticArray` * @returns `~lib/staticarray/StaticArray` */ - export function staticarrayFunction(a: Array, b: Array): Array; + export function staticarrayFunction(a: ArrayLike, b: ArrayLike): ArrayLike; + /** + * bindings/esm/staticarrayU16 + * @param a `~lib/staticarray/StaticArray` + * @returns `~lib/staticarray/StaticArray` + */ + export function staticarrayU16(a: ArrayLike): ArrayLike; + /** + * bindings/esm/staticarrayI64 + * @param a `~lib/staticarray/StaticArray` + * @returns `~lib/staticarray/StaticArray` + */ + export function staticarrayI64(a: ArrayLike): ArrayLike; /** * bindings/esm/arrayFunction * @param a `~lib/array/Array` @@ -113,22 +125,22 @@ declare namespace __AdaptedExports { * @param b `bindings/esm/PlainObject` * @returns `bindings/esm/PlainObject` */ - export function objectFunction(a: __Record8, b: __Record8): __Record8; + export function objectFunction(a: __Record10, b: __Record10): __Record10; /** * bindings/esm/newInternref * @returns `bindings/esm/NonPlainObject` */ - export function newInternref(): __Internref11; + export function newInternref(): __Internref13; /** * bindings/esm/internrefFunction * @param a `bindings/esm/NonPlainObject` * @param b `bindings/esm/NonPlainObject` * @returns `bindings/esm/NonPlainObject` */ - export function internrefFunction(a: __Internref11, b: __Internref11): __Internref11; + export function internrefFunction(a: __Internref13, b: __Internref13): __Internref13; } /** bindings/esm/PlainObject */ -declare interface __Record8 { +declare interface __Record10 { /** @type `i8` */ a: number | TOmittable; /** @type `i16` */ @@ -163,8 +175,8 @@ declare interface __Record8 { p: Array | null | TOmittable; } /** bindings/esm/NonPlainObject */ -declare class __Internref11 extends Number { - private __nominal11: symbol; +declare class __Internref13 extends Number { + private __nominal13: symbol; } /** Instantiates the compiled WebAssembly module with the given imports. */ export declare function instantiate(module: WebAssembly.Module, imports: { diff --git a/tests/compiler/bindings/raw.release.js b/tests/compiler/bindings/raw.release.js index 1091069c5b..11516eb03f 100644 --- a/tests/compiler/bindings/raw.release.js +++ b/tests/compiler/bindings/raw.release.js @@ -137,18 +137,28 @@ export async function instantiate(module, imports = {}) { }, staticarrayFunction(a, b) { // bindings/esm/staticarrayFunction(~lib/staticarray/StaticArray, ~lib/staticarray/StaticArray) => ~lib/staticarray/StaticArray - a = __retain(__lowerStaticArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 6, 2, a) || __notnull()); - b = __lowerStaticArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 6, 2, b) || __notnull(); + a = __retain(__lowerStaticArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 6, 2, a, Int32Array) || __notnull()); + b = __lowerStaticArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 6, 2, b, Int32Array) || __notnull(); try { return __liftStaticArray(pointer => new Int32Array(memory.buffer)[pointer >>> 2], 2, exports.staticarrayFunction(a, b) >>> 0); } finally { __release(a); } }, + staticarrayU16(a) { + // bindings/esm/staticarrayU16(~lib/staticarray/StaticArray) => ~lib/staticarray/StaticArray + a = __lowerStaticArray((pointer, value) => { new Uint16Array(memory.buffer)[pointer >>> 1] = value; }, 7, 1, a, Uint16Array) || __notnull(); + return __liftStaticArray(pointer => new Uint16Array(memory.buffer)[pointer >>> 1], 1, exports.staticarrayU16(a) >>> 0); + }, + staticarrayI64(a) { + // bindings/esm/staticarrayI64(~lib/staticarray/StaticArray) => ~lib/staticarray/StaticArray + a = __lowerStaticArray((pointer, value) => { new BigInt64Array(memory.buffer)[pointer >>> 3] = value || 0n; }, 8, 3, a, BigInt64Array) || __notnull(); + return __liftStaticArray(pointer => new BigInt64Array(memory.buffer)[pointer >>> 3], 3, exports.staticarrayI64(a) >>> 0); + }, arrayFunction(a, b) { // bindings/esm/arrayFunction(~lib/array/Array, ~lib/array/Array) => ~lib/array/Array - a = __retain(__lowerArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 7, 2, a) || __notnull()); - b = __lowerArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 7, 2, b) || __notnull(); + a = __retain(__lowerArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 9, 2, a) || __notnull()); + b = __lowerArray((pointer, value) => { new Int32Array(memory.buffer)[pointer >>> 2] = value; }, 9, 2, b) || __notnull(); try { return __liftArray(pointer => new Int32Array(memory.buffer)[pointer >>> 2], 2, exports.arrayFunction(a, b) >>> 0); } finally { @@ -157,10 +167,10 @@ export async function instantiate(module, imports = {}) { }, objectFunction(a, b) { // bindings/esm/objectFunction(bindings/esm/PlainObject, bindings/esm/PlainObject) => bindings/esm/PlainObject - a = __retain(__lowerRecord8(a) || __notnull()); - b = __lowerRecord8(b) || __notnull(); + a = __retain(__lowerRecord10(a) || __notnull()); + b = __lowerRecord10(b) || __notnull(); try { - return __liftRecord8(exports.objectFunction(a, b) >>> 0); + return __liftRecord10(exports.objectFunction(a, b) >>> 0); } finally { __release(a); } @@ -180,11 +190,11 @@ export async function instantiate(module, imports = {}) { } }, }, exports); - function __lowerRecord8(value) { + function __lowerRecord10(value) { // bindings/esm/PlainObject // Hint: Opt-out from lowering as a record by providing an empty constructor if (value == null) return 0; - const pointer = exports.__pin(exports.__new(68, 8)); + const pointer = exports.__pin(exports.__new(68, 10)); new Int8Array(memory.buffer)[pointer + 0 >>> 0] = value.a; new Int16Array(memory.buffer)[pointer + 2 >>> 1] = value.b; new Int32Array(memory.buffer)[pointer + 4 >>> 2] = value.c; @@ -199,12 +209,12 @@ export async function instantiate(module, imports = {}) { new Float32Array(memory.buffer)[pointer + 44 >>> 2] = value.l; new Float64Array(memory.buffer)[pointer + 48 >>> 3] = value.m; new Uint32Array(memory.buffer)[pointer + 56 >>> 2] = __lowerString(value.n); - new Uint32Array(memory.buffer)[pointer + 60 >>> 2] = __lowerTypedArray(Uint8Array, 9, 0, value.o); - new Uint32Array(memory.buffer)[pointer + 64 >>> 2] = __lowerArray((pointer, value) => { new Uint32Array(memory.buffer)[pointer >>> 2] = __lowerString(value) || __notnull(); }, 10, 2, value.p); + new Uint32Array(memory.buffer)[pointer + 60 >>> 2] = __lowerTypedArray(Uint8Array, 11, 0, value.o); + new Uint32Array(memory.buffer)[pointer + 64 >>> 2] = __lowerArray((pointer, value) => { new Uint32Array(memory.buffer)[pointer >>> 2] = __lowerString(value) || __notnull(); }, 12, 2, value.p); exports.__unpin(pointer); return pointer; } - function __liftRecord8(pointer) { + function __liftRecord10(pointer) { // bindings/esm/PlainObject // Hint: Opt-out from lifting as a record by providing an empty constructor if (!pointer) return null; @@ -314,12 +324,16 @@ export async function instantiate(module, imports = {}) { for (let i = 0; i < length; ++i) values[i] = liftElement(pointer + (i << align >>> 0)); return values; } - function __lowerStaticArray(lowerElement, id, align, values) { + function __lowerStaticArray(lowerElement, id, align, values, typedConstructor) { if (values == null) return 0; const length = values.length, buffer = exports.__pin(exports.__new(length << align, id)) >>> 0; - for (let i = 0; i < length; i++) lowerElement(buffer + (i << align >>> 0), values[i]); + if (typedConstructor) { + new typedConstructor(memory.buffer, buffer, length).set(values); + } else { + for (let i = 0; i < length; i++) lowerElement(buffer + (i << align >>> 0), values[i]); + } exports.__unpin(buffer); return buffer; } diff --git a/tests/compiler/bindings/raw.release.wat b/tests/compiler/bindings/raw.release.wat index b4c9560f48..afafc3763b 100644 --- a/tests/compiler/bindings/raw.release.wat +++ b/tests/compiler/bindings/raw.release.wat @@ -5,13 +5,13 @@ (type $none_=>_none (func)) (type $i32_i32_=>_none (func (param i32 i32))) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) + (type $i32_=>_i32 (func (param i32) (result i32))) (type $i32_i32_f64_f64_f64_f64_f64_=>_none (func (param i32 i32 f64 f64 f64 f64 f64))) (type $f64_=>_f64 (func (param f64) (result f64))) (type $i64_i64_=>_i64 (func (param i64 i64) (result i64))) (type $none_=>_i64 (func (result i64))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) (type $i32_i32_i64_=>_none (func (param i32 i32 i64))) - (type $i32_=>_i32 (func (param i32) (result i32))) (import "env" "Math.E" (global $~lib/bindings/dom/Math.E f64)) (import "env" "trace" (func $~lib/builtins/trace (param i32 i32 f64 f64 f64 f64 f64))) (import "env" "console.log" (func $~lib/bindings/dom/console.log (param i32))) @@ -40,7 +40,7 @@ (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) (global $~argumentsLength (mut i32) (i32.const 0)) (global $~lib/rt/__rtti_base i32 (i32.const 2048)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18532)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18548)) (global $~started (mut i32) (i32.const 0)) (memory $0 1) (data (i32.const 1036) "\1c") @@ -77,9 +77,9 @@ (data (i32.const 1928) "\01\00\00\00*\00\00\00O\00b\00j\00e\00c\00t\00 \00a\00l\00r\00e\00a\00d\00y\00 \00p\00i\00n\00n\00e\00d") (data (i32.const 1980) "<") (data (i32.const 1992) "\01\00\00\00(\00\00\00O\00b\00j\00e\00c\00t\00 \00i\00s\00 \00n\00o\00t\00 \00p\00i\00n\00n\00e\00d") - (data (i32.const 2048) "\0c\00\00\00 \00\00\00\00\00\00\00 ") - (data (i32.const 2076) "\81\08\00\00\02\00\00\00\01\19\00\00\02\00\00\00\01\02\00\00\02\00\00\00$\t\00\00\00\00\00\00\02\t") - (data (i32.const 2124) "A\00\00\00\02\00\00\00\02A\00\00\00\00\00\00 ") + (data (i32.const 2048) "\0e\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 2076) "\81\08\00\00\02\00\00\00\01\19\00\00\02\00\00\00\01\02\00\00\02\00\00\00$\t\00\00\00\00\00\00\a4\00\00\00\00\00\00\00$\n\00\00\00\00\00\00\02\t") + (data (i32.const 2140) "A\00\00\00\02\00\00\00\02A\00\00\00\00\00\00 ") (export "plainGlobal" (global $bindings/esm/plainGlobal)) (export "plainMutableGlobal" (global $bindings/esm/plainMutableGlobal)) (export "stringGlobal" (global $bindings/esm/stringGlobal)) @@ -108,6 +108,8 @@ (export "stringFunctionOptional" (func $export:bindings/esm/stringFunctionOptional@varargs)) (export "typedarrayFunction" (func $export:bindings/esm/typedarrayFunction)) (export "staticarrayFunction" (func $export:bindings/esm/staticarrayFunction)) + (export "staticarrayU16" (func $export:bindings/esm/staticarrayU16)) + (export "staticarrayI64" (func $export:bindings/esm/staticarrayU16)) (export "arrayFunction" (func $export:bindings/esm/arrayFunction)) (export "objectFunction" (func $export:bindings/esm/objectFunction)) (export "internrefFunction" (func $export:bindings/esm/internrefFunction)) @@ -197,7 +199,7 @@ if i32.const 0 local.get $0 - i32.const 18532 + i32.const 18548 i32.lt_u local.get $0 i32.load offset=8 @@ -852,10 +854,10 @@ if unreachable end - i32.const 18544 + i32.const 18560 i32.const 0 i32.store - i32.const 20112 + i32.const 20128 i32.const 0 i32.store loop $for-loop|0 @@ -866,7 +868,7 @@ local.get $0 i32.const 2 i32.shl - i32.const 18544 + i32.const 18560 i32.add i32.const 0 i32.store offset=4 @@ -884,7 +886,7 @@ i32.add i32.const 2 i32.shl - i32.const 18544 + i32.const 18560 i32.add i32.const 0 i32.store offset=96 @@ -902,13 +904,13 @@ br $for-loop|0 end end - i32.const 18544 - i32.const 20116 + i32.const 18560 + i32.const 20132 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 18544 + i32.const 18560 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -993,7 +995,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 18532 + i32.const 18548 i32.lt_u if local.get $0 @@ -1093,7 +1095,7 @@ unreachable end local.get $0 - i32.const 18532 + i32.const 18548 i32.lt_u if local.get $0 @@ -1116,7 +1118,7 @@ i32.const 4 i32.add local.tee $0 - i32.const 18532 + i32.const 18548 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -1617,11 +1619,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s if - i32.const 18560 - i32.const 18608 + i32.const 18576 + i32.const 18624 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -1925,11 +1927,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s if - i32.const 18560 - i32.const 18608 + i32.const 18576 + i32.const 18624 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -1941,7 +1943,7 @@ i32.store local.get $0 i32.const 0 - i32.const 11 + i32.const 13 call $~lib/rt/itcms/__new local.tee $0 i32.store @@ -2106,14 +2108,20 @@ block $bindings/esm/NonPlainObject block $~lib/array/Array<~lib/string/String> block $bindings/esm/PlainObject - block $~lib/staticarray/StaticArray - block $~lib/string/String - block $~lib/arraybuffer/ArrayBuffer - local.get $0 - i32.const 8 - i32.sub - i32.load - br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $folding-inner1 $folding-inner0 $folding-inner0 $folding-inner0 $~lib/staticarray/StaticArray $folding-inner1 $bindings/esm/PlainObject $folding-inner0 $~lib/array/Array<~lib/string/String> $bindings/esm/NonPlainObject $invalid + block $~lib/staticarray/StaticArray + block $~lib/staticarray/StaticArray + block $~lib/staticarray/StaticArray + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $folding-inner1 $folding-inner0 $folding-inner0 $folding-inner0 $~lib/staticarray/StaticArray $~lib/staticarray/StaticArray $~lib/staticarray/StaticArray $folding-inner1 $bindings/esm/PlainObject $folding-inner0 $~lib/array/Array<~lib/string/String> $bindings/esm/NonPlainObject $invalid + end + return + end + return end return end @@ -2212,11 +2220,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s if - i32.const 18560 - i32.const 18608 + i32.const 18576 + i32.const 18624 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2254,7 +2262,7 @@ memory.size i32.const 16 i32.shl - i32.const 18532 + i32.const 18548 i32.sub i32.const 1 i32.shr_u @@ -2295,7 +2303,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2310,7 +2318,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2334,7 +2342,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2385,8 +2393,8 @@ local.get $5 return end - i32.const 18560 - i32.const 18608 + i32.const 18576 + i32.const 18624 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2399,11 +2407,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s if - i32.const 18560 - i32.const 18608 + i32.const 18576 + i32.const 18624 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2432,7 +2440,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2447,7 +2455,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2482,8 +2490,8 @@ global.set $~lib/memory/__stack_pointer return end - i32.const 18560 - i32.const 18608 + i32.const 18576 + i32.const 18624 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2501,7 +2509,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner1 global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner1 global.get $~lib/memory/__stack_pointer @@ -2516,7 +2524,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner1 global.get $~lib/memory/__stack_pointer @@ -2541,7 +2549,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner00 global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner00 global.get $~lib/memory/__stack_pointer @@ -2560,7 +2568,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner00 global.get $~lib/memory/__stack_pointer @@ -2737,8 +2745,8 @@ local.get $2 return end - i32.const 18560 - i32.const 18608 + i32.const 18576 + i32.const 18624 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2754,7 +2762,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner1 global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner1 global.get $~lib/memory/__stack_pointer @@ -2771,7 +2779,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2797,7 +2805,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2899,13 +2907,40 @@ global.set $~lib/memory/__stack_pointer return end - i32.const 18560 - i32.const 18608 + i32.const 18576 + i32.const 18624 i32.const 1 i32.const 1 call $~lib/builtins/abort unreachable ) + (func $export:bindings/esm/staticarrayU16 (param $0 i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2164 + i32.lt_s + if + i32.const 18576 + i32.const 18624 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.tee $1 + local.get $0 + i32.store + local.get $1 + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + ) (func $export:bindings/esm/arrayFunction (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) @@ -2918,7 +2953,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner1 global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner1 global.get $~lib/memory/__stack_pointer @@ -2937,7 +2972,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2955,7 +2990,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2964,7 +2999,7 @@ i64.store local.get $0 i32.const 16 - i32.const 7 + i32.const 9 call $~lib/rt/itcms/__new local.tee $2 i32.store @@ -3090,8 +3125,8 @@ global.set $~lib/memory/__stack_pointer return end - i32.const 18560 - i32.const 18608 + i32.const 18576 + i32.const 18624 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3106,7 +3141,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner1 global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner1 global.get $~lib/memory/__stack_pointer @@ -3123,7 +3158,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -3135,7 +3170,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -3144,7 +3179,7 @@ i32.store local.get $3 i32.const 68 - i32.const 8 + i32.const 10 call $~lib/rt/itcms/__new local.tee $3 i32.store @@ -3232,8 +3267,8 @@ global.set $~lib/memory/__stack_pointer return end - i32.const 18560 - i32.const 18608 + i32.const 18576 + i32.const 18624 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3246,11 +3281,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2148 + i32.const 2164 i32.lt_s if - i32.const 18560 - i32.const 18608 + i32.const 18576 + i32.const 18624 i32.const 1 i32.const 1 call $~lib/builtins/abort