...
1;; Test `local.get` operator
2
3(module
4 ;; Typing
5
6 (func (export "type-local-i32") (result i32) (local i32) (local.get 0))
7 (func (export "type-local-i64") (result i64) (local i64) (local.get 0))
8 (func (export "type-local-f32") (result f32) (local f32) (local.get 0))
9 (func (export "type-local-f64") (result f64) (local f64) (local.get 0))
10
11 (func (export "type-param-i32") (param i32) (result i32) (local.get 0))
12 (func (export "type-param-i64") (param i64) (result i64) (local.get 0))
13 (func (export "type-param-f32") (param f32) (result f32) (local.get 0))
14 (func (export "type-param-f64") (param f64) (result f64) (local.get 0))
15
16 (func (export "type-mixed") (param i64 f32 f64 i32 i32)
17 (local f32 i64 i64 f64)
18 (drop (i64.eqz (local.get 0)))
19 (drop (f32.neg (local.get 1)))
20 (drop (f64.neg (local.get 2)))
21 (drop (i32.eqz (local.get 3)))
22 (drop (i32.eqz (local.get 4)))
23 (drop (f32.neg (local.get 5)))
24 (drop (i64.eqz (local.get 6)))
25 (drop (i64.eqz (local.get 7)))
26 (drop (f64.neg (local.get 8)))
27 )
28
29 ;; Reading
30
31 (func (export "read") (param i64 f32 f64 i32 i32) (result f64)
32 (local f32 i64 i64 f64)
33 (local.set 5 (f32.const 5.5))
34 (local.set 6 (i64.const 6))
35 (local.set 8 (f64.const 8))
36 (f64.add
37 (f64.convert_i64_u (local.get 0))
38 (f64.add
39 (f64.promote_f32 (local.get 1))
40 (f64.add
41 (local.get 2)
42 (f64.add
43 (f64.convert_i32_u (local.get 3))
44 (f64.add
45 (f64.convert_i32_s (local.get 4))
46 (f64.add
47 (f64.promote_f32 (local.get 5))
48 (f64.add
49 (f64.convert_i64_u (local.get 6))
50 (f64.add
51 (f64.convert_i64_u (local.get 7))
52 (local.get 8)
53 )
54 )
55 )
56 )
57 )
58 )
59 )
60 )
61 )
62
63 ;; As parameter of control constructs and instructions
64
65 (func (export "as-block-value") (param i32) (result i32)
66 (block (result i32) (local.get 0))
67 )
68 (func (export "as-loop-value") (param i32) (result i32)
69 (loop (result i32) (local.get 0))
70 )
71 (func (export "as-br-value") (param i32) (result i32)
72 (block (result i32) (br 0 (local.get 0)))
73 )
74 (func (export "as-br_if-value") (param i32) (result i32)
75 (block $l0 (result i32) (br_if $l0 (local.get 0) (i32.const 1)))
76 )
77
78 (func (export "as-br_if-value-cond") (param i32) (result i32)
79 (block (result i32)
80 (br_if 0 (local.get 0) (local.get 0))
81 )
82 )
83 (func (export "as-br_table-value") (param i32) (result i32)
84 (block
85 (block
86 (block
87 (br_table 0 1 2 (local.get 0))
88 (return (i32.const 0))
89 )
90 (return (i32.const 1))
91 )
92 (return (i32.const 2))
93 )
94 (i32.const 3)
95 )
96
97 (func (export "as-return-value") (param i32) (result i32)
98 (return (local.get 0))
99 )
100
101 (func (export "as-if-then") (param i32) (result i32)
102 (if (result i32) (local.get 0) (then (local.get 0)) (else (i32.const 0)))
103 )
104 (func (export "as-if-else") (param i32) (result i32)
105 (if (result i32) (local.get 0) (then (i32.const 1)) (else (local.get 0)))
106 )
107)
108
109(assert_return (invoke "type-local-i32") (i32.const 0))
110(assert_return (invoke "type-local-i64") (i64.const 0))
111(assert_return (invoke "type-local-f32") (f32.const 0))
112(assert_return (invoke "type-local-f64") (f64.const 0))
113
114(assert_return (invoke "type-param-i32" (i32.const 2)) (i32.const 2))
115(assert_return (invoke "type-param-i64" (i64.const 3)) (i64.const 3))
116(assert_return (invoke "type-param-f32" (f32.const 4.4)) (f32.const 4.4))
117(assert_return (invoke "type-param-f64" (f64.const 5.5)) (f64.const 5.5))
118
119(assert_return (invoke "as-block-value" (i32.const 6)) (i32.const 6))
120(assert_return (invoke "as-loop-value" (i32.const 7)) (i32.const 7))
121
122(assert_return (invoke "as-br-value" (i32.const 8)) (i32.const 8))
123(assert_return (invoke "as-br_if-value" (i32.const 9)) (i32.const 9))
124(assert_return (invoke "as-br_if-value-cond" (i32.const 10)) (i32.const 10))
125(assert_return (invoke "as-br_table-value" (i32.const 1)) (i32.const 2))
126
127(assert_return (invoke "as-return-value" (i32.const 0)) (i32.const 0))
128
129(assert_return (invoke "as-if-then" (i32.const 1)) (i32.const 1))
130(assert_return (invoke "as-if-else" (i32.const 0)) (i32.const 0))
131
132(assert_return
133 (invoke "type-mixed"
134 (i64.const 1) (f32.const 2.2) (f64.const 3.3) (i32.const 4) (i32.const 5)
135 )
136)
137
138(assert_return
139 (invoke "read"
140 (i64.const 1) (f32.const 2) (f64.const 3.3) (i32.const 4) (i32.const 5)
141 )
142 (f64.const 34.8)
143)
144
145
146;; Invalid typing of access to locals
147
148(assert_invalid
149 (module (func $type-local-num-vs-num (result i64) (local i32) (local.get 0)))
150 "type mismatch"
151)
152(assert_invalid
153 (module (func $type-local-num-vs-num (result i32) (local f32) (i32.eqz (local.get 0))))
154 "type mismatch"
155)
156(assert_invalid
157 (module (func $type-local-num-vs-num (result f64) (local f64 i64) (f64.neg (local.get 1))))
158 "type mismatch"
159)
160
161
162;; Invalid typing of access to parameters
163
164(assert_invalid
165 (module (func $type-param-num-vs-num (param i32) (result i64) (local.get 0)))
166 "type mismatch"
167)
168(assert_invalid
169 (module (func $type-param-num-vs-num (param f32) (result i32) (i32.eqz (local.get 0))))
170 "type mismatch"
171)
172(assert_invalid
173 (module (func $type-param-num-vs-num (param f64 i64) (result f64) (f64.neg (local.get 1))))
174 "type mismatch"
175)
176
177
178;; local.set should have retval
179
180(assert_invalid
181 (module (func $type-empty-vs-i32 (local i32) (local.get 0)))
182 "type mismatch"
183)
184(assert_invalid
185 (module (func $type-empty-vs-i64 (local i64) (local.get 0)))
186 "type mismatch"
187)
188(assert_invalid
189 (module (func $type-empty-vs-f32 (local f32) (local.get 0)))
190 "type mismatch"
191)
192(assert_invalid
193 (module (func $type-empty-vs-f64 (local f64) (local.get 0)))
194 "type mismatch"
195)
196
197
198;; Invalid local index
199
200(assert_invalid
201 (module (func $unbound-local (local i32 i64) (local.get 3)))
202 "unknown local"
203)
204(assert_invalid
205 (module (func $large-local (local i32 i64) (local.get 14324343)))
206 "unknown local"
207)
208
209(assert_invalid
210 (module (func $unbound-param (param i32 i64) (local.get 2)))
211 "unknown local"
212)
213(assert_invalid
214 (module (func $large-param (param i32 i64) (local.get 714324343)))
215 "unknown local"
216)
217
218(assert_invalid
219 (module (func $unbound-mixed (param i32) (local i32 i64) (local.get 3)))
220 "unknown local"
221)
222(assert_invalid
223 (module (func $large-mixed (param i64) (local i32 i64) (local.get 214324343)))
224 "unknown local"
225)
226
View as plain text