@@ -51,6 +51,29 @@ static_assert(sizeof(BinaryenLiteral) == sizeof(Literal),
5151BinaryenLiteral toBinaryenLiteral (Literal x) {
5252 BinaryenLiteral ret;
5353 ret.type = x.type .getID ();
54+ if (x.type .isRef ()) {
55+ auto heapType = x.type .getHeapType ();
56+ if (heapType.isBasic ()) {
57+ switch (heapType.getBasic ()) {
58+ case HeapType::func:
59+ ret.func = x.isNull () ? nullptr : x.getFunc ().c_str ();
60+ break ;
61+ case HeapType::any:
62+ case HeapType::eq:
63+ assert (x.isNull () && " unexpected non-null reference type literal" );
64+ break ;
65+ case HeapType::i31:
66+ case HeapType::data:
67+ case HeapType::string:
68+ case HeapType::stringview_wtf8:
69+ case HeapType::stringview_wtf16:
70+ case HeapType::stringview_iter:
71+ WASM_UNREACHABLE (" TODO: reftypes" );
72+ }
73+ return ret;
74+ }
75+ WASM_UNREACHABLE (" TODO: reftypes" );
76+ }
5477 TODO_SINGLE_COMPOUND (x.type );
5578 switch (x.type .getBasic ()) {
5679 case Type::i32 :
@@ -68,16 +91,6 @@ BinaryenLiteral toBinaryenLiteral(Literal x) {
6891 case Type::v128:
6992 memcpy (&ret.v128 , x.getv128Ptr (), 16 );
7093 break ;
71- case Type::funcref:
72- ret.func = x.isNull () ? nullptr : x.getFunc ().c_str ();
73- break ;
74- case Type::anyref:
75- case Type::eqref:
76- assert (x.isNull () && " unexpected non-null reference type literal" );
77- break ;
78- case Type::i31ref:
79- case Type::dataref:
80- WASM_UNREACHABLE (" TODO: reftypes" );
8194 case Type::none:
8295 case Type::unreachable:
8396 WASM_UNREACHABLE (" unexpected type" );
@@ -86,7 +99,30 @@ BinaryenLiteral toBinaryenLiteral(Literal x) {
8699}
87100
88101Literal fromBinaryenLiteral (BinaryenLiteral x) {
89- switch (x.type ) {
102+ auto type = Type (x.type );
103+ if (type.isRef ()) {
104+ auto heapType = type.getHeapType ();
105+ if (type.isNullable ()) {
106+ return Literal::makeNull (heapType);
107+ }
108+ if (heapType.isBasic ()) {
109+ switch (heapType.getBasic ()) {
110+ case HeapType::func:
111+ return Literal::makeFunc (x.func );
112+ case HeapType::any:
113+ case HeapType::eq:
114+ case HeapType::i31:
115+ case HeapType::data:
116+ case HeapType::string:
117+ case HeapType::stringview_wtf8:
118+ case HeapType::stringview_wtf16:
119+ case HeapType::stringview_iter:
120+ WASM_UNREACHABLE (" TODO: reftypes" );
121+ }
122+ }
123+ }
124+ assert (type.isBasic ());
125+ switch (type.getBasic ()) {
90126 case Type::i32 :
91127 return Literal (x.i32 );
92128 case Type::i64 :
@@ -97,14 +133,6 @@ Literal fromBinaryenLiteral(BinaryenLiteral x) {
97133 return Literal (x.i64 ).castToF64 ();
98134 case Type::v128:
99135 return Literal (x.v128 );
100- case Type::funcref:
101- return Literal::makeFunc (x.func );
102- case Type::anyref:
103- case Type::eqref:
104- return Literal::makeNull (Type (x.type ).getHeapType ());
105- case Type::i31ref:
106- case Type::dataref:
107- WASM_UNREACHABLE (" TODO: reftypes" );
108136 case Type::none:
109137 case Type::unreachable:
110138 WASM_UNREACHABLE (" unexpected type" );
@@ -137,12 +165,24 @@ BinaryenType BinaryenTypeInt64(void) { return Type::i64; }
137165BinaryenType BinaryenTypeFloat32 (void ) { return Type::f32 ; }
138166BinaryenType BinaryenTypeFloat64 (void ) { return Type::f64 ; }
139167BinaryenType BinaryenTypeVec128 (void ) { return Type::v128; }
140- BinaryenType BinaryenTypeFuncref (void ) { return Type::funcref; }
141- BinaryenType BinaryenTypeExternref (void ) { return Type::anyref; }
142- BinaryenType BinaryenTypeAnyref (void ) { return Type::anyref; }
143- BinaryenType BinaryenTypeEqref (void ) { return Type::eqref; }
144- BinaryenType BinaryenTypeI31ref (void ) { return Type::i31ref; }
145- BinaryenType BinaryenTypeDataref (void ) { return Type::dataref; }
168+ BinaryenType BinaryenTypeFuncref (void ) {
169+ return Type (HeapType::func, Nullable).getID ();
170+ }
171+ BinaryenType BinaryenTypeExternref (void ) {
172+ return Type (HeapType::any, Nullable).getID ();
173+ }
174+ BinaryenType BinaryenTypeAnyref (void ) {
175+ return Type (HeapType::any, Nullable).getID ();
176+ }
177+ BinaryenType BinaryenTypeEqref (void ) {
178+ return Type (HeapType::eq, Nullable).getID ();
179+ }
180+ BinaryenType BinaryenTypeI31ref (void ) {
181+ return Type (HeapType::i31, NonNullable).getID ();
182+ }
183+ BinaryenType BinaryenTypeDataref (void ) {
184+ return Type (HeapType::data, NonNullable).getID ();
185+ }
146186BinaryenType BinaryenTypeUnreachable (void ) { return Type::unreachable; }
147187BinaryenType BinaryenTypeAuto (void ) { return uintptr_t (-1 ); }
148188
0 commit comments