summaryrefslogtreecommitdiff
path: root/src/wasm/wasm-ir-builder.cpp
diff options
context:
space:
mode:
authorThomas Lively <tlively@google.com>2024-01-25 12:32:34 -0800
committerGitHub <noreply@github.com>2024-01-25 12:32:34 -0800
commitc0e688ed0963605e062dfb00d681602bd8dc96d2 (patch)
tree84f6717df74db8dec8671947b64e060566e01df5 /src/wasm/wasm-ir-builder.cpp
parent6453fd55a312779c2f0d9451d325646522a85470 (diff)
downloadbinaryen-c0e688ed0963605e062dfb00d681602bd8dc96d2.tar.gz
binaryen-c0e688ed0963605e062dfb00d681602bd8dc96d2.tar.bz2
binaryen-c0e688ed0963605e062dfb00d681602bd8dc96d2.zip
[Parser] Parse try_table (#6237)
Diffstat (limited to 'src/wasm/wasm-ir-builder.cpp')
-rw-r--r--src/wasm/wasm-ir-builder.cpp27
1 files changed, 26 insertions, 1 deletions
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<Expression*> 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<Name>& tags,
+ const std::vector<Index>& labels,
+ const std::vector<bool>& isRefs) {
+ auto* trytable = wasm.allocator.alloc<TryTable>();
+ 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);