118 lines
3.2 KiB
WebAssembly Text Format
118 lines
3.2 KiB
WebAssembly Text Format
;; Test throw_ref instruction.
|
|
|
|
(module
|
|
(tag $e0)
|
|
(tag $e1)
|
|
|
|
(func (export "catch-throw_ref-0")
|
|
(block $h (result exnref)
|
|
(try_table (catch_ref $e0 $h) (throw $e0))
|
|
(unreachable)
|
|
)
|
|
(throw_ref)
|
|
)
|
|
|
|
(func (export "catch-throw_ref-1") (param i32) (result i32)
|
|
(block $h (result exnref)
|
|
(try_table (result i32) (catch_ref $e0 $h) (throw $e0))
|
|
(return)
|
|
)
|
|
(if (param exnref) (i32.eqz (local.get 0))
|
|
(then (throw_ref))
|
|
(else (drop))
|
|
)
|
|
(i32.const 23)
|
|
)
|
|
|
|
(func (export "catchall-throw_ref-0")
|
|
(block $h (result exnref)
|
|
(try_table (result exnref) (catch_all_ref $h) (throw $e0))
|
|
)
|
|
(throw_ref)
|
|
)
|
|
|
|
(func (export "catchall-throw_ref-1") (param i32) (result i32)
|
|
(block $h (result exnref)
|
|
(try_table (result i32) (catch_all_ref $h) (throw $e0))
|
|
(return)
|
|
)
|
|
(if (param exnref) (i32.eqz (local.get 0))
|
|
(then (throw_ref))
|
|
(else (drop))
|
|
)
|
|
(i32.const 23)
|
|
)
|
|
|
|
(func (export "throw_ref-nested") (param i32) (result i32)
|
|
(local $exn1 exnref)
|
|
(local $exn2 exnref)
|
|
(block $h1 (result exnref)
|
|
(try_table (result i32) (catch_ref $e1 $h1) (throw $e1))
|
|
(return)
|
|
)
|
|
(local.set $exn1)
|
|
(block $h2 (result exnref)
|
|
(try_table (result i32) (catch_ref $e0 $h2) (throw $e0))
|
|
(return)
|
|
)
|
|
(local.set $exn2)
|
|
(if (i32.eq (local.get 0) (i32.const 0))
|
|
(then (throw_ref (local.get $exn1)))
|
|
)
|
|
(if (i32.eq (local.get 0) (i32.const 1))
|
|
(then (throw_ref (local.get $exn2)))
|
|
)
|
|
(i32.const 23)
|
|
)
|
|
|
|
(func (export "throw_ref-recatch") (param i32) (result i32)
|
|
(local $e exnref)
|
|
(block $h1 (result exnref)
|
|
(try_table (result i32) (catch_ref $e0 $h1) (throw $e0))
|
|
(return)
|
|
)
|
|
(local.set $e)
|
|
(block $h2 (result exnref)
|
|
(try_table (result i32) (catch_ref $e0 $h2)
|
|
(if (i32.eqz (local.get 0))
|
|
(then (throw_ref (local.get $e)))
|
|
)
|
|
(i32.const 42)
|
|
)
|
|
(return)
|
|
)
|
|
(drop) (i32.const 23)
|
|
)
|
|
|
|
(func (export "throw_ref-stack-polymorphism")
|
|
(local $e exnref)
|
|
(block $h (result exnref)
|
|
(try_table (result f64) (catch_ref $e0 $h) (throw $e0))
|
|
(unreachable)
|
|
)
|
|
(local.set $e)
|
|
(i32.const 1)
|
|
(throw_ref (local.get $e))
|
|
)
|
|
)
|
|
|
|
(assert_exception (invoke "catch-throw_ref-0"))
|
|
|
|
(assert_exception (invoke "catch-throw_ref-1" (i32.const 0)))
|
|
(assert_return (invoke "catch-throw_ref-1" (i32.const 1)) (i32.const 23))
|
|
|
|
(assert_exception (invoke "catchall-throw_ref-0"))
|
|
|
|
(assert_exception (invoke "catchall-throw_ref-1" (i32.const 0)))
|
|
(assert_return (invoke "catchall-throw_ref-1" (i32.const 1)) (i32.const 23))
|
|
(assert_exception (invoke "throw_ref-nested" (i32.const 0)))
|
|
(assert_exception (invoke "throw_ref-nested" (i32.const 1)))
|
|
(assert_return (invoke "throw_ref-nested" (i32.const 2)) (i32.const 23))
|
|
|
|
(assert_return (invoke "throw_ref-recatch" (i32.const 0)) (i32.const 23))
|
|
(assert_return (invoke "throw_ref-recatch" (i32.const 1)) (i32.const 42))
|
|
|
|
(assert_exception (invoke "throw_ref-stack-polymorphism"))
|
|
|
|
(assert_invalid (module (func (throw_ref))) "type mismatch")
|
|
(assert_invalid (module (func (block (throw_ref)))) "type mismatch")
|