diff options
author | Heejin Ahn <aheejin@gmail.com> | 2021-02-18 04:36:56 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-02-18 04:36:56 +0900 |
commit | 1254b564b2d36cbf96ef8b8fe0c17fa2fa668ae3 (patch) | |
tree | 3cac90d2bffe8eed22ee8a857c9b1123b1235566 /test/exception-handling.wast.from-wast | |
parent | 1d3f578d5dc26fc8ea83ea851ac0f1100a3cbad6 (diff) | |
download | binaryen-1254b564b2d36cbf96ef8b8fe0c17fa2fa668ae3.tar.gz binaryen-1254b564b2d36cbf96ef8b8fe0c17fa2fa668ae3.tar.bz2 binaryen-1254b564b2d36cbf96ef8b8fe0c17fa2fa668ae3.zip |
[EH] Make rethrow's target a try label (#3568)
I was previously mistaken about `rethrow`'s argument rule and thought
it only counted `catch`'s depth. But it turns out it follows the same
rule `delegate`'s label: the immediate argument follows the same rule as
when computing branch labels, but it only can target `try` labels
(semantically it targets that `try`'s corresponding `catch`); otherwise
it will be a validation failure. Unlike `delegate`, `rethrow`'s label
denotes not where to rethrow, but which exception to rethrow. For
example,
```wasm
try $l0
catch ($l0)
try $l1
catch ($l1)
rethrow $l0 ;; rethrow the exception caught by 'catch ($l0)'
end
end
```
Refer to this comment for the more detailed informal semantics:
https://github.com/WebAssembly/exception-handling/issues/146#issuecomment-777714491
---
This also reverts some of `delegateTarget` -> `exceptionTarget` changes
done in #3562 in the validator. Label validation rules apply differently
for `delegate` and `rethrow` for try-catch. For example, this is valid:
```wasm
try $l0
try
delegate $l0
catch ($l0)
end
```
But this is NOT valid:
```wasm
try $l0
catch ($l0)
try
delegate $l0
end
```
So `try`'s label should be used within try-catch range (not catch-end
range) for `delegate`s.
But for the `rethrow` the rule is different. For example, this is valid:
```wasm
try $l0
catch ($l0)
rethrow $l0
end
```
But this is NOT valid:
```wasm
try $l0
rethrow $l0
catch ($l0)
end
```
So the `try`'s label should be used within catch-end range instead.
Diffstat (limited to 'test/exception-handling.wast.from-wast')
-rw-r--r-- | test/exception-handling.wast.from-wast | 145 |
1 files changed, 120 insertions, 25 deletions
diff --git a/test/exception-handling.wast.from-wast b/test/exception-handling.wast.from-wast index 5a0a1249d..c397edcd8 100644 --- a/test/exception-handling.wast.from-wast +++ b/test/exception-handling.wast.from-wast @@ -169,19 +169,6 @@ ) ) ) - (try $try10 - (do - (throw $e-i32 - (i32.const 0) - ) - ) - (catch $e-i32 - (drop - (pop i32) - ) - (rethrow 0) - ) - ) ) (func $delegate-test (try $l0 @@ -192,7 +179,7 @@ ) (delegate $l0) ) - (try $try11 + (try $try10 (do (call $foo) ) @@ -203,24 +190,24 @@ (nop) ) ) - (block $l015 - (try $l012 + (block $l014 + (try $l011 (do - (try $try13 + (try $try12 (do - (br_if $l015 + (br_if $l014 (i32.const 1) ) ) - (delegate $l012) + (delegate $l011) ) - (try $try14 + (try $try13 (do - (br_if $l015 + (br_if $l014 (i32.const 1) ) ) - (delegate $l012) + (delegate $l011) ) ) (catch_all @@ -228,16 +215,124 @@ ) ) ) - (try $l016 + (try $l015 (do - (try $try17 + (try $try16 (do (call $foo) ) - (delegate $l016) + (delegate $l015) ) ) (delegate 0) ) ) + (func $rethrow-test + (try $l0 + (do + (call $foo) + ) + (catch $e-i32 + (drop + (pop i32) + ) + (rethrow $l0) + ) + (catch_all + (rethrow $l0) + ) + ) + (block $l018 + (try $l017 + (do + (call $foo) + ) + (catch $e-i32 + (drop + (pop i32) + ) + (rethrow $l017) + ) + (catch_all + (br $l018) + ) + ) + ) + (try $l019 + (do + (call $foo) + ) + (catch_all + (try $try + (do + (call $foo) + ) + (catch $e-i32 + (drop + (pop i32) + ) + (rethrow $l019) + ) + (catch_all + (rethrow $l019) + ) + ) + ) + ) + (try $l020 + (do + (call $foo) + ) + (catch_all + (try $try21 + (do + (call $foo) + ) + (catch $e-i32 + (drop + (pop i32) + ) + (block $b0 + (rethrow $l020) + ) + ) + (catch_all + (block $b1 + (rethrow $l020) + ) + ) + ) + ) + ) + (try $l022 + (do + (call $foo) + ) + (catch_all + (try $try23 + (do + (rethrow $l022) + ) + (catch_all + (nop) + ) + ) + ) + ) + (try $l024 + (do + (call $foo) + ) + (catch_all + (try $try25 + (do + (rethrow $l024) + ) + (catch_all + (nop) + ) + ) + ) + ) + ) ) |