Commit | Line | Data |
724aa791 |
1 | #!perl |
2 | |
3 | BEGIN { |
4 | chdir 't'; |
5 | @INC = ('../lib', '../ext/B/t'); |
6 | require './test.pl'; |
7 | } |
8 | use OptreeCheck; |
9 | |
10 | plan tests => 22; |
11 | pass("OPTIMIZER TESTS - VAR INITIALIZATION"); |
12 | |
13 | checkOptree ( name => 'sub {my $a}', |
14 | bcopts => '-exec', |
15 | code => sub {my $a}, |
16 | expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); |
17 | # 1 <;> nextstate(main 45 optree.t:23) v |
18 | # 2 <0> padsv[$a:45,46] M/LVINTRO |
19 | # 3 <1> leavesub[1 ref] K/REFC,1 |
20 | EOT_EOT |
21 | # 1 <;> nextstate(main 45 optree.t:23) v |
22 | # 2 <0> padsv[$a:45,46] M/LVINTRO |
23 | # 3 <1> leavesub[1 ref] K/REFC,1 |
24 | EONT_EONT |
25 | |
26 | checkOptree ( name => '-exec sub {my $a}', |
27 | bcopts => '-exec', |
28 | code => sub {my $a}, |
29 | expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); |
30 | # goto - |
31 | # 1 <;> nextstate(main 49 optree.t:52) v |
32 | # 2 <0> padsv[$a:49,50] M/LVINTRO |
33 | # 3 <1> leavesub[1 ref] K/REFC,1 |
34 | EOT_EOT |
35 | # goto - |
36 | # 1 <;> nextstate(main 49 optree.t:45) v |
37 | # 2 <0> padsv[$a:49,50] M/LVINTRO |
38 | # 3 <1> leavesub[1 ref] K/REFC,1 |
39 | EONT_EONT |
40 | |
41 | checkOptree ( name => 'sub {our $a}', |
42 | bcopts => '-exec', |
43 | code => sub {our $a}, |
44 | expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); |
45 | goto - |
46 | 1 <;> nextstate(main 21 optree.t:47) v |
47 | 2 <#> gvsv[*a] s/OURINTR |
48 | 3 <1> leavesub[1 ref] K/REFC,1 |
49 | EOT_EOT |
50 | # goto - |
51 | # 1 <;> nextstate(main 51 optree.t:56) v |
52 | # 2 <$> gvsv(*a) s/OURINTR |
53 | # 3 <1> leavesub[1 ref] K/REFC,1 |
54 | EONT_EONT |
55 | |
56 | checkOptree ( name => 'sub {local $a}', |
57 | bcopts => '-exec', |
58 | code => sub {local $a}, |
59 | expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); |
60 | goto - |
61 | 1 <;> nextstate(main 23 optree.t:57) v |
62 | 2 <#> gvsv[*a] s/LVINTRO |
63 | 3 <1> leavesub[1 ref] K/REFC,1 |
64 | EOT_EOT |
65 | # goto - |
66 | # 1 <;> nextstate(main 53 optree.t:67) v |
67 | # 2 <$> gvsv(*a) s/LVINTRO |
68 | # 3 <1> leavesub[1 ref] K/REFC,1 |
69 | EONT_EONT |
70 | |
71 | checkOptree ( name => 'my $a', |
72 | prog => 'my $a', |
73 | bcopts => '-basic', |
74 | expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); |
75 | # 4 <@> leave[1 ref] vKP/REFC ->(end) |
76 | # 1 <0> enter ->2 |
77 | # 2 <;> nextstate(main 1 -e:1) v ->3 |
78 | # 3 <0> padsv[$a:1,2] vM/LVINTRO ->4 |
79 | EOT_EOT |
80 | # 4 <@> leave[1 ref] vKP/REFC ->(end) |
81 | # 1 <0> enter ->2 |
82 | # 2 <;> nextstate(main 1 -e:1) v ->3 |
83 | # 3 <0> padsv[$a:1,2] vM/LVINTRO ->4 |
84 | EONT_EONT |
85 | |
86 | checkOptree ( name => 'our $a', |
87 | prog => 'our $a', |
88 | bcopts => '-basic', |
89 | expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); |
90 | 4 <@> leave[1 ref] vKP/REFC ->(end) |
91 | 1 <0> enter ->2 |
92 | 2 <;> nextstate(main 1 -e:1) v ->3 |
93 | - <1> ex-rv2sv vK/17 ->4 |
94 | 3 <#> gvsv[*a] s/OURINTR ->4 |
95 | EOT_EOT |
96 | # 4 <@> leave[1 ref] vKP/REFC ->(end) |
97 | # 1 <0> enter ->2 |
98 | # 2 <;> nextstate(main 1 -e:1) v ->3 |
99 | # - <1> ex-rv2sv vK/17 ->4 |
100 | # 3 <$> gvsv(*a) s/OURINTR ->4 |
101 | EONT_EONT |
102 | |
103 | checkOptree ( name => 'local $a', |
104 | prog => 'local $a', |
105 | bcopts => '-basic', |
106 | expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); |
107 | 4 <@> leave[1 ref] vKP/REFC ->(end) |
108 | 1 <0> enter ->2 |
109 | 2 <;> nextstate(main 1 -e:1) v ->3 |
110 | - <1> ex-rv2sv vKM/129 ->4 |
111 | 3 <#> gvsv[*a] s/LVINTRO ->4 |
112 | EOT_EOT |
113 | # 4 <@> leave[1 ref] vKP/REFC ->(end) |
114 | # 1 <0> enter ->2 |
115 | # 2 <;> nextstate(main 1 -e:1) v ->3 |
116 | # - <1> ex-rv2sv vKM/129 ->4 |
117 | # 3 <$> gvsv(*a) s/LVINTRO ->4 |
118 | EONT_EONT |
119 | |
120 | pass("MY, OUR, LOCAL, BOTH SUB AND MAIN, = undef"); |
121 | |
122 | checkOptree ( name => 'sub {my $a=undef}', |
123 | code => sub {my $a=undef}, |
124 | bcopts => '-basic', |
125 | expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); |
126 | 3 <1> leavesub[1 ref] K/REFC,1 ->(end) |
127 | - <@> lineseq KP ->3 |
128 | 1 <;> nextstate(main 24 optree.t:99) v ->2 |
129 | 2 <0> padsv[$a:24,25] sRM*/LVINTRO ->3 |
130 | EOT_EOT |
131 | # 3 <1> leavesub[1 ref] K/REFC,1 ->(end) |
132 | # - <@> lineseq KP ->3 |
133 | # 1 <;> nextstate(main 54 optree.t:149) v ->2 |
134 | # 2 <0> padsv[$a:54,55] sRM*/LVINTRO ->3 |
135 | EONT_EONT |
136 | |
137 | checkOptree ( name => 'sub {our $a=undef}', |
138 | code => sub {our $a=undef}, |
139 | note => 'the global must be reset', |
140 | bcopts => '-basic', |
141 | expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); |
142 | 5 <1> leavesub[1 ref] K/REFC,1 ->(end) |
143 | - <@> lineseq KP ->5 |
144 | 1 <;> nextstate(main 26 optree.t:109) v ->2 |
145 | 4 <2> sassign sKS/2 ->5 |
146 | 2 <0> undef s ->3 |
147 | - <1> ex-rv2sv sKRM*/17 ->4 |
148 | 3 <#> gvsv[*a] s/OURINTR ->4 |
149 | EOT_EOT |
150 | # 5 <1> leavesub[1 ref] K/REFC,1 ->(end) |
151 | # - <@> lineseq KP ->5 |
152 | # 1 <;> nextstate(main 446 optree_varinit.t:137) v ->2 |
153 | # 4 <2> sassign sKS/2 ->5 |
154 | # 2 <0> undef s ->3 |
155 | # - <1> ex-rv2sv sKRM*/17 ->4 |
156 | # 3 <$> gvsv(*a) s/OURINTR ->4 |
157 | EONT_EONT |
158 | |
159 | checkOptree ( name => 'sub {local $a=undef}', |
160 | code => sub {local $a=undef}, |
161 | note => 'local not used enough to bother', |
162 | bcopts => '-basic', |
163 | expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); |
164 | 5 <1> leavesub[1 ref] K/REFC,1 ->(end) |
165 | - <@> lineseq KP ->5 |
166 | 1 <;> nextstate(main 28 optree.t:122) v ->2 |
167 | 4 <2> sassign sKS/2 ->5 |
168 | 2 <0> undef s ->3 |
169 | - <1> ex-rv2sv sKRM*/129 ->4 |
170 | 3 <#> gvsv[*a] s/LVINTRO ->4 |
171 | EOT_EOT |
172 | # 5 <1> leavesub[1 ref] K/REFC,1 ->(end) |
173 | # - <@> lineseq KP ->5 |
174 | # 1 <;> nextstate(main 58 optree.t:141) v ->2 |
175 | # 4 <2> sassign sKS/2 ->5 |
176 | # 2 <0> undef s ->3 |
177 | # - <1> ex-rv2sv sKRM*/129 ->4 |
178 | # 3 <$> gvsv(*a) s/LVINTRO ->4 |
179 | EONT_EONT |
180 | |
181 | checkOptree ( name => 'my $a=undef', |
182 | prog => 'my $a=undef', |
183 | bcopts => '-basic', |
184 | expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); |
185 | 4 <@> leave[1 ref] vKP/REFC ->(end) |
186 | 1 <0> enter ->2 |
187 | 2 <;> nextstate(main 1 -e:1) v ->3 |
188 | 3 <0> padsv[$a:1,2] vRM*/LVINTRO ->4 |
189 | EOT_EOT |
190 | # 4 <@> leave[1 ref] vKP/REFC ->(end) |
191 | # 1 <0> enter ->2 |
192 | # 2 <;> nextstate(main 1 -e:1) v ->3 |
193 | # 3 <0> padsv[$a:1,2] vRM*/LVINTRO ->4 |
194 | EONT_EONT |
195 | |
196 | checkOptree ( name => 'our $a=undef', |
197 | prog => 'our $a=undef', |
198 | note => 'global must be reassigned', |
199 | bcopts => '-basic', |
200 | expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); |
201 | 6 <@> leave[1 ref] vKP/REFC ->(end) |
202 | 1 <0> enter ->2 |
203 | 2 <;> nextstate(main 1 -e:1) v ->3 |
204 | 5 <2> sassign vKS/2 ->6 |
205 | 3 <0> undef s ->4 |
206 | - <1> ex-rv2sv sKRM*/17 ->5 |
207 | 4 <#> gvsv[*a] s/OURINTR ->5 |
208 | EOT_EOT |
209 | # 6 <@> leave[1 ref] vKP/REFC ->(end) |
210 | # 1 <0> enter ->2 |
211 | # 2 <;> nextstate(main 1 -e:1) v ->3 |
212 | # 5 <2> sassign vKS/2 ->6 |
213 | # 3 <0> undef s ->4 |
214 | # - <1> ex-rv2sv sKRM*/17 ->5 |
215 | # 4 <$> gvsv(*a) s/OURINTR ->5 |
216 | EONT_EONT |
217 | |
218 | checkOptree ( name => 'local $a=undef', |
219 | prog => 'local $a=undef', |
220 | note => 'locals are rare, probly not worth doing', |
221 | bcopts => '-basic', |
222 | expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); |
223 | 6 <@> leave[1 ref] vKP/REFC ->(end) |
224 | 1 <0> enter ->2 |
225 | 2 <;> nextstate(main 1 -e:1) v ->3 |
226 | 5 <2> sassign vKS/2 ->6 |
227 | 3 <0> undef s ->4 |
228 | - <1> ex-rv2sv sKRM*/129 ->5 |
229 | 4 <#> gvsv[*a] s/LVINTRO ->5 |
230 | EOT_EOT |
231 | # 6 <@> leave[1 ref] vKP/REFC ->(end) |
232 | # 1 <0> enter ->2 |
233 | # 2 <;> nextstate(main 1 -e:1) v ->3 |
234 | # 5 <2> sassign vKS/2 ->6 |
235 | # 3 <0> undef s ->4 |
236 | # - <1> ex-rv2sv sKRM*/129 ->5 |
237 | # 4 <$> gvsv(*a) s/LVINTRO ->5 |
238 | EONT_EONT |
239 | |
240 | checkOptree ( name => 'sub {my $a=()}', |
241 | code => sub {my $a=()}, |
242 | todo => 'optimize', |
243 | bcopts => '-exec', |
244 | expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); |
245 | goto - |
246 | 1 <;> nextstate(main -439 optree.t:105) v |
247 | 2 <0> stub sP |
248 | 3 <0> padsv[$a:-439,-438] sRM*/LVINTRO |
249 | 4 <2> sassign sKS/2 |
250 | 5 <1> leavesub[1 ref] K/REFC,1 |
251 | EOT_EOT |
252 | # 1 <;> nextstate(main 438 optree_varinit.t:247) v |
253 | # 2 <0> stub sP |
254 | # 3 <0> padsv[$a:438,439] sRM*/LVINTRO |
255 | # 4 <2> sassign sKS/2 |
256 | # 5 <1> leavesub[1 ref] K/REFC,1 |
257 | EONT_EONT |
258 | |
259 | checkOptree ( name => 'sub {our $a=()}', |
260 | code => sub {our $a=()}, |
261 | #todo => 'probly not worth doing', |
262 | bcopts => '-exec', |
263 | expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); |
264 | 1 <;> nextstate(main 31 optree.t:177) v |
265 | 2 <0> stub sP |
266 | 3 <#> gvsv[*a] s/OURINTR |
267 | 4 <2> sassign sKS/2 |
268 | 5 <1> leavesub[1 ref] K/REFC,1 |
269 | EOT_EOT |
270 | # 1 <;> nextstate(main 440 optree_varinit.t:262) v |
271 | # 2 <0> stub sP |
272 | # 3 <$> gvsv(*a) s/OURINTR |
273 | # 4 <2> sassign sKS/2 |
274 | # 5 <1> leavesub[1 ref] K/REFC,1 |
275 | EONT_EONT |
276 | |
277 | checkOptree ( name => 'sub {local $a=()}', |
278 | code => sub {local $a=()}, |
279 | #todo => 'probly not worth doing', |
280 | bcopts => '-exec', |
281 | expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); |
282 | goto - |
283 | 1 <;> nextstate(main 33 optree.t:190) v |
284 | 2 <0> stub sP |
285 | 3 <#> gvsv[*a] s/LVINTRO |
286 | 4 <2> sassign sKS/2 |
287 | 5 <1> leavesub[1 ref] K/REFC,1 |
288 | EOT_EOT |
289 | # goto - |
290 | # 1 <;> nextstate(main 63 optree.t:225) v |
291 | # 2 <0> stub sP |
292 | # 3 <$> gvsv(*a) s/LVINTRO |
293 | # 4 <2> sassign sKS/2 |
294 | # 5 <1> leavesub[1 ref] K/REFC,1 |
295 | EONT_EONT |
296 | |
297 | checkOptree ( name => 'my $a=()', |
298 | prog => 'my $a=()', |
299 | todo => 'optimize ? its one of the idioms', |
300 | bcopts => '-exec', |
301 | expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); |
302 | 1 <0> enter |
303 | 2 <;> nextstate(main 1 -e:1) v |
304 | 3 <0> stub sP |
305 | 4 <0> padsv[$a:1,2] sRM*/LVINTRO |
306 | 5 <2> sassign vKS/2 |
307 | 6 <@> leave[1 ref] vKP/REFC |
308 | EOT_EOT |
309 | # 1 <0> enter |
310 | # 2 <;> nextstate(main 1 -e:1) v |
311 | # 3 <0> stub sP |
312 | # 4 <0> padsv[$a:1,2] sRM*/LVINTRO |
313 | # 5 <2> sassign vKS/2 |
314 | # 6 <@> leave[1 ref] vKP/REFC |
315 | EONT_EONT |
316 | |
317 | checkOptree ( name => 'our $a=()', |
318 | prog => 'our $a=()', |
319 | #todo => 'probly not worth doing', |
320 | bcopts => '-exec', |
321 | expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); |
322 | 1 <0> enter |
323 | 2 <;> nextstate(main 1 -e:1) v |
324 | 3 <0> stub sP |
325 | 4 <#> gvsv[*a] s/OURINTR |
326 | 5 <2> sassign vKS/2 |
327 | 6 <@> leave[1 ref] vKP/REFC |
328 | EOT_EOT |
329 | # 1 <0> enter |
330 | # 2 <;> nextstate(main 1 -e:1) v |
331 | # 3 <0> stub sP |
332 | # 4 <$> gvsv(*a) s/OURINTR |
333 | # 5 <2> sassign vKS/2 |
334 | # 6 <@> leave[1 ref] vKP/REFC |
335 | EONT_EONT |
336 | |
337 | checkOptree ( name => 'local $a=()', |
338 | prog => 'local $a=()', |
339 | #todo => 'probly not worth doing', |
340 | bcopts => '-exec', |
341 | expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); |
342 | 1 <0> enter |
343 | 2 <;> nextstate(main 1 -e:1) v |
344 | 3 <0> stub sP |
345 | 4 <#> gvsv[*a] s/LVINTRO |
346 | 5 <2> sassign vKS/2 |
347 | 6 <@> leave[1 ref] vKP/REFC |
348 | EOT_EOT |
349 | # 1 <0> enter |
350 | # 2 <;> nextstate(main 1 -e:1) v |
351 | # 3 <0> stub sP |
352 | # 4 <$> gvsv(*a) s/LVINTRO |
353 | # 5 <2> sassign vKS/2 |
354 | # 6 <@> leave[1 ref] vKP/REFC |
355 | EONT_EONT |
356 | |
357 | checkOptree ( name => 'my ($a,$b)=()', |
358 | prog => 'my ($a,$b)=()', |
359 | #todo => 'probly not worth doing', |
360 | bcopts => '-exec', |
361 | expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); |
362 | # 1 <0> enter |
363 | # 2 <;> nextstate(main 1 -e:1) v |
364 | # 3 <0> pushmark s |
365 | # 4 <0> pushmark sRM*/128 |
366 | # 5 <0> padsv[$a:1,2] lRM*/LVINTRO |
367 | # 6 <0> padsv[$b:1,2] lRM*/LVINTRO |
368 | # 7 <2> aassign[t3] vKS |
369 | # 8 <@> leave[1 ref] vKP/REFC |
370 | EOT_EOT |
371 | # 1 <0> enter |
372 | # 2 <;> nextstate(main 1 -e:1) v |
373 | # 3 <0> pushmark s |
374 | # 4 <0> pushmark sRM*/128 |
375 | # 5 <0> padsv[$a:1,2] lRM*/LVINTRO |
376 | # 6 <0> padsv[$b:1,2] lRM*/LVINTRO |
377 | # 7 <2> aassign[t3] vKS |
378 | # 8 <@> leave[1 ref] vKP/REFC |
379 | EONT_EONT |
380 | |
381 | __END__ |
382 | |