From c0e688ed0963605e062dfb00d681602bd8dc96d2 Mon Sep 17 00:00:00 2001 From: Thomas Lively Date: Thu, 25 Jan 2024 12:32:34 -0800 Subject: [Parser] Parse try_table (#6237) --- src/wasm/wasm-ir-builder.cpp | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) (limited to 'src/wasm/wasm-ir-builder.cpp') diff --git a/src/wasm/wasm-ir-builder.cpp b/src/wasm/wasm-ir-builder.cpp index dc80d6af5..14b9046ef 100644 --- a/src/wasm/wasm-ir-builder.cpp +++ b/src/wasm/wasm-ir-builder.cpp @@ -624,6 +624,11 @@ Result<> IRBuilder::visitTryStart(Try* tryy, Name label) { return Ok{}; } +Result<> IRBuilder::visitTryTableStart(TryTable* trytable, Name label) { + pushScope(ScopeCtx::makeTryTable(trytable, label)); + return Ok{}; +} + Result IRBuilder::finishScope(Block* block) { if (scopeStack.empty() || scopeStack.back().isNone()) { return Err{"unexpected end of scope"}; @@ -895,6 +900,10 @@ Result<> IRBuilder::visitEnd() { tryy->catchBodies.push_back(*expr); tryy->finalize(tryy->type); push(maybeWrapForLabel(tryy)); + } else if (auto* trytable = scope.getTryTable()) { + trytable->body = *expr; + trytable->finalize(trytable->type, &wasm); + push(maybeWrapForLabel(trytable)); } else { WASM_UNREACHABLE("unexpected scope kind"); } @@ -1347,7 +1356,23 @@ Result<> IRBuilder::makeTry(Name label, Type type) { return visitTryStart(tryy, label); } -// Result<> IRBuilder::makeTryTable() {} +Result<> IRBuilder::makeTryTable(Name label, + Type type, + const std::vector& tags, + const std::vector& labels, + const std::vector& isRefs) { + auto* trytable = wasm.allocator.alloc(); + trytable->type = type; + trytable->catchTags.set(tags); + trytable->catchRefs.set(isRefs); + trytable->catchDests.reserve(labels.size()); + for (auto label : labels) { + auto name = getLabelName(label); + CHECK_ERR(name); + trytable->catchDests.push_back(*name); + } + return visitTryTableStart(trytable, label); +} Result<> IRBuilder::makeThrow(Name tag) { Throw curr(wasm.allocator); -- cgit v1.2.3