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