diff options
Diffstat (limited to 'test/passes/code-pushing_all-features.wast')
-rw-r--r-- | test/passes/code-pushing_all-features.wast | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/test/passes/code-pushing_all-features.wast b/test/passes/code-pushing_all-features.wast new file mode 100644 index 000000000..f24456c6d --- /dev/null +++ b/test/passes/code-pushing_all-features.wast @@ -0,0 +1,63 @@ +(module + (event $e (attr 0) (param i32)) + + (func $cant-push-past-call + (local $x i32) + (block $out + ;; This local.set cannot be pushed down, because the call below can throw + (local.set $x (i32.const 1)) + (call $cant-push-past-call) + (drop (i32.const 1)) + (br_if $out (i32.const 2)) + (drop (local.get $x)) + ) + ) + + (func $cant-push-past-throw + (local $x i32) + (block $out + ;; This local.set cannot be pushed down, because there is 'throw' below + (local.set $x (i32.const 1)) + (throw $e (i32.const 0)) + (drop (i32.const 1)) + (br_if $out (i32.const 2)) + (drop (local.get $x)) + ) + ) + + (func $can-push-past-throw-within-try + (local $x i32) + (block $out + ;; This local.set can be pushed down, because the 'throw' below is going + ;; to be caught by the inner catch + (local.set $x (i32.const 1)) + (try + (throw $e (i32.const 0)) + (catch + (drop (exnref.pop)) + ) + ) + (drop (i32.const 1)) + (br_if $out (i32.const 2)) + (drop (local.get $x)) + ) + ) + + (func $cant-push-past-rethrow-within-catch + (local $x i32) + (block $out + ;; This local.set cannot be pushed down, because there is 'rethrow' within + ;; the inner catch + (local.set $x (i32.const 1)) + (try + (throw $e (i32.const 0)) + (catch + (rethrow (exnref.pop)) + ) + ) + (drop (i32.const 1)) + (br_if $out (i32.const 2)) + (drop (local.get $x)) + ) + ) +) |