diff options
Diffstat (limited to 'src/wasm/wasm-binary.cpp')
-rw-r--r-- | src/wasm/wasm-binary.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index cd1cfaa0f..a8eea2808 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -2761,6 +2761,8 @@ void WasmBinaryBuilder::processNames() { for (auto* ref : refs) { if (auto* callIndirect = ref->dynCast<CallIndirect>()) { callIndirect->table = getTableName(index); + } else if (auto* get = ref->dynCast<TableGet>()) { + get->table = getTableName(index); } else { WASM_UNREACHABLE("Invalid type in table references"); } @@ -3491,6 +3493,9 @@ BinaryConsts::ASTNodes WasmBinaryBuilder::readExpression(Expression*& curr) { case BinaryConsts::BrOnNonNull: maybeVisitBrOn(curr, code); break; + case BinaryConsts::TableGet: + visitTableGet((curr = allocator.alloc<TableGet>())->cast<TableGet>()); + break; case BinaryConsts::Try: visitTryOrTryInBlock(curr); break; @@ -4016,6 +4021,7 @@ void WasmBinaryBuilder::visitCallIndirect(CallIndirect* curr) { for (size_t i = 0; i < num; i++) { curr->operands[num - i - 1] = popNonVoidExpression(); } + // Defer setting the table name for later, when we know it. tableRefs[tableIdx].push_back(curr); curr->finalize(); } @@ -6170,6 +6176,19 @@ void WasmBinaryBuilder::visitRefEq(RefEq* curr) { curr->finalize(); } +void WasmBinaryBuilder::visitTableGet(TableGet* curr) { + BYN_TRACE("zz node: TableGet\n"); + Index tableIdx = getU32LEB(); + if (tableIdx >= tables.size()) { + throwError("bad table index"); + } + curr->index = popNonVoidExpression(); + curr->type = tables[tableIdx]->type; + curr->finalize(); + // Defer setting the table name for later, when we know it. + tableRefs[tableIdx].push_back(curr); +} + void WasmBinaryBuilder::visitTryOrTryInBlock(Expression*& out) { BYN_TRACE("zz node: Try\n"); auto* curr = allocator.alloc<Try>(); |