diff options
Diffstat (limited to 'src/wasm/wasm-binary.cpp')
-rw-r--r-- | src/wasm/wasm-binary.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index fc14510e9..020953c1b 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -3052,6 +3052,12 @@ BinaryConsts::ASTNodes WasmBinaryBuilder::readExpression(Expression*& curr) { visitRefIs((curr = allocator.alloc<RefIs>())->cast<RefIs>(), opcode); break; } + if (opcode == BinaryConsts::RefAsFunc || + opcode == BinaryConsts::RefAsData || + opcode == BinaryConsts::RefAsI31) { + visitRefAs((curr = allocator.alloc<RefAs>())->cast<RefAs>(), opcode); + break; + } throwError("invalid code after GC prefix: " + std::to_string(opcode)); break; } @@ -5971,6 +5977,25 @@ bool WasmBinaryBuilder::maybeVisitArrayLen(Expression*& out, uint32_t code) { return true; } +void WasmBinaryBuilder::visitRefAs(RefAs* curr, uint8_t code) { + BYN_TRACE("zz node: RefAs\n"); + switch (code) { + case BinaryConsts::RefAsFunc: + curr->op = RefAsFunc; + break; + case BinaryConsts::RefAsData: + curr->op = RefAsData; + break; + case BinaryConsts::RefAsI31: + curr->op = RefAsI31; + break; + default: + WASM_UNREACHABLE("invalid code for ref.as_*"); + } + curr->value = popNonVoidExpression(); + curr->finalize(); +} + void WasmBinaryBuilder::throwError(std::string text) { throw ParseException(text, 0, pos); } |