diff options
Diffstat (limited to 'src/wasm/wasm-binary.cpp')
-rw-r--r-- | src/wasm/wasm-binary.cpp | 37 |
1 files changed, 26 insertions, 11 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index b1f4b8907..767e0c2ab 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -4032,8 +4032,12 @@ BinaryConsts::ASTNodes WasmBinaryBuilder::readExpression(Expression*& curr) { } if (opcode == BinaryConsts::RefAsFunc || opcode == BinaryConsts::RefAsData || - opcode == BinaryConsts::RefAsI31 || - opcode == BinaryConsts::ExternInternalize || + opcode == BinaryConsts::RefAsI31) { + visitRefAsCast((curr = allocator.alloc<RefCast>())->cast<RefCast>(), + opcode); + break; + } + if (opcode == BinaryConsts::ExternInternalize || opcode == BinaryConsts::ExternExternalize) { visitRefAs((curr = allocator.alloc<RefAs>())->cast<RefAs>(), opcode); break; @@ -6910,6 +6914,26 @@ bool WasmBinaryBuilder::maybeVisitRefTest(Expression*& out, uint32_t code) { return false; } +void WasmBinaryBuilder::visitRefAsCast(RefCast* curr, uint32_t code) { + // TODO: These instructions are deprecated. Remove them. + switch (code) { + case BinaryConsts::RefAsFunc: + curr->type = Type(HeapType::func, NonNullable); + break; + case BinaryConsts::RefAsData: + curr->type = Type(HeapType::data, NonNullable); + break; + case BinaryConsts::RefAsI31: + curr->type = Type(HeapType::i31, NonNullable); + break; + default: + WASM_UNREACHABLE("unexpected ref.as*"); + } + curr->ref = popNonVoidExpression(); + curr->safety = RefCast::Safe; + curr->finalize(); +} + bool WasmBinaryBuilder::maybeVisitRefCast(Expression*& out, uint32_t code) { if (code == BinaryConsts::RefCastStatic || code == BinaryConsts::RefCast || code == BinaryConsts::RefCastNull || code == BinaryConsts::RefCastNop) { @@ -7439,15 +7463,6 @@ void WasmBinaryBuilder::visitRefAs(RefAs* curr, uint8_t code) { case BinaryConsts::RefAsNonNull: curr->op = RefAsNonNull; break; - case BinaryConsts::RefAsFunc: - curr->op = RefAsFunc; - break; - case BinaryConsts::RefAsData: - curr->op = RefAsData; - break; - case BinaryConsts::RefAsI31: - curr->op = RefAsI31; - break; case BinaryConsts::ExternInternalize: curr->op = ExternInternalize; break; |