(module (tag $e-v) (tag $e-i32 (param i32)) (tag $e-f32 (param f32)) (tag $e-i32-f32 (param i32 f32)) (func $throw_single_value (export "throw_single_value") (throw $e-i32 (i32.const 5)) ) (func (export "throw_multiple_values") (throw $e-i32-f32 (i32.const 3) (f32.const 3.5)) ) (func (export "try_table_nothrow") (result i32) (block $tryend (result i32) (drop (block $catch (result i32) (br $tryend (try_table (result i32) (catch $e-i32 $catch) (i32.const 3) ) ) ) ) (i32.const 0) ) ) (func (export "try_table_throw_catch") (result i32) (block $tryend (result i32) (drop (block $catch (result i32) (br $tryend (try_table (result i32) (catch $e-i32 $catch) (throw $e-i32 (i32.const 5)) ) ) ) ) (i32.const 3) ) ) (func (export "try_table_throw_nocatch") (result i32) (block $tryend (result i32) (drop (block $catch (result f32) (br $tryend (try_table (result i32) (catch $e-f32 $catch) (throw $e-i32 (i32.const 5)) ) ) ) ) (i32.const 3) ) ) (func (export "try_table_throw_catchall") (result i32) (block $tryend (result i32) (block $catch-all (drop (block $catch-f32 (result f32) (br $tryend (try_table (result i32) (catch $e-f32 $catch-f32) (catch_all $catch-all) (throw $e-i32 (i32.const 5)) ) ) ) ) (br $tryend (i32.const 4)) ) (i32.const 3) ) ) (func (export "try_table_call_catch") (result i32) (block $tryend (result i32) (block $catch (result i32) (br $tryend (try_table (result i32) (catch $e-i32 $catch) (call $throw_single_value) (unreachable) ) ) ) ) ) (func (export "try_table_throw_multivalue_catch") (result i32) (local $x (tuple i32 f32)) (block $tryend (result i32) (local.set $x (block $catch (result i32) (result f32) (br $tryend (try_table (result i32) (catch $e-i32-f32 $catch) (throw $e-i32-f32 (i32.const 5) (f32.const 1.5)) ) ) ) ) (tuple.extract 2 0 (local.get $x) ) ) ) (func (export "try_table_throw_throw_ref") (local $x (tuple i32 exnref)) (block $tryend (local.set $x (block $catch (result i32) (result exnref) (try_table (catch_ref $e-i32 $catch) (throw $e-i32 (i32.const 5)) ) (br $tryend) ) ) (throw_ref (tuple.extract 2 1 (local.get $x) ) ) ) ) (func (export "try_table_call_throw_ref") (block $tryend (throw_ref (block $catch (result exnref) (try_table (catch_all_ref $catch) (call $throw_single_value) ) (br $tryend) ) ) ) ) ) (assert_exception (invoke "throw_single_value")) (assert_exception (invoke "throw_multiple_values")) (assert_return (invoke "try_table_nothrow") (i32.const 3)) (assert_return (invoke "try_table_throw_catch") (i32.const 3)) (assert_exception (invoke "try_table_throw_nocatch")) (assert_return (invoke "try_table_throw_catchall") (i32.const 3)) (assert_return (invoke "try_table_call_catch") (i32.const 5)) (assert_return (invoke "try_table_throw_multivalue_catch") (i32.const 5)) (assert_exception (invoke "try_table_throw_throw_ref")) (assert_exception (invoke "try_table_call_throw_ref")) (assert_invalid (module (tag $e-i32 (param i32)) (func $f0 (try_table (i32.const 0) ) ) ) "try_table's type does not match try_table body's type" ) (assert_invalid (module (tag $e-i32 (param i32)) (func $f0 (throw $e-i32 (f32.const 0)) ) ) "tag param types must match" ) (assert_invalid (module (tag $e-i32 (param i32 f32)) (func $f0 (throw $e-i32 (f32.const 0)) ) ) "tag's param numbers must match" ) (assert_invalid (module (func $f0 (block $l (try_table (catch $e $l)) ) ) ) "catch's tag name is invalid: e" ) (assert_invalid (module (tag $e (param i32) (result i32)) (func $f0 (throw $e (i32.const 5)) ) ) "tags with result types must not be used for exception handling" ) (assert_invalid (module (tag $e (param i32) (result i32)) (func $f0 (block $l (try_table (catch $e $l)) ) ) ) "catch's tag (e) has result values, which is not allowed for exception handling" )