summaryrefslogtreecommitdiff
path: root/test/exception-handling.wast.from-wast
diff options
context:
space:
mode:
authorHeejin Ahn <aheejin@gmail.com>2021-02-18 04:36:56 +0900
committerGitHub <noreply@github.com>2021-02-18 04:36:56 +0900
commit1254b564b2d36cbf96ef8b8fe0c17fa2fa668ae3 (patch)
tree3cac90d2bffe8eed22ee8a857c9b1123b1235566 /test/exception-handling.wast.from-wast
parent1d3f578d5dc26fc8ea83ea851ac0f1100a3cbad6 (diff)
downloadbinaryen-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-wast145
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)
+ )
+ )
+ )
+ )
+ )
)