1 ;; Test `return_call_indirect` operator
4 ;; Auxiliary definitions
6 (type $out-i32 (func (result i32)))
7 (type $out-i64 (func (result i64)))
8 (type $out-f32 (func (result f32)))
9 (type $out-f64 (func (result f64)))
10 (type $over-i32 (func (param i32) (result i32)))
11 (type $over-i64 (func (param i64) (result i64)))
12 (type $over-f32 (func (param f32) (result f32)))
13 (type $over-f64 (func (param f64) (result f64)))
14 (type $f32-i32 (func (param f32 i32) (result i32)))
15 (type $i32-i64 (func (param i32 i64) (result i64)))
16 (type $f64-f32 (func (param f64 f32) (result f32)))
17 (type $i64-f64 (func (param i64 f64) (result f64)))
18 (type $over-i32-duplicate (func (param i32) (result i32)))
19 (type $over-i64-duplicate (func (param i64) (result i64)))
20 (type $over-f32-duplicate (func (param f32) (result f32)))
21 (type $over-f64-duplicate (func (param f64) (result f64)))
23 (func $const-i32 (type $out-i32) (i32.const 0x132))
24 (func $const-i64 (type $out-i64) (i64.const 0x164))
25 (func $const-f32 (type $out-f32) (f32.const 0xf32))
26 (func $const-f64 (type $out-f64) (f64.const 0xf64))
28 (func $id-i32 (type $over-i32) (get_local 0))
29 (func $id-i64 (type $over-i64) (get_local 0))
30 (func $id-f32 (type $over-f32) (get_local 0))
31 (func $id-f64 (type $over-f64) (get_local 0))
33 (func $i32-i64 (type $i32-i64) (get_local 1))
34 (func $i64-f64 (type $i64-f64) (get_local 1))
35 (func $f32-i32 (type $f32-i32) (get_local 1))
36 (func $f64-f32 (type $f64-f32) (get_local 1))
38 (func $over-i32-duplicate (type $over-i32-duplicate) (get_local 0))
39 (func $over-i64-duplicate (type $over-i64-duplicate) (get_local 0))
40 (func $over-f32-duplicate (type $over-f32-duplicate) (get_local 0))
41 (func $over-f64-duplicate (type $over-f64-duplicate) (get_local 0))
45 $const-i32 $const-i64 $const-f32 $const-f64
46 $id-i32 $id-i64 $id-f32 $id-f64
47 $f32-i32 $i32-i64 $f64-f32 $i64-f64
48 $fac $fac-acc $even $odd
49 $over-i32-duplicate $over-i64-duplicate
50 $over-f32-duplicate $over-f64-duplicate
57 (return_call_indirect (i32.const 0))
58 (return_call_indirect (param i64) (i64.const 0) (i32.const 0))
59 (return_call_indirect (param i64) (param) (param f64 i32 i64)
60 (i64.const 0) (f64.const 0) (i32.const 0) (i64.const 0) (i32.const 0)
62 (return_call_indirect (result) (i32.const 0))
66 (return_call_indirect (result i32) (i32.const 0))
67 (return_call_indirect (result i32) (result) (i32.const 0))
68 (return_call_indirect (param i64) (result i32) (i64.const 0) (i32.const 0))
70 (param) (param i64) (param) (param f64 i32 i64) (param) (param)
71 (result) (result i32) (result) (result)
72 (i64.const 0) (f64.const 0) (i32.const 0) (i64.const 0) (i32.const 0)
77 (return_call_indirect (type $over-i64) (param i64) (result i64)
78 (i64.const 0) (i32.const 0)
84 (func (export "type-i32") (result i32)
85 (return_call_indirect (type $out-i32) (i32.const 0))
87 (func (export "type-i64") (result i64)
88 (return_call_indirect (type $out-i64) (i32.const 1))
90 (func (export "type-f32") (result f32)
91 (return_call_indirect (type $out-f32) (i32.const 2))
93 (func (export "type-f64") (result f64)
94 (return_call_indirect (type $out-f64) (i32.const 3))
97 (func (export "type-index") (result i64)
98 (return_call_indirect (type $over-i64) (i64.const 100) (i32.const 5))
101 (func (export "type-first-i32") (result i32)
102 (return_call_indirect (type $over-i32) (i32.const 32) (i32.const 4))
104 (func (export "type-first-i64") (result i64)
105 (return_call_indirect (type $over-i64) (i64.const 64) (i32.const 5))
107 (func (export "type-first-f32") (result f32)
108 (return_call_indirect (type $over-f32) (f32.const 1.32) (i32.const 6))
110 (func (export "type-first-f64") (result f64)
111 (return_call_indirect (type $over-f64) (f64.const 1.64) (i32.const 7))
114 (func (export "type-second-i32") (result i32)
115 (return_call_indirect (type $f32-i32)
116 (f32.const 32.1) (i32.const 32) (i32.const 8)
119 (func (export "type-second-i64") (result i64)
120 (return_call_indirect (type $i32-i64)
121 (i32.const 32) (i64.const 64) (i32.const 9)
124 (func (export "type-second-f32") (result f32)
125 (return_call_indirect (type $f64-f32)
126 (f64.const 64) (f32.const 32) (i32.const 10)
129 (func (export "type-second-f64") (result f64)
130 (return_call_indirect (type $i64-f64)
131 (i64.const 64) (f64.const 64.1) (i32.const 11)
137 (func (export "dispatch") (param i32 i64) (result i64)
138 (return_call_indirect (type $over-i64) (get_local 1) (get_local 0))
141 (func (export "dispatch-structural") (param i32) (result i64)
142 (return_call_indirect (type $over-i64-duplicate)
143 (i64.const 9) (get_local 0)
149 (func $fac (export "fac") (type $over-i64)
150 (return_call_indirect (param i64 i64) (result i64)
151 (get_local 0) (i64.const 1) (i32.const 13)
155 (func $fac-acc (param i64 i64) (result i64)
156 (if (result i64) (i64.eqz (get_local 0))
159 (return_call_indirect (param i64 i64) (result i64)
160 (i64.sub (get_local 0) (i64.const 1))
161 (i64.mul (get_local 0) (get_local 1))
168 (func $even (export "even") (param i32) (result i32)
169 (if (result i32) (i32.eqz (get_local 0))
170 (then (i32.const 44))
172 (return_call_indirect (type $over-i32)
173 (i32.sub (get_local 0) (i32.const 1))
179 (func $odd (export "odd") (param i32) (result i32)
180 (if (result i32) (i32.eqz (get_local 0))
181 (then (i32.const 99))
183 (return_call_indirect (type $over-i32)
184 (i32.sub (get_local 0) (i32.const 1))
192 (assert_return (invoke "type-i32") (i32.const 0x132))
193 (assert_return (invoke "type-i64") (i64.const 0x164))
194 (assert_return (invoke "type-f32") (f32.const 0xf32))
195 (assert_return (invoke "type-f64") (f64.const 0xf64))
197 (assert_return (invoke "type-index") (i64.const 100))
199 (assert_return (invoke "type-first-i32") (i32.const 32))
200 (assert_return (invoke "type-first-i64") (i64.const 64))
201 (assert_return (invoke "type-first-f32") (f32.const 1.32))
202 (assert_return (invoke "type-first-f64") (f64.const 1.64))
204 (assert_return (invoke "type-second-i32") (i32.const 32))
205 (assert_return (invoke "type-second-i64") (i64.const 64))
206 (assert_return (invoke "type-second-f32") (f32.const 32))
207 (assert_return (invoke "type-second-f64") (f64.const 64.1))
209 (assert_return (invoke "dispatch" (i32.const 5) (i64.const 2)) (i64.const 2))
210 (assert_return (invoke "dispatch" (i32.const 5) (i64.const 5)) (i64.const 5))
211 (assert_return (invoke "dispatch" (i32.const 12) (i64.const 5)) (i64.const 120))
212 (assert_return (invoke "dispatch" (i32.const 17) (i64.const 2)) (i64.const 2))
213 (assert_trap (invoke "dispatch" (i32.const 0) (i64.const 2)) "indirect call type mismatch")
214 (assert_trap (invoke "dispatch" (i32.const 15) (i64.const 2)) "indirect call type mismatch")
215 (assert_trap (invoke "dispatch" (i32.const 20) (i64.const 2)) "undefined element")
216 (assert_trap (invoke "dispatch" (i32.const -1) (i64.const 2)) "undefined element")
217 (assert_trap (invoke "dispatch" (i32.const 1213432423) (i64.const 2)) "undefined element")
219 (assert_return (invoke "dispatch-structural" (i32.const 5)) (i64.const 9))
220 (assert_return (invoke "dispatch-structural" (i32.const 5)) (i64.const 9))
221 (assert_return (invoke "dispatch-structural" (i32.const 12)) (i64.const 362880))
222 (assert_return (invoke "dispatch-structural" (i32.const 17)) (i64.const 9))
223 (assert_trap (invoke "dispatch-structural" (i32.const 11)) "indirect call type mismatch")
224 (assert_trap (invoke "dispatch-structural" (i32.const 16)) "indirect call type mismatch")
226 (assert_return (invoke "fac" (i64.const 0)) (i64.const 1))
227 (assert_return (invoke "fac" (i64.const 1)) (i64.const 1))
228 (assert_return (invoke "fac" (i64.const 5)) (i64.const 120))
229 (assert_return (invoke "fac" (i64.const 25)) (i64.const 7034535277573963776))
231 (assert_return (invoke "even" (i32.const 0)) (i32.const 44))
232 (assert_return (invoke "even" (i32.const 1)) (i32.const 99))
233 (assert_return (invoke "even" (i32.const 100)) (i32.const 44))
234 (assert_return (invoke "even" (i32.const 77)) (i32.const 99))
235 (assert_return (invoke "even" (i32.const 100_000)) (i32.const 44))
236 (assert_return (invoke "even" (i32.const 111_111)) (i32.const 99))
237 (assert_return (invoke "odd" (i32.const 0)) (i32.const 99))
238 (assert_return (invoke "odd" (i32.const 1)) (i32.const 44))
239 (assert_return (invoke "odd" (i32.const 200)) (i32.const 99))
240 (assert_return (invoke "odd" (i32.const 77)) (i32.const 44))
241 (assert_return (invoke "odd" (i32.const 200_002)) (i32.const 99))
242 (assert_return (invoke "odd" (i32.const 300_003)) (i32.const 44))
249 "(type $sig (func (param i32) (result i32)))"
252 " (return_call_indirect (type $sig) (result i32) (param i32)"
253 " (i32.const 0) (i32.const 0)"
261 "(type $sig (func (param i32) (result i32)))"
264 " (return_call_indirect (param i32) (type $sig) (result i32)"
265 " (i32.const 0) (i32.const 0)"
273 "(type $sig (func (param i32) (result i32)))"
276 " (return_call_indirect (param i32) (result i32) (type $sig)"
277 " (i32.const 0) (i32.const 0)"
285 "(type $sig (func (param i32) (result i32)))"
288 " (return_call_indirect (result i32) (type $sig) (param i32)"
289 " (i32.const 0) (i32.const 0)"
297 "(type $sig (func (param i32) (result i32)))"
300 " (return_call_indirect (result i32) (param i32) (type $sig)"
301 " (i32.const 0) (i32.const 0)"
311 " (return_call_indirect (result i32) (param i32)"
312 " (i32.const 0) (i32.const 0)"
322 "(func (return_call_indirect (param $x i32) (i32.const 0) (i32.const 0)))"
331 " (return_call_indirect (type $sig) (result i32) (i32.const 0))"
334 "inline function type"
338 "(type $sig (func (param i32) (result i32)))"
341 " (return_call_indirect (type $sig) (result i32) (i32.const 0))"
344 "inline function type"
348 "(type $sig (func (param i32) (result i32)))"
351 " (return_call_indirect (type $sig) (param i32)"
352 " (i32.const 0) (i32.const 0)"
356 "inline function type"
360 "(type $sig (func (param i32 i32) (result i32)))"
363 " (return_call_indirect (type $sig) (param i32) (result i32)"
364 " (i32.const 0) (i32.const 0)"
368 "inline function type"
376 (func $no-table (return_call_indirect (type 0) (i32.const 0)))
385 (func $type-void-vs-num (i32.eqz (return_call_indirect (type 0) (i32.const 0))))
391 (type (func (result i64)))
393 (func $type-num-vs-num (i32.eqz (return_call_indirect (type 0) (i32.const 0))))
400 (type (func (param i32)))
402 (func $arity-0-vs-1 (return_call_indirect (type 0) (i32.const 0)))
408 (type (func (param f64 i32)))
410 (func $arity-0-vs-2 (return_call_indirect (type 0) (i32.const 0)))
418 (func $arity-1-vs-0 (return_call_indirect (type 0) (i32.const 1) (i32.const 0)))
425 (return_call_indirect (type 0) (f64.const 2) (i32.const 1) (i32.const 0))
431 (type (func (param i32)))
433 (func $type-func-void-vs-i32 (return_call_indirect (type 0) (i32.const 1) (nop)))
439 (type (func (param i32)))
441 (func $type-func-num-vs-i32 (return_call_indirect (type 0) (i32.const 0) (i64.const 1)))
448 (type (func (param i32 i32)))
450 (func $type-first-void-vs-num
451 (return_call_indirect (type 0) (nop) (i32.const 1) (i32.const 0))
458 (type (func (param i32 i32)))
460 (func $type-second-void-vs-num
461 (return_call_indirect (type 0) (i32.const 1) (nop) (i32.const 0))
468 (type (func (param i32 f64)))
470 (func $type-first-num-vs-num
471 (return_call_indirect (type 0) (f64.const 1) (i32.const 1) (i32.const 0))
478 (type (func (param f64 i32)))
480 (func $type-second-num-vs-num
481 (return_call_indirect (type 0) (i32.const 1) (f64.const 1) (i32.const 0))
493 (func $unbound-type (return_call_indirect (type 1) (i32.const 0)))
500 (func $large-type (return_call_indirect (type 1012321300) (i32.const 0)))
506 ;; Unbound function in table
509 (module (table anyfunc (elem 0 0)))