Skip to content

Commit 78b2d1a

Browse files
authored
Implement preliminary creation of Wasm GC types (#2537)
1 parent a2c1c97 commit 78b2d1a

File tree

321 files changed

+13196
-12762
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

321 files changed

+13196
-12762
lines changed

package-lock.json

+7-8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
},
2626
"engineStrict": true,
2727
"dependencies": {
28-
"binaryen": "110.0.0-nightly.20221006",
28+
"binaryen": "110.0.0-nightly.20221019",
2929
"long": "^5.2.0"
3030
},
3131
"devDependencies": {

src/builtins.ts

+2
Original file line numberDiff line numberDiff line change
@@ -3492,6 +3492,7 @@ function builtin_assert(ctx: BuiltinContext): ExpressionRef {
34923492
case TypeKind.ANYREF:
34933493
case TypeKind.EQREF:
34943494
case TypeKind.DATAREF:
3495+
case TypeKind.ARRAYREF:
34953496
case TypeKind.I31REF:
34963497
case TypeKind.STRINGREF:
34973498
case TypeKind.STRINGVIEW_WTF8:
@@ -3578,6 +3579,7 @@ function builtin_assert(ctx: BuiltinContext): ExpressionRef {
35783579
case TypeKind.ANYREF:
35793580
case TypeKind.EQREF:
35803581
case TypeKind.DATAREF:
3582+
case TypeKind.ARRAYREF:
35813583
case TypeKind.I31REF:
35823584
case TypeKind.STRINGREF:
35833585
case TypeKind.STRINGVIEW_WTF8:

src/common.ts

+2
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ export namespace CommonNames {
132132
export const eqref = "eqref";
133133
export const i31ref = "i31ref";
134134
export const dataref = "dataref";
135+
export const arrayref = "arrayref";
135136
export const stringref = "stringref";
136137
export const stringview_wtf8 = "stringview_wtf8";
137138
export const stringview_wtf16 = "stringview_wtf16";
@@ -212,6 +213,7 @@ export namespace CommonNames {
212213
export const Eqref = "Eqref";
213214
export const I31ref = "I31ref";
214215
export const Dataref = "Dataref";
216+
export const Arrayref = "Arrayref";
215217
export const String = "String";
216218
export const RegExp = "RegExp";
217219
export const Object = "Object";

src/compiler.ts

+14-6
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ import {
5454
ExpressionRunnerFlags,
5555
isConstZero,
5656
isConstNegZero,
57-
isConstExpressionNaN
57+
isConstExpressionNaN,
58+
ensureType
5859
} from "./module";
5960

6061
import {
@@ -4869,7 +4870,8 @@ export class Compiler extends DiagnosticEmitter {
48694870
}
48704871
case TypeKind.EQREF:
48714872
case TypeKind.I31REF:
4872-
case TypeKind.DATAREF: return module.ref_eq(leftExpr, rightExpr);
4873+
case TypeKind.DATAREF:
4874+
case TypeKind.ARRAYREF: return module.ref_eq(leftExpr, rightExpr);
48734875
case TypeKind.STRINGREF: return module.string_eq(leftExpr, rightExpr);
48744876
case TypeKind.STRINGVIEW_WTF8:
48754877
case TypeKind.STRINGVIEW_WTF16:
@@ -4918,7 +4920,8 @@ export class Compiler extends DiagnosticEmitter {
49184920
}
49194921
case TypeKind.EQREF:
49204922
case TypeKind.I31REF:
4921-
case TypeKind.DATAREF: {
4923+
case TypeKind.DATAREF:
4924+
case TypeKind.ARRAYREF: {
49224925
return module.unary(UnaryOp.EqzI32,
49234926
module.ref_eq(leftExpr, rightExpr)
49244927
);
@@ -7612,8 +7615,11 @@ export class Compiler extends DiagnosticEmitter {
76127615
return module.unreachable();
76137616
}
76147617
if (contextualType.isExternalReference) {
7618+
// TODO: Concrete function types currently map to first class functions implemented in
7619+
// linear memory (on top of `usize`), leaving only generic `funcref` for use here. In the
7620+
// future, once functions become Wasm GC objects, the actual signature type can be used.
76157621
this.currentType = Type.funcref;
7616-
return module.ref_func(functionInstance.internalName, TypeRef.Funcref); // TODO
7622+
return module.ref_func(functionInstance.internalName, ensureType(functionInstance.type));
76177623
}
76187624
let offset = this.ensureRuntimeFunction(functionInstance);
76197625
this.currentType = functionInstance.signature.type;
@@ -9854,7 +9860,8 @@ export class Compiler extends DiagnosticEmitter {
98549860
case TypeKind.ANYREF:
98559861
case TypeKind.EQREF:
98569862
case TypeKind.I31REF:
9857-
case TypeKind.DATAREF: {
9863+
case TypeKind.DATAREF:
9864+
case TypeKind.ARRAYREF: {
98589865
return this.checkFeatureEnabled(Feature.REFERENCE_TYPES, reportNode)
98599866
&& this.checkFeatureEnabled(Feature.GC, reportNode);
98609867
}
@@ -9970,7 +9977,8 @@ export class Compiler extends DiagnosticEmitter {
99709977
case TypeKind.EXTERNREF:
99719978
case TypeKind.ANYREF:
99729979
case TypeKind.EQREF:
9973-
case TypeKind.DATAREF:
9980+
case TypeKind.DATAREF:
9981+
case TypeKind.ARRAYREF:
99749982
case TypeKind.STRINGREF:
99759983
case TypeKind.STRINGVIEW_WTF8:
99769984
case TypeKind.STRINGVIEW_WTF16:

src/flow.ts

+7
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,7 @@ export class Flow {
339339
case <u32>TypeRef.Eqref: { temps = parentFunction.tempEqrefs; break; }
340340
case <u32>TypeRef.I31ref: { temps = parentFunction.tempI31refs; break; }
341341
case <u32>TypeRef.Dataref: { temps = parentFunction.tempDatarefs; break; }
342+
case <u32>TypeRef.Arrayref: { temps = parentFunction.tempArrayrefs; break; }
342343
default: throw new Error("concrete type expected");
343344
}
344345
var local: Local;
@@ -446,6 +447,12 @@ export class Flow {
446447
else parentFunction.tempDatarefs = temps = [];
447448
break;
448449
}
450+
case <u32>TypeRef.Arrayref: {
451+
let tempArrayrefs = parentFunction.tempArrayrefs;
452+
if (tempArrayrefs) temps = tempArrayrefs;
453+
else parentFunction.tempArrayrefs = temps = [];
454+
break;
455+
}
449456
default: throw new Error("concrete type expected");
450457
}
451458
temps.push(local);

src/glue/binaryen.d.ts

+13-2
Original file line numberDiff line numberDiff line change
@@ -56,21 +56,32 @@ export declare function _BinaryenTypeAnyref(): TypeRef;
5656
export declare function _BinaryenTypeEqref(): TypeRef;
5757
export declare function _BinaryenTypeI31ref(): TypeRef;
5858
export declare function _BinaryenTypeDataref(): TypeRef;
59+
export declare function _BinaryenTypeArrayref(): TypeRef;
5960
export declare function _BinaryenTypeStringref(): TypeRef;
6061
export declare function _BinaryenTypeStringviewWTF8(): TypeRef;
6162
export declare function _BinaryenTypeStringviewWTF16(): TypeRef;
6263
export declare function _BinaryenTypeStringviewIter(): TypeRef;
64+
export declare function _BinaryenTypeNullref(): TypeRef;
65+
export declare function _BinaryenTypeNullExternref(): TypeRef;
66+
export declare function _BinaryenTypeNullFuncref(): TypeRef;
6367

6468
export declare function _BinaryenHeapTypeFunc(): HeapTypeRef;
6569
export declare function _BinaryenHeapTypeExt(): HeapTypeRef;
6670
export declare function _BinaryenHeapTypeAny(): HeapTypeRef;
6771
export declare function _BinaryenHeapTypeEq(): HeapTypeRef;
6872
export declare function _BinaryenHeapTypeI31(): HeapTypeRef;
6973
export declare function _BinaryenHeapTypeData(): HeapTypeRef;
74+
export declare function _BinaryenHeapTypeArray(): HeapTypeRef;
7075
export declare function _BinaryenHeapTypeString(): HeapTypeRef;
7176
export declare function _BinaryenHeapTypeStringviewWTF8(): HeapTypeRef;
7277
export declare function _BinaryenHeapTypeStringviewWTF16(): HeapTypeRef;
7378
export declare function _BinaryenHeapTypeStringviewIter(): HeapTypeRef;
79+
export declare function _BinaryenHeapTypeNone(): HeapTypeRef;
80+
export declare function _BinaryenHeapTypeNoext(): HeapTypeRef;
81+
export declare function _BinaryenHeapTypeNofunc(): HeapTypeRef;
82+
83+
export declare function _BinaryenHeapTypeIsBottom(heapType: HeapTypeRef): bool;
84+
export declare function _BinaryenHeapTypeGetBottom(heapType: HeapTypeRef): HeapTypeRef;
7485

7586
export declare function _BinaryenModuleCreate(): ModuleRef;
7687
export declare function _BinaryenModuleDispose(module: ModuleRef): void;
@@ -594,7 +605,7 @@ export declare function _BinaryenStructSetSetValue(expr: ExpressionRef, valueExp
594605
export declare function _BinaryenArrayNew(module: ModuleRef, type: HeapTypeRef, size: ExpressionRef, init: ExpressionRef): ExpressionRef;
595606
export declare function _BinaryenArrayNewGetInit(expr: ExpressionRef): ExpressionRef;
596607
export declare function _BinaryenArrayNewSetInit(expr: ExpressionRef, initExpr: ExpressionRef): void;
597-
export declare function _BinaryenArrayNewGetSize(expr: ExpressionRef): ExpressionRef;
608+
export declare function _BinaryenArrayNewGetSize(expr: ExpressionRef): ExpressionRef;
598609
export declare function _BinaryenArrayNewSetSize(expr: ExpressionRef, sizeExpr: ExpressionRef): void;
599610

600611
export declare function _BinaryenArrayInit(module: ModuleRef, type: HeapTypeRef, values: ArrayRef<ExpressionRef>, numValues: Index): ExpressionRef;
@@ -605,7 +616,7 @@ export declare function _BinaryenArrayInitAppendValue(expr: ExpressionRef, value
605616
export declare function _BinaryenArrayInitInsertValueAt(expr: ExpressionRef, index: Index, valueExpr: ExpressionRef): void;
606617
export declare function _BinaryenArrayInitRemoveValueAt(expr: ExpressionRef, index: Index): ExpressionRef;
607618

608-
export declare function _BinaryenArrayGet(module: ModuleRef, ref: ExpressionRef, index: ExpressionRef, signed: bool): ExpressionRef;
619+
export declare function _BinaryenArrayGet(module: ModuleRef, ref: ExpressionRef, index: ExpressionRef, type: TypeRef, signed: bool): ExpressionRef;
609620
export declare function _BinaryenArrayGetGetRef(expr: ExpressionRef): ExpressionRef;
610621
export declare function _BinaryenArrayGetSetRef(expr: ExpressionRef, refExpr: ExpressionRef): void;
611622
export declare function _BinaryenArrayGetGetIndex(expr: ExpressionRef): ExpressionRef;

src/glue/binaryen.js

+11
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,32 @@ export const {
1919
_BinaryenTypeEqref,
2020
_BinaryenTypeI31ref,
2121
_BinaryenTypeDataref,
22+
_BinaryenTypeArrayref,
2223
_BinaryenTypeStringref,
2324
_BinaryenTypeStringviewWTF8,
2425
_BinaryenTypeStringviewWTF16,
2526
_BinaryenTypeStringviewIter,
27+
_BinaryenTypeNullref,
28+
_BinaryenTypeNullExternref,
29+
_BinaryenTypeNullFuncref,
2630

2731
_BinaryenHeapTypeFunc,
2832
_BinaryenHeapTypeExt,
2933
_BinaryenHeapTypeAny,
3034
_BinaryenHeapTypeEq,
3135
_BinaryenHeapTypeI31,
3236
_BinaryenHeapTypeData,
37+
_BinaryenHeapTypeArray,
3338
_BinaryenHeapTypeString,
3439
_BinaryenHeapTypeStringviewWTF8,
3540
_BinaryenHeapTypeStringviewWTF16,
3641
_BinaryenHeapTypeStringviewIter,
42+
_BinaryenHeapTypeNone,
43+
_BinaryenHeapTypeNoext,
44+
_BinaryenHeapTypeNofunc,
45+
46+
_BinaryenHeapTypeIsBottom,
47+
_BinaryenHeapTypeGetBottom,
3748

3849
_BinaryenModuleCreate,
3950
_BinaryenModuleDispose,

0 commit comments

Comments
 (0)