Re: tests for change #22539
[p5sagit/p5-mst-13.2.git] / ext / B / t / optree_varinit.t
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