1(module 2 (type $res-i32 (func (result i32))) 3 (table $t2 1 externref) 4 (table $t3 2 funcref) 5 (table $t4 1 (ref null $res-i32)) 6 (elem (table $t3) (i32.const 1) func $returns-five) 7 (func $returns-five (result i32) (i32.const 5)) 8 9 (func (export "get-externref") (param $i i32) (result externref) 10 (table.get $t2 (local.get $i)) 11 ) 12 (func $f3 (export "get-funcref") (param $i i32) (result funcref) 13 (table.get $t3 (local.get $i)) 14 ) 15 (func $f4 (export "get-typed-func") (param $i i32) (result (ref null $res-i32)) 16 (table.get $t4 (local.get $i)) 17 ) 18 19 (func (export "set-externref") (param $i i32) (param $r externref) 20 (table.set $t2 (local.get $i) (local.get $r)) 21 ) 22 (func (export "set-funcref") (param $i i32) (param $r funcref) 23 (table.set $t3 (local.get $i) (local.get $r)) 24 ) 25 (func (export "set-funcref-from") (param $i i32) (param $j i32) 26 (table.set $t3 (local.get $i) (table.get $t3 (local.get $j))) 27 ) 28 (func $f5 (export "set-typed-func") (param $i i32) (param $r (ref $res-i32)) 29 (table.set $t4 (local.get $i) (local.get $r)) 30 ) 31 32 (func (export "is_null-funcref") (param $i i32) (result i32) 33 (ref.is_null (call $f3 (local.get $i))) 34 ) 35 (func (export "is_null-typed-func") (param $i i32) (result i32) 36 (ref.is_null (call $f4 (local.get $i))) 37 ) 38 (func (export "set-returns-five") (param $i i32) 39 (call $f5 (local.get $i) (ref.func $returns-five)) 40 ) 41 (func (export "get-typed-and-call") (param $i i32) (result i32) (call_ref $res-i32 (call $f4 (local.get $i)))) 42) 43 44(assert_return (invoke "get-externref" (i32.const 0)) (ref.null extern)) 45(assert_return (invoke "set-externref" (i32.const 0) (ref.extern 1))) 46(assert_return (invoke "get-externref" (i32.const 0)) (ref.extern 1)) 47(assert_return (invoke "set-externref" (i32.const 0) (ref.null extern))) 48(assert_return (invoke "get-externref" (i32.const 0)) (ref.null extern)) 49 50(assert_return (invoke "get-funcref" (i32.const 0)) (ref.null func)) 51(assert_return (invoke "set-funcref-from" (i32.const 0) (i32.const 1))) 52(assert_return (invoke "is_null-funcref" (i32.const 0)) (i32.const 0)) 53(assert_return (invoke "set-funcref" (i32.const 0) (ref.null func))) 54(assert_return (invoke "get-funcref" (i32.const 0)) (ref.null func)) 55 56(assert_return (invoke "is_null-typed-func" (i32.const 0)) (i32.const 1)) 57(invoke "set-returns-five" (i32.const 0)) 58(assert_return (invoke "get-typed-and-call" (i32.const 0)) (i32.const 5)) 59 60(assert_trap (invoke "set-externref" (i32.const 2) (ref.null extern)) "out of bounds table access") 61(assert_trap (invoke "set-funcref" (i32.const 3) (ref.null func)) "out of bounds table access") 62(assert_trap (invoke "set-returns-five" (i32.const 2)) "out of bounds table access") 63(assert_trap (invoke "set-externref" (i32.const -1) (ref.null extern)) "out of bounds table access") 64(assert_trap (invoke "set-funcref" (i32.const -1) (ref.null func)) "out of bounds table access") 65(assert_trap (invoke "set-returns-five" (i32.const -1)) "out of bounds table access") 66 67(assert_trap (invoke "set-externref" (i32.const 2) (ref.extern 0)) "out of bounds table access") 68(assert_trap (invoke "set-funcref-from" (i32.const 3) (i32.const 1)) "out of bounds table access") 69(assert_trap (invoke "set-externref" (i32.const -1) (ref.extern 0)) "out of bounds table access") 70(assert_trap (invoke "set-funcref-from" (i32.const -1) (i32.const 1)) "out of bounds table access") 71 72 73;; Type errors 74 75(assert_invalid 76 (module 77 (table $t 10 externref) 78 (func $type-index-value-empty-vs-i32-externref 79 (table.set $t) 80 ) 81 ) 82 "type mismatch" 83) 84(assert_invalid 85 (module 86 (table $t 10 externref) 87 (func $type-index-empty-vs-i32 88 (table.set $t (ref.null extern)) 89 ) 90 ) 91 "type mismatch" 92) 93(assert_invalid 94 (module 95 (table $t 10 externref) 96 (func $type-value-empty-vs-externref 97 (table.set $t (i32.const 1)) 98 ) 99 ) 100 "type mismatch" 101) 102(assert_invalid 103 (module 104 (table $t 10 externref) 105 (func $type-size-f32-vs-i32 106 (table.set $t (f32.const 1) (ref.null extern)) 107 ) 108 ) 109 "type mismatch" 110) 111(assert_invalid 112 (module 113 (table $t 10 funcref) 114 (func $type-value-externref-vs-funcref (param $r externref) 115 (table.set $t (i32.const 1) (local.get $r)) 116 ) 117 ) 118 "type mismatch" 119) 120 121(assert_invalid 122 (module 123 (table $t1 1 externref) 124 (table $t2 1 funcref) 125 (func $type-value-externref-vs-funcref-multi (param $r externref) 126 (table.set $t2 (i32.const 0) (local.get $r)) 127 ) 128 ) 129 "type mismatch" 130) 131 132(assert_invalid 133 (module 134 (table $t 10 externref) 135 (func $type-result-empty-vs-num (result i32) 136 (table.set $t (i32.const 0) (ref.null extern)) 137 ) 138 ) 139 "type mismatch" 140) 141