451bc5d6fd35da355f6d823920e9c1444a719651
[platform/framework/web/lwnode.git] /
1 (module
2   ;; Auxiliary
3   (type $dummy (func))
4   (elem declare func $dummy)
5   (func $dummy)
6   (func $consume (param i32))
7   (func $produce (result i32) (i32.const 7))
8
9   (func (export "syntax") (param $x1 i32) (param $x2 i64)
10     (local $y1 i64)
11     (local $y2 i32)
12     (local.set $y2 (i32.const 5))
13
14     (let)
15     (let $l)
16     (let (local))
17     (let $l (local))
18
19     (let (result) (local))
20     (let $l (result) (local))
21
22     (let (call $dummy) (call $consume (local.get $x1)))
23     (let $l (call $dummy) (call $consume (local.get $y2)))
24     (let (local) (call $dummy) (call $consume (local.get $y2)))
25     (let $l (local) (call $dummy) (call $consume (local.get $x1)))
26
27     (let (call $dummy) (call $dummy) (br 0))
28     (let $l (call $dummy) (call $dummy) (br $l))
29     (let (local) (call $dummy) (call $dummy) (br 0))
30     (let $l (local) (call $dummy) (call $dummy) (br $l))
31
32     (i32.const 1)
33     (f32.const 2)
34     (let $l (param i32) (result i64) (local f32) (br $l (i64.const 3)))
35     (drop)
36
37     (let (result i32) (call $dummy) (call $produce) (call $dummy))
38     (drop)
39     (let $l (result i32) (call $dummy) (call $produce) (call $dummy))
40     (drop)
41     (let (result i32) (local) (call $dummy) (call $produce) (call $dummy))
42     (drop)
43     (let $l (result i32) (local) (call $dummy) (call $produce) (call $dummy))
44     (drop)
45
46     (i32.const 1)
47     (let (local i32) (call $dummy) (call $consume (local.get 0)))
48     (i32.const 2)
49     (let $l (local i32) (call $dummy) (call $consume (local.get 0)))
50     (i32.const 3)
51     (let (local i32) (call $dummy) (call $consume (local.get 0)))
52     (i32.const 4)
53     (let $l (local i32) (call $dummy) (call $consume (local.get 0)))
54
55     (i32.const 1) (f32.const 2) (i32.const 3) (i64.const 4)
56     (let (local i32 f32) (local) (local $z i32) (local i64)
57       (call $consume (local.get 0))
58       (call $consume (local.get 2))  ;; $z
59       (call $consume (local.get 4))  ;; $x1
60       (call $consume (local.get 7))  ;; $y2
61       (call $consume (local.get $z))
62       (call $consume (local.get $x1))
63       (call $consume (local.get $y2))
64     )
65
66     (f32.const 1) (i32.const 2) (i64.const 3) (i32.const 4)
67     (let (result i32) (local $z1 f32) (local $z2 i32) (local) (local i64 i32)
68       (call $produce)
69       (call $consume (local.get 1))  ;; $z2
70       (call $consume (local.get 3))
71       (call $consume (local.get 4))  ;; $x1
72       (call $consume (local.get 7))  ;; $y2
73       (call $consume (local.get $z2))
74       (call $consume (local.get $x1))
75       (call $consume (local.get $y2))
76     )
77     (drop)
78
79     (ref.func $dummy)
80     (let (local (ref $dummy)))
81   )
82
83   (func $pow (export "pow") (param $x i64) (param $n i32) (result i64)
84     (local $y i64)
85     (local.set $y 
86       (if (result i64) (i32.and (local.get $n) (i32.const 1))
87         (then (local.get $x)) (else (i64.const 1))
88       )
89     )
90     (i64.mul
91       (local.get $y)
92       (if (result i64) (i32.le_u (local.get $n) (i32.const 1))
93         (then (i64.const 1))
94         (else
95           (call $pow
96             (i64.mul (local.get $x) (local.get $x))
97             (i32.shr_u (local.get $n) (i32.const 1))
98           )
99         )
100       )
101     )
102   )
103
104   (func (export "semantics-idx") (param i64 i64) (result i64)
105     (local i64 i64)
106     (local.set 2 (i64.const 5))
107     (local.set 3 (i64.const 7))
108
109     (i64.const 11) (i64.const 13)
110     (let (result i64) (local i64 i64)
111       (i64.const 17) (i64.const 19)
112       (let (result i64) (local i64 i64)
113         (i64.const 0)
114         (i64.add (call $pow (local.get 0) (i32.const 0)))  ;; 17^0 =      1
115         (i64.add (call $pow (local.get 1) (i32.const 1)))  ;; 19^1 =     19
116         (i64.add (call $pow (local.get 2) (i32.const 2)))  ;; 11^2 =    121
117         (i64.add (call $pow (local.get 3) (i32.const 3)))  ;; 13^3 =   2197
118         (i64.add (call $pow (local.get 4) (i32.const 4)))  ;;  2^4 =     16
119         (i64.add (call $pow (local.get 5) (i32.const 5)))  ;;  3^5 =    243
120         (i64.add (call $pow (local.get 6) (i32.const 6)))  ;;  5^6 =  15625
121         (i64.add (call $pow (local.get 7) (i32.const 7)))  ;;  7^7 = 823543
122       )
123     )
124   )
125
126   (func (export "semantics-sym") (param $x1 i64) (param $x2 i64) (result i64)
127     (local $y1 i64)
128     (local $y2 i64)
129     (local.set $y1 (i64.const 5))
130     (local.set $y2 (i64.const 7))
131
132     (i64.const 11) (i64.const 13)
133     (let (result i64) (local $z1 i64) (local $z2 i64)
134       (i64.const 17) (i64.const 19)
135       (let (result i64) (local $u1 i64) (local $u2 i64)
136         (i64.const 0)
137         (i64.add (call $pow (local.get $u1) (i32.const 0)))  ;; 17^0 =      1
138         (i64.add (call $pow (local.get $u2) (i32.const 1)))  ;; 19^1 =     19
139         (i64.add (call $pow (local.get $z1) (i32.const 2)))  ;; 11^2 =    121
140         (i64.add (call $pow (local.get $z2) (i32.const 3)))  ;; 13^3 =   2197
141         (i64.add (call $pow (local.get $x1) (i32.const 4)))  ;;  2^4 =     16
142         (i64.add (call $pow (local.get $x2) (i32.const 5)))  ;;  3^5 =    243
143         (i64.add (call $pow (local.get $y1) (i32.const 6)))  ;;  5^6 =  15625
144         (i64.add (call $pow (local.get $y2) (i32.const 7)))  ;;  7^7 = 823543
145       )
146     )
147   )
148
149   (func (export "mutate") (param $x1 i64) (param $x2 i64) (result i64)
150     (local $y1 i64)
151     (local $y2 i64)
152
153     (i64.const 0) (i64.const 0)
154     (let (result i64) (local $z1 i64) (local $z2 i64)
155       (i64.const 0) (i64.const 0)
156       (let (result i64) (local $u1 i64) (local $u2 i64)
157         (local.set $y1 (i64.const 5))
158         (local.set $y2 (i64.const 7))
159         (local.set $z1 (i64.const 11))
160         (local.set $z2 (i64.const 13))
161         (local.set $u1 (i64.const 17))
162         (local.set $u2 (i64.const 19))
163         (i64.const 0)
164         (i64.add (call $pow (local.get $u1) (i32.const 0)))  ;; 17^0 =      1
165         (i64.add (call $pow (local.get $u2) (i32.const 1)))  ;; 19^1 =     19
166         (i64.add (call $pow (local.get $z1) (i32.const 2)))  ;; 11^2 =    121
167         (i64.add (call $pow (local.get $z2) (i32.const 3)))  ;; 13^3 =   2197
168         (i64.add (call $pow (local.get $x1) (i32.const 4)))  ;;  2^4 =     16
169         (i64.add (call $pow (local.get $x2) (i32.const 5)))  ;;  3^5 =    243
170         (i64.add (call $pow (local.get $y1) (i32.const 6)))  ;;  5^6 =  15625
171         (i64.add (call $pow (local.get $y2) (i32.const 7)))  ;;  7^7 = 823543
172       )
173     )
174   )
175 )
176
177 (assert_return (invoke "syntax" (i32.const 1) (i64.const 2)))
178
179 (assert_return (invoke "pow" (i64.const 17) (i32.const 0)) (i64.const 1))
180 (assert_return (invoke "pow" (i64.const 19) (i32.const 1)) (i64.const 19))
181 (assert_return (invoke "pow" (i64.const 11) (i32.const 2)) (i64.const 121))
182 (assert_return (invoke "pow" (i64.const 13) (i32.const 3)) (i64.const 2197))
183 (assert_return (invoke "pow" (i64.const 2) (i32.const 4)) (i64.const 16))
184 (assert_return (invoke "pow" (i64.const 3) (i32.const 5)) (i64.const 243))
185 (assert_return (invoke "pow" (i64.const 5) (i32.const 6)) (i64.const 15625))
186 (assert_return (invoke "pow" (i64.const 7) (i32.const 7)) (i64.const 823543))
187
188 (assert_return (invoke "semantics-idx" (i64.const 2) (i64.const 3)) (i64.const 841_765))
189 (assert_return (invoke "semantics-sym" (i64.const 2) (i64.const 3)) (i64.const 841_765))
190 (assert_return (invoke "mutate" (i64.const 2) (i64.const 3)) (i64.const 841_765))
191
192
193 ;; Shadowing.
194
195 ;; Shadowing is fine across nested let blocks (analogous to labels).
196 (module
197   (func (export "f1") (param $x i32) (result i32)
198     (i32.const 1)
199     (let (local $x i32) (return (local.get $x)))
200     (unreachable)
201   )
202   (func (export "f2") (result i32)
203     (local $x i32)
204     (i32.const 1)
205     (let (local $x i32) (return (local.get $x)))
206     (unreachable)
207   )
208   (func (export "f3") (result i32)
209     (i32.const 0)
210     (let (local $x i32)
211       (i32.const 1)
212       (let (local $x i32) (return (local.get $x)))
213     )
214     (unreachable)
215   )
216   (func (export "f4") (result i32)
217     (local $x i32)
218     (i32.const 1)
219     (let (local $x i32)
220       (i32.const 2)
221       (let (local $x i32) (return (local.get $x)))
222     )
223     (unreachable)
224   )
225 )
226
227 (assert_return (invoke "f1" (i32.const 0)) (i32.const 1))
228 (assert_return (invoke "f2") (i32.const 1))
229 (assert_return (invoke "f3") (i32.const 1))
230 (assert_return (invoke "f4") (i32.const 2))
231
232 ;; Duplicate labels within a single let block are still disallowed.
233 (assert_malformed
234   (module quote "(func (let (local $x i32) (local $x i64)))")
235   "duplicate local"
236 )
237
238
239 ;; Syntax
240
241 (assert_malformed
242   (module quote "(func (let (local) (param)))")
243   "unexpected token"
244 )
245 (assert_malformed
246   (module quote
247     "(func"
248     "  (i32.const 0) (i32.const 0)"
249     "  (let (local i32) (param i32) (drop))"
250     ")"
251   )
252   "unexpected token"
253 )
254
255 (assert_malformed
256   (module quote "(func (let (local) (result)))")
257   "unexpected token"
258 )
259 (assert_malformed
260   (module quote
261     "(func (result i32)"
262     "  (i32.const 0)"
263     "  (let (local i32) (result i32) (local.get 0))"
264     ")"
265   )
266   "unexpected token"
267 )
268 (assert_malformed
269   (module quote
270     "(func (result i32)"
271     "  (let (local $x i32) (result i32) (local.get 0))"
272     ")"
273   )
274   "unexpected token"
275 )
276
277 (assert_malformed
278   (module quote "(func (let (result) (param)))")
279   "unexpected token"
280 )
281 (assert_malformed
282   (module quote
283     "(func (result i32)"
284     "  (i32.const 0)"
285     "  (let (result i32) (param i32))"
286     ")"
287   )
288   "unexpected token"
289 )
290
291 (assert_malformed
292   (module quote "(func (let (param) $l))")
293   "unexpected token"
294 )
295 (assert_malformed
296   (module quote "(func (let (result) $l))")
297   "unexpected token"
298 )
299 (assert_malformed
300   (module quote "(func (let (local) $l))")
301   "unexpected token"
302 )