diff options
Diffstat (limited to 'src/wasm/wasm-binary.cpp')
-rw-r--r-- | src/wasm/wasm-binary.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index 04dad3c9c..7e72b056f 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -2791,6 +2791,8 @@ void WasmBinaryBuilder::processNames() { callIndirect->table = getTableName(index); } else if (auto* get = ref->dynCast<TableGet>()) { get->table = getTableName(index); + } else if (auto* set = ref->dynCast<TableSet>()) { + set->table = getTableName(index); } else { WASM_UNREACHABLE("Invalid type in table references"); } @@ -3524,6 +3526,9 @@ BinaryConsts::ASTNodes WasmBinaryBuilder::readExpression(Expression*& curr) { case BinaryConsts::TableGet: visitTableGet((curr = allocator.alloc<TableGet>())->cast<TableGet>()); break; + case BinaryConsts::TableSet: + visitTableSet((curr = allocator.alloc<TableSet>())->cast<TableSet>()); + break; case BinaryConsts::Try: visitTryOrTryInBlock(curr); break; @@ -6217,6 +6222,19 @@ void WasmBinaryBuilder::visitTableGet(TableGet* curr) { tableRefs[tableIdx].push_back(curr); } +void WasmBinaryBuilder::visitTableSet(TableSet* curr) { + BYN_TRACE("zz node: TableSet\n"); + Index tableIdx = getU32LEB(); + if (tableIdx >= tables.size()) { + throwError("bad table index"); + } + curr->value = popNonVoidExpression(); + curr->index = popNonVoidExpression(); + 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>(); |