...
1;; Test that control-flow transfer unwinds stack and it can be anything after.
2
3(module
4 (func (export "func-unwind-by-unreachable")
5 (i32.const 3) (i64.const 1) (unreachable)
6 )
7 (func (export "func-unwind-by-br")
8 (i32.const 3) (i64.const 1) (br 0)
9 )
10 (func (export "func-unwind-by-br-value") (result i32)
11 (i32.const 3) (i64.const 1) (br 0 (i32.const 9))
12 )
13 (func (export "func-unwind-by-br_if")
14 (i32.const 3) (i64.const 1) (drop (drop (br_if 0 (i32.const 1))))
15 )
16 (func (export "func-unwind-by-br_if-value") (result i32)
17 (i32.const 3) (i64.const 1) (drop (drop (br_if 0 (i32.const 9) (i32.const 1))))
18 )
19 (func (export "func-unwind-by-br_table")
20 (i32.const 3) (i64.const 1) (br_table 0 (i32.const 0))
21 )
22 (func (export "func-unwind-by-br_table-value") (result i32)
23 (i32.const 3) (i64.const 1) (br_table 0 (i32.const 9) (i32.const 0))
24 )
25 (func (export "func-unwind-by-return") (result i32)
26 (i32.const 3) (i64.const 1) (return (i32.const 9))
27 )
28
29 (func (export "block-unwind-by-unreachable")
30 (block (i32.const 3) (i64.const 1) (unreachable))
31 )
32 (func (export "block-unwind-by-br") (result i32)
33 (block (i32.const 3) (i64.const 1) (br 0)) (i32.const 9)
34 )
35 (func (export "block-unwind-by-br-value") (result i32)
36 (block (result i32) (i32.const 3) (i64.const 1) (br 0 (i32.const 9)))
37 )
38 (func (export "block-unwind-by-br_if") (result i32)
39 (block (i32.const 3) (i64.const 1) (drop (drop (br_if 0 (i32.const 1))))) (i32.const 9)
40 )
41 (func (export "block-unwind-by-br_if-value") (result i32)
42 (block (result i32)
43 (i32.const 3) (i64.const 1) (drop (drop (br_if 0 (i32.const 9) (i32.const 1))))
44 )
45 )
46 (func (export "block-unwind-by-br_table") (result i32)
47 (block (i32.const 3) (i64.const 1) (br_table 0 (i32.const 0))) (i32.const 9)
48 )
49 (func (export "block-unwind-by-br_table-value") (result i32)
50 (block (result i32)
51 (i32.const 3) (i64.const 1) (br_table 0 (i32.const 9) (i32.const 0))
52 )
53 )
54 (func (export "block-unwind-by-return") (result i32)
55 (block (result i32) (i32.const 3) (i64.const 1) (return (i32.const 9)))
56 )
57
58 (func (export "block-nested-unwind-by-unreachable") (result i32)
59 (block (result i32) (i32.const 3) (block (i64.const 1) (unreachable)))
60 )
61 (func (export "block-nested-unwind-by-br") (result i32)
62 (block (i32.const 3) (block (i64.const 1) (br 1)) (drop)) (i32.const 9)
63 )
64 (func (export "block-nested-unwind-by-br-value") (result i32)
65 (block (result i32)
66 (i32.const 3) (block (i64.const 1) (br 1 (i32.const 9)))
67 )
68 )
69 (func (export "block-nested-unwind-by-br_if") (result i32)
70 (block (i32.const 3) (block (i64.const 1) (drop (br_if 1 (i32.const 1)))) (drop)) (i32.const 9)
71 )
72 (func (export "block-nested-unwind-by-br_if-value") (result i32)
73 (block (result i32)
74 (i32.const 3) (block (i64.const 1) (drop (drop (br_if 1 (i32.const 9) (i32.const 1)))))
75 )
76 )
77 (func (export "block-nested-unwind-by-br_table") (result i32)
78 (block
79 (i32.const 3) (block (i64.const 1) (br_table 1 (i32.const 1)))
80 (drop)
81 )
82 (i32.const 9)
83 )
84 (func (export "block-nested-unwind-by-br_table-value") (result i32)
85 (block (result i32)
86 (i32.const 3)
87 (block (i64.const 1) (br_table 1 (i32.const 9) (i32.const 1)))
88 )
89 )
90 (func (export "block-nested-unwind-by-return") (result i32)
91 (block (result i32)
92 (i32.const 3) (block (i64.const 1) (return (i32.const 9)))
93 )
94 )
95
96 (func (export "unary-after-unreachable") (result i32)
97 (f32.const 0) (unreachable) (i64.eqz)
98 )
99 (func (export "unary-after-br") (result i32)
100 (block (result i32) (f32.const 0) (br 0 (i32.const 9)) (i64.eqz))
101 )
102 (func (export "unary-after-br_if") (result i32)
103 (block (result i32)
104 (i64.const 0) (drop (br_if 0 (i32.const 9) (i32.const 1))) (i64.eqz)
105 )
106 )
107 (func (export "unary-after-br_table") (result i32)
108 (block (result i32)
109 (f32.const 0) (br_table 0 0 (i32.const 9) (i32.const 0)) (i64.eqz)
110 )
111 )
112 (func (export "unary-after-return") (result i32)
113 (f32.const 0) (return (i32.const 9)) (i64.eqz)
114 )
115
116 (func (export "binary-after-unreachable") (result i32)
117 (f32.const 0) (f64.const 1) (unreachable) (i64.eq)
118 )
119 (func (export "binary-after-br") (result i32)
120 (block (result i32)
121 (f32.const 0) (f64.const 1) (br 0 (i32.const 9)) (i64.eq)
122 )
123 )
124 (func (export "binary-after-br_if") (result i32)
125 (block (result i32)
126 (i64.const 0) (i64.const 1) (drop (br_if 0 (i32.const 9) (i32.const 1)))
127 (i64.eq)
128 )
129 )
130 (func (export "binary-after-br_table") (result i32)
131 (block (result i32)
132 (f32.const 0) (f64.const 1) (br_table 0 (i32.const 9) (i32.const 0))
133 (i64.eq)
134 )
135 )
136 (func (export "binary-after-return") (result i32)
137 (f32.const 0) (f64.const 1) (return (i32.const 9)) (i64.eq)
138 )
139
140 (func (export "select-after-unreachable") (result i32)
141 (f32.const 0) (f64.const 1) (i64.const 0) (unreachable) (select)
142 )
143 (func (export "select-after-br") (result i32)
144 (block (result i32)
145 (f32.const 0) (f64.const 1) (i64.const 0) (br 0 (i32.const 9)) (select)
146 )
147 )
148 (func (export "select-after-br_if") (result i32)
149 (block (result i32)
150 (i32.const 0) (i32.const 1) (i32.const 0)
151 (drop (br_if 0 (i32.const 9) (i32.const 1)))
152 (select)
153 )
154 )
155 (func (export "select-after-br_table") (result i32)
156 (block (result i32)
157 (f32.const 0) (f64.const 1) (i64.const 0)
158 (br_table 0 (i32.const 9) (i32.const 0))
159 (select)
160 )
161 )
162 (func (export "select-after-return") (result i32)
163 (f32.const 0) (f64.const 1) (i64.const 1) (return (i32.const 9)) (select)
164 )
165
166 (func (export "block-value-after-unreachable") (result i32)
167 (block (result i32) (f32.const 0) (unreachable))
168 )
169 (func (export "block-value-after-br") (result i32)
170 (block (result i32) (f32.const 0) (br 0 (i32.const 9)))
171 )
172 (func (export "block-value-after-br_if") (result i32)
173 (block (result i32)
174 (i32.const 0) (drop (br_if 0 (i32.const 9) (i32.const 1)))
175 )
176 )
177 (func (export "block-value-after-br_table") (result i32)
178 (block (result i32)
179 (f32.const 0) (br_table 0 0 (i32.const 9) (i32.const 0))
180 )
181 )
182 (func (export "block-value-after-return") (result i32)
183 (block (result i32) (f32.const 0) (return (i32.const 9)))
184 )
185
186 (func (export "loop-value-after-unreachable") (result i32)
187 (loop (result i32) (f32.const 0) (unreachable))
188 )
189 (func (export "loop-value-after-br") (result i32)
190 (block (result i32) (loop (result i32) (f32.const 0) (br 1 (i32.const 9))))
191 )
192 (func (export "loop-value-after-br_if") (result i32)
193 (block (result i32)
194 (loop (result i32)
195 (i32.const 0) (drop (br_if 1 (i32.const 9) (i32.const 1)))
196 )
197 )
198 )
199
200 (func (export "loop-value-after-br_table") (result i32)
201 (block (result i32)
202 (loop (result i32)
203 (f32.const 0) (br_table 1 1 (i32.const 9) (i32.const 0))
204 )
205 )
206 )
207 (func (export "loop-value-after-return") (result i32)
208 (loop (result i32) (f32.const 0) (return (i32.const 9)))
209 )
210)
211
212(assert_trap (invoke "func-unwind-by-unreachable") "unreachable")
213(assert_return (invoke "func-unwind-by-br"))
214(assert_return (invoke "func-unwind-by-br-value") (i32.const 9))
215(assert_return (invoke "func-unwind-by-br_if"))
216(assert_return (invoke "func-unwind-by-br_if-value") (i32.const 9))
217(assert_return (invoke "func-unwind-by-br_table"))
218(assert_return (invoke "func-unwind-by-br_table-value") (i32.const 9))
219(assert_return (invoke "func-unwind-by-return") (i32.const 9))
220
221(assert_trap (invoke "block-unwind-by-unreachable") "unreachable")
222(assert_return (invoke "block-unwind-by-br") (i32.const 9))
223(assert_return (invoke "block-unwind-by-br-value") (i32.const 9))
224(assert_return (invoke "block-unwind-by-br_if") (i32.const 9))
225(assert_return (invoke "block-unwind-by-br_if-value") (i32.const 9))
226(assert_return (invoke "block-unwind-by-br_table") (i32.const 9))
227(assert_return (invoke "block-unwind-by-br_table-value") (i32.const 9))
228(assert_return (invoke "block-unwind-by-return") (i32.const 9))
229
230(assert_trap (invoke "block-nested-unwind-by-unreachable") "unreachable")
231(assert_return (invoke "block-nested-unwind-by-br") (i32.const 9))
232(assert_return (invoke "block-nested-unwind-by-br-value") (i32.const 9))
233(assert_return (invoke "block-nested-unwind-by-br_if") (i32.const 9))
234(assert_return (invoke "block-nested-unwind-by-br_if-value") (i32.const 9))
235(assert_return (invoke "block-nested-unwind-by-br_table") (i32.const 9))
236(assert_return (invoke "block-nested-unwind-by-br_table-value") (i32.const 9))
237(assert_return (invoke "block-nested-unwind-by-return") (i32.const 9))
238
239(assert_trap (invoke "unary-after-unreachable") "unreachable")
240(assert_return (invoke "unary-after-br") (i32.const 9))
241(assert_return (invoke "unary-after-br_if") (i32.const 9))
242(assert_return (invoke "unary-after-br_table") (i32.const 9))
243(assert_return (invoke "unary-after-return") (i32.const 9))
244
245(assert_trap (invoke "binary-after-unreachable") "unreachable")
246(assert_return (invoke "binary-after-br") (i32.const 9))
247(assert_return (invoke "binary-after-br_if") (i32.const 9))
248(assert_return (invoke "binary-after-br_table") (i32.const 9))
249(assert_return (invoke "binary-after-return") (i32.const 9))
250
251(assert_trap (invoke "select-after-unreachable") "unreachable")
252(assert_return (invoke "select-after-br") (i32.const 9))
253(assert_return (invoke "select-after-br_if") (i32.const 9))
254(assert_return (invoke "select-after-br_table") (i32.const 9))
255(assert_return (invoke "select-after-return") (i32.const 9))
256
257(assert_trap (invoke "block-value-after-unreachable") "unreachable")
258(assert_return (invoke "block-value-after-br") (i32.const 9))
259(assert_return (invoke "block-value-after-br_if") (i32.const 9))
260(assert_return (invoke "block-value-after-br_table") (i32.const 9))
261(assert_return (invoke "block-value-after-return") (i32.const 9))
262
263(assert_trap (invoke "loop-value-after-unreachable") "unreachable")
264(assert_return (invoke "loop-value-after-br") (i32.const 9))
265(assert_return (invoke "loop-value-after-br_if") (i32.const 9))
266(assert_return (invoke "loop-value-after-br_table") (i32.const 9))
267(assert_return (invoke "loop-value-after-return") (i32.const 9))
View as plain text