1(module
2  (type $res-i32 (func (result i32)))
3  (table $t2 2 externref)
4  (table $t3 3 funcref)
5  (table $t4 (ref null $res-i32) (elem (ref.func $returns-five)))
6  (elem (table $t3) (i32.const 1) func $returns-five)
7  (func $returns-five (result i32) (i32.const 5))
8
9  (func (export "init") (param $r externref)
10    (table.set $t2 (i32.const 1) (local.get $r))
11    (table.set $t3 (i32.const 2) (table.get $t3 (i32.const 1)))
12  )
13
14  (func (export "get-externref") (param $i i32) (result externref)
15    (table.get $t2 (local.get $i))
16  )
17  (func $f3 (export "get-funcref") (param $i i32) (result funcref)
18    (table.get $t3 (local.get $i))
19  )
20  (func $f4 (export "get-typed-func") (param $i i32) (result (ref $res-i32))
21    (ref.as_non_null (table.get $t4 (local.get $i)))
22  )
23
24  (func (export "is_null-funcref") (param $i i32) (result i32)
25    (ref.is_null (call $f3 (local.get $i)))
26  )
27  (func (export "get-typed-and-call") (param $i i32) (result i32) (call_ref $res-i32 (call $f4 (local.get $i))))
28)
29
30(invoke "init" (ref.extern 1))
31
32(assert_return (invoke "get-externref" (i32.const 0)) (ref.null extern))
33(assert_return (invoke "get-externref" (i32.const 1)) (ref.extern 1))
34
35(assert_return (invoke "get-funcref" (i32.const 0)) (ref.null func))
36(assert_return (invoke "is_null-funcref" (i32.const 1)) (i32.const 0))
37(assert_return (invoke "is_null-funcref" (i32.const 2)) (i32.const 0))
38
39(assert_return (invoke "get-typed-and-call" (i32.const 0)) (i32.const 5))
40
41(assert_trap (invoke "get-externref" (i32.const 2)) "out of bounds table access")
42(assert_trap (invoke "get-funcref" (i32.const 3)) "out of bounds table access")
43(assert_trap (invoke "get-typed-func" (i32.const 2)) "out of bounds table access")
44(assert_trap (invoke "get-externref" (i32.const -1)) "out of bounds table access")
45(assert_trap (invoke "get-funcref" (i32.const -1)) "out of bounds table access")
46(assert_trap (invoke "get-typed-func" (i32.const -1)) "out of bounds table access")
47
48
49;; Type errors
50
51(assert_invalid
52  (module
53    (table $t 10 externref)
54    (func $type-index-empty-vs-i32 (result externref)
55      (table.get $t)
56    )
57  )
58  "type mismatch"
59)
60(assert_invalid
61  (module
62    (table $t 10 externref)
63    (func $type-index-f32-vs-i32 (result externref)
64      (table.get $t (f32.const 1))
65    )
66  )
67  "type mismatch"
68)
69
70(assert_invalid
71  (module
72    (table $t 10 externref)
73    (func $type-result-externref-vs-empty
74      (table.get $t (i32.const 0))
75    )
76  )
77  "type mismatch"
78)
79(assert_invalid
80  (module
81    (table $t 10 externref)
82    (func $type-result-externref-vs-funcref (result funcref)
83      (table.get $t (i32.const 1))
84    )
85  )
86  "type mismatch"
87)
88
89(assert_invalid
90  (module
91    (table $t1 1 funcref)
92    (table $t2 1 externref)
93    (func $type-result-externref-vs-funcref-multi (result funcref)
94      (table.get $t2 (i32.const 0))
95    )
96  )
97  "type mismatch"
98)
99