2 (type $ii (func (param i32) (result i32)))
4 (func $apply (param $f (ref $ii)) (param $x i32) (result i32)
5 (call_ref (local.get $x) (local.get $f))
8 (func $f (type $ii) (i32.mul (local.get 0) (local.get 0)))
9 (func $g (type $ii) (i32.sub (i32.const 0) (local.get 0)))
11 (elem declare func $f $g)
13 (func (export "run") (param $x i32) (result i32)
14 (local $rf (ref null $ii))
15 (local $rg (ref null $ii))
16 (local.set $rf (ref.func $f))
17 (local.set $rg (ref.func $g))
18 (call_ref (call_ref (local.get $x) (local.get $rf)) (local.get $rg))
21 (func (export "null") (result i32)
22 (call_ref (i32.const 1) (ref.null $ii))
27 (type $ll (func (param i64) (result i64)))
28 (type $lll (func (param i64 i64) (result i64)))
30 (elem declare func $fac)
31 (global $fac (ref $ll) (ref.func $fac))
33 (func $fac (export "fac") (type $ll)
34 (if (result i64) (i64.eqz (local.get 0))
39 (call_ref (i64.sub (local.get 0) (i64.const 1)) (global.get $fac))
45 (elem declare func $fac-acc)
46 (global $fac-acc (ref $lll) (ref.func $fac-acc))
48 (func $fac-acc (export "fac-acc") (type $lll)
49 (if (result i64) (i64.eqz (local.get 0))
53 (i64.sub (local.get 0) (i64.const 1))
54 (i64.mul (local.get 0) (local.get 1))
61 (elem declare func $fib)
62 (global $fib (ref $ll) (ref.func $fib))
64 (func $fib (export "fib") (type $ll)
65 (if (result i64) (i64.le_u (local.get 0) (i64.const 1))
69 (call_ref (i64.sub (local.get 0) (i64.const 2)) (global.get $fib))
70 (call_ref (i64.sub (local.get 0) (i64.const 1)) (global.get $fib))
76 (elem declare func $even $odd)
77 (global $even (ref $ll) (ref.func $even))
78 (global $odd (ref $ll) (ref.func $odd))
80 (func $even (export "even") (type $ll)
81 (if (result i64) (i64.eqz (local.get 0))
83 (else (call_ref (i64.sub (local.get 0) (i64.const 1)) (global.get $odd)))
86 (func $odd (export "odd") (type $ll)
87 (if (result i64) (i64.eqz (local.get 0))
89 (else (call_ref (i64.sub (local.get 0) (i64.const 1)) (global.get $even)))
94 (assert_return (invoke "run" (i32.const 0)) (i32.const 0))
95 (assert_return (invoke "run" (i32.const 3)) (i32.const -9))
97 (assert_trap (invoke "null") "null function")
99 (assert_return (invoke "fac" (i64.const 0)) (i64.const 1))
100 (assert_return (invoke "fac" (i64.const 1)) (i64.const 1))
101 (assert_return (invoke "fac" (i64.const 5)) (i64.const 120))
102 (assert_return (invoke "fac" (i64.const 25)) (i64.const 7034535277573963776))
103 (assert_return (invoke "fac-acc" (i64.const 0) (i64.const 1)) (i64.const 1))
104 (assert_return (invoke "fac-acc" (i64.const 1) (i64.const 1)) (i64.const 1))
105 (assert_return (invoke "fac-acc" (i64.const 5) (i64.const 1)) (i64.const 120))
107 (invoke "fac-acc" (i64.const 25) (i64.const 1))
108 (i64.const 7034535277573963776)
111 (assert_return (invoke "fib" (i64.const 0)) (i64.const 1))
112 (assert_return (invoke "fib" (i64.const 1)) (i64.const 1))
113 (assert_return (invoke "fib" (i64.const 2)) (i64.const 2))
114 (assert_return (invoke "fib" (i64.const 5)) (i64.const 8))
115 (assert_return (invoke "fib" (i64.const 20)) (i64.const 10946))
117 (assert_return (invoke "even" (i64.const 0)) (i64.const 44))
118 (assert_return (invoke "even" (i64.const 1)) (i64.const 99))
119 (assert_return (invoke "even" (i64.const 100)) (i64.const 44))
120 (assert_return (invoke "even" (i64.const 77)) (i64.const 99))
121 (assert_return (invoke "odd" (i64.const 0)) (i64.const 99))
122 (assert_return (invoke "odd" (i64.const 1)) (i64.const 44))
123 (assert_return (invoke "odd" (i64.const 200)) (i64.const 99))
124 (assert_return (invoke "odd" (i64.const 77)) (i64.const 44))
127 ;; Unreachable typing.
130 (func (export "unreachable") (result i32)
135 (assert_trap (invoke "unreachable") "unreachable")
138 (elem declare func $f)
139 (func $f (param i32) (result i32) (local.get 0))
141 (func (export "unreachable") (result i32)
147 (assert_trap (invoke "unreachable") "unreachable")
150 (elem declare func $f)
151 (func $f (param i32) (result i32) (local.get 0))
153 (func (export "unreachable") (result i32)
162 (assert_trap (invoke "unreachable") "unreachable")
166 (elem declare func $f)
167 (func $f (param i32) (result i32) (local.get 0))
169 (func (export "unreachable") (result i32)
181 (elem declare func $f)
182 (func $f (param i32) (result i32) (local.get 0))
184 (func (export "unreachable") (result i32)