diff options
author | Heejin Ahn <aheejin@gmail.com> | 2021-06-10 23:44:57 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-10 23:44:57 -0700 |
commit | ca263c00ec8ff3b7c51d066b273eeee50180091b (patch) | |
tree | 6ee8fa964b5ea8a1dc30cdc1b4e720b6d92d2056 /src/wasm | |
parent | 83ae39af1f8ffe67856b16f7ee13de066169b48f (diff) | |
download | binaryen-ca263c00ec8ff3b7c51d066b273eeee50180091b.tar.gz binaryen-ca263c00ec8ff3b7c51d066b273eeee50180091b.tar.bz2 binaryen-ca263c00ec8ff3b7c51d066b273eeee50180091b.zip |
[EH] Allow catch/delegate-less trys (#3924)
This removes the restriction that `try` should have at least one
`catch`/`catch_all`/`delegate`. See WebAssembly/exception-handling#157.
Diffstat (limited to 'src/wasm')
-rw-r--r-- | src/wasm/wasm-binary.cpp | 12 | ||||
-rw-r--r-- | src/wasm/wasm-s-parser.cpp | 3 | ||||
-rw-r--r-- | src/wasm/wasm-validator.cpp | 3 |
3 files changed, 7 insertions, 11 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index 84834352b..db253fa6e 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -6080,10 +6080,12 @@ void WasmBinaryBuilder::visitTryOrTryInBlock(Expression*& out) { // blocks instead. curr->type = getType(); curr->body = getBlockOrSingleton(curr->type); - if (lastSeparator != BinaryConsts::Catch && - lastSeparator != BinaryConsts::CatchAll && - lastSeparator != BinaryConsts::Delegate) { - throwError("No catch instruction within a try scope"); + + // try without catch or delegate + if (lastSeparator == BinaryConsts::End) { + curr->finalize(); + out = curr; + return; } Builder builder(wasm); @@ -6200,7 +6202,7 @@ void WasmBinaryBuilder::visitTryOrTryInBlock(Expression*& out) { // (catch $e // (block ;; Now this can be deleted when writing binary // ... - // (br $label0) + // (br $label) // ) // ) // ) diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp index 9c2d028a4..8c0fb9b2d 100644 --- a/src/wasm/wasm-s-parser.cpp +++ b/src/wasm/wasm-s-parser.cpp @@ -2470,9 +2470,6 @@ Expression* SExpressionWasmBuilder::makeTry(Element& s) { throw ParseException( "there should be at most one catch_all block at the end", s.line, s.col); } - if (ret->catchBodies.empty() && !ret->isDelegate()) { - throw ParseException("no catch bodies or delegate", s.line, s.col); - } ret->finalize(type); diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp index 6035a38a9..15b17bf26 100644 --- a/src/wasm/wasm-validator.cpp +++ b/src/wasm/wasm-validator.cpp @@ -2078,9 +2078,6 @@ void FunctionValidator::visitTry(Try* curr) { shouldBeFalse(curr->isCatch() && curr->isDelegate(), curr, "try cannot have both catch and delegate at the same time"); - shouldBeTrue(curr->isCatch() || curr->isDelegate(), - curr, - "try should have either catches or a delegate"); if (curr->isDelegate()) { noteDelegate(curr->delegateTarget, curr); |