6 @INC = ('.', '../lib', '../ext/B/t');
12 if (($Config::Config{'extensions'} !~ /\bB\b/) ){
13 print "1..0 # Skip -- Perl configured without B module\n";
16 # require 'test.pl'; # now done by OptreeCheck
22 skip "no perlio in this build", 22 unless $Config::Config{useperlio};
24 pass("OPTIMIZER TESTS - VAR INITIALIZATION");
28 if (((caller 0)[10]||{})->{open}) {
29 @open_todo = (skip => "\$^OPEN is set");
34 checkOptree ( name => 'sub {my $a}',
38 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
39 # 1 <;> nextstate(main 45 optree.t:23) v
40 # 2 <0> padsv[$a:45,46] M/LVINTRO
41 # 3 <1> leavesub[1 ref] K/REFC,1
43 # 1 <;> nextstate(main 45 optree.t:23) v
44 # 2 <0> padsv[$a:45,46] M/LVINTRO
45 # 3 <1> leavesub[1 ref] K/REFC,1
48 checkOptree ( name => '-exec sub {my $a}',
52 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
53 # 1 <;> nextstate(main 49 optree.t:52) v
54 # 2 <0> padsv[$a:49,50] M/LVINTRO
55 # 3 <1> leavesub[1 ref] K/REFC,1
57 # 1 <;> nextstate(main 49 optree.t:45) v
58 # 2 <0> padsv[$a:49,50] M/LVINTRO
59 # 3 <1> leavesub[1 ref] K/REFC,1
62 checkOptree ( name => 'sub {our $a}',
66 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
67 1 <;> nextstate(main 21 optree.t:47) v
68 2 <#> gvsv[*a] s/OURINTR
69 3 <1> leavesub[1 ref] K/REFC,1
71 # 1 <;> nextstate(main 51 optree.t:56) v
72 # 2 <$> gvsv(*a) s/OURINTR
73 # 3 <1> leavesub[1 ref] K/REFC,1
76 checkOptree ( name => 'sub {local $a}',
78 code => sub {local $a},
80 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
81 1 <;> nextstate(main 23 optree.t:57) v:{
82 2 <#> gvsv[*a] s/LVINTRO
83 3 <1> leavesub[1 ref] K/REFC,1
85 # 1 <;> nextstate(main 53 optree.t:67) v:{
86 # 2 <$> gvsv(*a) s/LVINTRO
87 # 3 <1> leavesub[1 ref] K/REFC,1
90 checkOptree ( name => 'my $a',
94 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
95 # 4 <@> leave[1 ref] vKP/REFC ->(end)
97 # 2 <;> nextstate(main 1 -e:1) v:{ ->3
98 # 3 <0> padsv[$a:1,2] vM/LVINTRO ->4
100 # 4 <@> leave[1 ref] vKP/REFC ->(end)
102 # 2 <;> nextstate(main 1 -e:1) v:{ ->3
103 # 3 <0> padsv[$a:1,2] vM/LVINTRO ->4
106 checkOptree ( name => 'our $a',
110 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
111 4 <@> leave[1 ref] vKP/REFC ->(end)
113 2 <;> nextstate(main 1 -e:1) v:{ ->3
114 - <1> ex-rv2sv vK/17 ->4
115 3 <#> gvsv[*a] s/OURINTR ->4
117 # 4 <@> leave[1 ref] vKP/REFC ->(end)
119 # 2 <;> nextstate(main 1 -e:1) v:{ ->3
120 # - <1> ex-rv2sv vK/17 ->4
121 # 3 <$> gvsv(*a) s/OURINTR ->4
124 checkOptree ( name => 'local $a',
126 errs => ['Name "main::a" used only once: possible typo at -e line 1.'],
129 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
130 4 <@> leave[1 ref] vKP/REFC ->(end)
132 2 <;> nextstate(main 1 -e:1) v:{ ->3
133 - <1> ex-rv2sv vKM/129 ->4
134 3 <#> gvsv[*a] s/LVINTRO ->4
136 # 4 <@> leave[1 ref] vKP/REFC ->(end)
138 # 2 <;> nextstate(main 1 -e:1) v:{ ->3
139 # - <1> ex-rv2sv vKM/129 ->4
140 # 3 <$> gvsv(*a) s/LVINTRO ->4
143 pass("MY, OUR, LOCAL, BOTH SUB AND MAIN, = undef");
145 checkOptree ( name => 'sub {my $a=undef}',
146 code => sub {my $a=undef},
149 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
150 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
152 1 <;> nextstate(main 641 optree_varinit.t:130) v ->2
153 4 <2> sassign sKS/2 ->5
155 3 <0> padsv[$a:641,642] sRM*/LVINTRO ->4
157 # 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
158 # - <@> lineseq KP ->5
159 # 1 <;> nextstate(main 641 optree_varinit.t:130) v ->2
160 # 4 <2> sassign sKS/2 ->5
162 # 3 <0> padsv[$a:641,642] sRM*/LVINTRO ->4
165 checkOptree ( name => 'sub {our $a=undef}',
166 code => sub {our $a=undef},
167 note => 'the global must be reset',
170 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
171 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
173 1 <;> nextstate(main 26 optree.t:109) v:{ ->2
174 4 <2> sassign sKS/2 ->5
176 - <1> ex-rv2sv sKRM*/17 ->4
177 3 <#> gvsv[*a] s/OURINTR ->4
179 # 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
180 # - <@> lineseq KP ->5
181 # 1 <;> nextstate(main 446 optree_varinit.t:137) v:{ ->2
182 # 4 <2> sassign sKS/2 ->5
184 # - <1> ex-rv2sv sKRM*/17 ->4
185 # 3 <$> gvsv(*a) s/OURINTR ->4
188 checkOptree ( name => 'sub {local $a=undef}',
189 code => sub {local $a=undef},
190 note => 'local not used enough to bother',
193 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
194 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
196 1 <;> nextstate(main 28 optree.t:122) v:{ ->2
197 4 <2> sassign sKS/2 ->5
199 - <1> ex-rv2sv sKRM*/129 ->4
200 3 <#> gvsv[*a] s/LVINTRO ->4
202 # 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
203 # - <@> lineseq KP ->5
204 # 1 <;> nextstate(main 58 optree.t:141) v:{ ->2
205 # 4 <2> sassign sKS/2 ->5
207 # - <1> ex-rv2sv sKRM*/129 ->4
208 # 3 <$> gvsv(*a) s/LVINTRO ->4
211 checkOptree ( name => 'my $a=undef',
212 prog => 'my $a=undef',
215 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
216 6 <@> leave[1 ref] vKP/REFC ->(end)
218 2 <;> nextstate(main 1 -e:1) v:{ ->3
219 5 <2> sassign vKS/2 ->6
221 4 <0> padsv[$a:1,2] sRM*/LVINTRO ->5
223 # 6 <@> leave[1 ref] vKP/REFC ->(end)
225 # 2 <;> nextstate(main 1 -e:1) v:{ ->3
226 # 5 <2> sassign vKS/2 ->6
228 # 4 <0> padsv[$a:1,2] sRM*/LVINTRO ->5
231 checkOptree ( name => 'our $a=undef',
232 prog => 'our $a=undef',
233 note => 'global must be reassigned',
236 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
237 6 <@> leave[1 ref] vKP/REFC ->(end)
239 2 <;> nextstate(main 1 -e:1) v:{ ->3
240 5 <2> sassign vKS/2 ->6
242 - <1> ex-rv2sv sKRM*/17 ->5
243 4 <#> gvsv[*a] s/OURINTR ->5
245 # 6 <@> leave[1 ref] vKP/REFC ->(end)
247 # 2 <;> nextstate(main 1 -e:1) v:{ ->3
248 # 5 <2> sassign vKS/2 ->6
250 # - <1> ex-rv2sv sKRM*/17 ->5
251 # 4 <$> gvsv(*a) s/OURINTR ->5
254 checkOptree ( name => 'local $a=undef',
255 prog => 'local $a=undef',
256 errs => ['Name "main::a" used only once: possible typo at -e line 1.'],
257 note => 'locals are rare, probly not worth doing',
260 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
261 6 <@> leave[1 ref] vKP/REFC ->(end)
263 2 <;> nextstate(main 1 -e:1) v:{ ->3
264 5 <2> sassign vKS/2 ->6
266 - <1> ex-rv2sv sKRM*/129 ->5
267 4 <#> gvsv[*a] s/LVINTRO ->5
269 # 6 <@> leave[1 ref] vKP/REFC ->(end)
271 # 2 <;> nextstate(main 1 -e:1) v:{ ->3
272 # 5 <2> sassign vKS/2 ->6
274 # - <1> ex-rv2sv sKRM*/129 ->5
275 # 4 <$> gvsv(*a) s/LVINTRO ->5
278 checkOptree ( name => 'sub {my $a=()}',
279 code => sub {my $a=()},
282 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
283 1 <;> nextstate(main -439 optree.t:105) v
285 3 <0> padsv[$a:-439,-438] sRM*/LVINTRO
287 5 <1> leavesub[1 ref] K/REFC,1
289 # 1 <;> nextstate(main 438 optree_varinit.t:247) v
291 # 3 <0> padsv[$a:438,439] sRM*/LVINTRO
292 # 4 <2> sassign sKS/2
293 # 5 <1> leavesub[1 ref] K/REFC,1
296 checkOptree ( name => 'sub {our $a=()}',
297 code => sub {our $a=()},
298 #todo => 'probly not worth doing',
301 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
302 1 <;> nextstate(main 31 optree.t:177) v:{
304 3 <#> gvsv[*a] s/OURINTR
306 5 <1> leavesub[1 ref] K/REFC,1
308 # 1 <;> nextstate(main 440 optree_varinit.t:262) v:{
310 # 3 <$> gvsv(*a) s/OURINTR
311 # 4 <2> sassign sKS/2
312 # 5 <1> leavesub[1 ref] K/REFC,1
315 checkOptree ( name => 'sub {local $a=()}',
316 code => sub {local $a=()},
317 #todo => 'probly not worth doing',
320 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
321 1 <;> nextstate(main 33 optree.t:190) v:{
323 3 <#> gvsv[*a] s/LVINTRO
325 5 <1> leavesub[1 ref] K/REFC,1
327 # 1 <;> nextstate(main 63 optree.t:225) v:{
329 # 3 <$> gvsv(*a) s/LVINTRO
330 # 4 <2> sassign sKS/2
331 # 5 <1> leavesub[1 ref] K/REFC,1
334 checkOptree ( name => 'my $a=()',
338 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
340 2 <;> nextstate(main 1 -e:1) v:{
342 4 <0> padsv[$a:1,2] sRM*/LVINTRO
344 6 <@> leave[1 ref] vKP/REFC
347 # 2 <;> nextstate(main 1 -e:1) v:{
349 # 4 <0> padsv[$a:1,2] sRM*/LVINTRO
350 # 5 <2> sassign vKS/2
351 # 6 <@> leave[1 ref] vKP/REFC
354 checkOptree ( name => 'our $a=()',
356 #todo => 'probly not worth doing',
359 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
361 2 <;> nextstate(main 1 -e:1) v:{
363 4 <#> gvsv[*a] s/OURINTR
365 6 <@> leave[1 ref] vKP/REFC
368 # 2 <;> nextstate(main 1 -e:1) v:{
370 # 4 <$> gvsv(*a) s/OURINTR
371 # 5 <2> sassign vKS/2
372 # 6 <@> leave[1 ref] vKP/REFC
375 checkOptree ( name => 'local $a=()',
376 prog => 'local $a=()',
377 errs => ['Name "main::a" used only once: possible typo at -e line 1.'],
378 #todo => 'probly not worth doing',
381 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
383 2 <;> nextstate(main 1 -e:1) v:{
385 4 <#> gvsv[*a] s/LVINTRO
387 6 <@> leave[1 ref] vKP/REFC
390 # 2 <;> nextstate(main 1 -e:1) v:{
392 # 4 <$> gvsv(*a) s/LVINTRO
393 # 5 <2> sassign vKS/2
394 # 6 <@> leave[1 ref] vKP/REFC
397 checkOptree ( name => 'my ($a,$b)=()',
398 prog => 'my ($a,$b)=()',
399 #todo => 'probly not worth doing',
402 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
404 # 2 <;> nextstate(main 1 -e:1) v:{
406 # 4 <0> pushmark sRM*/128
407 # 5 <0> padsv[$a:1,2] lRM*/LVINTRO
408 # 6 <0> padsv[$b:1,2] lRM*/LVINTRO
409 # 7 <2> aassign[t3] vKS
410 # 8 <@> leave[1 ref] vKP/REFC
413 # 2 <;> nextstate(main 1 -e:1) v:{
415 # 4 <0> pushmark sRM*/128
416 # 5 <0> padsv[$a:1,2] lRM*/LVINTRO
417 # 6 <0> padsv[$b:1,2] lRM*/LVINTRO
418 # 7 <2> aassign[t3] vKS
419 # 8 <@> leave[1 ref] vKP/REFC