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");
26 checkOptree ( name => 'sub {my $a}',
29 strip_open_hints => 1,
30 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
31 # 1 <;> nextstate(main 45 optree.t:23) v:>,<,%
32 # 2 <0> padsv[$a:45,46] M/LVINTRO
33 # 3 <1> leavesub[1 ref] K/REFC,1
35 # 1 <;> nextstate(main 45 optree.t:23) v:>,<,%
36 # 2 <0> padsv[$a:45,46] M/LVINTRO
37 # 3 <1> leavesub[1 ref] K/REFC,1
40 checkOptree ( name => '-exec sub {my $a}',
43 strip_open_hints => 1,
44 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
45 # 1 <;> nextstate(main 49 optree.t:52) v:>,<,%
46 # 2 <0> padsv[$a:49,50] M/LVINTRO
47 # 3 <1> leavesub[1 ref] K/REFC,1
49 # 1 <;> nextstate(main 49 optree.t:45) v:>,<,%
50 # 2 <0> padsv[$a:49,50] M/LVINTRO
51 # 3 <1> leavesub[1 ref] K/REFC,1
54 checkOptree ( name => 'sub {our $a}',
57 strip_open_hints => 1,
58 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
59 1 <;> nextstate(main 21 optree.t:47) v:>,<,%
60 2 <#> gvsv[*a] s/OURINTR
61 3 <1> leavesub[1 ref] K/REFC,1
63 # 1 <;> nextstate(main 51 optree.t:56) v:>,<,%
64 # 2 <$> gvsv(*a) s/OURINTR
65 # 3 <1> leavesub[1 ref] K/REFC,1
68 checkOptree ( name => 'sub {local $a}',
70 code => sub {local $a},
71 strip_open_hints => 1,
72 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
73 1 <;> nextstate(main 23 optree.t:57) v:>,<,%,{
74 2 <#> gvsv[*a] s/LVINTRO
75 3 <1> leavesub[1 ref] K/REFC,1
77 # 1 <;> nextstate(main 53 optree.t:67) v:>,<,%,{
78 # 2 <$> gvsv(*a) s/LVINTRO
79 # 3 <1> leavesub[1 ref] K/REFC,1
82 checkOptree ( name => 'my $a',
85 strip_open_hints => 1,
86 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
87 # 4 <@> leave[1 ref] vKP/REFC ->(end)
89 # 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
90 # 3 <0> padsv[$a:1,2] vM/LVINTRO ->4
92 # 4 <@> leave[1 ref] vKP/REFC ->(end)
94 # 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
95 # 3 <0> padsv[$a:1,2] vM/LVINTRO ->4
98 checkOptree ( name => 'our $a',
101 strip_open_hints => 1,
102 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
103 4 <@> leave[1 ref] vKP/REFC ->(end)
105 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
106 - <1> ex-rv2sv vK/17 ->4
107 3 <#> gvsv[*a] s/OURINTR ->4
109 # 4 <@> leave[1 ref] vKP/REFC ->(end)
111 # 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
112 # - <1> ex-rv2sv vK/17 ->4
113 # 3 <$> gvsv(*a) s/OURINTR ->4
116 checkOptree ( name => 'local $a',
118 errs => ['Name "main::a" used only once: possible typo at -e line 1.'],
120 strip_open_hints => 1,
121 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
122 4 <@> leave[1 ref] vKP/REFC ->(end)
124 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
125 - <1> ex-rv2sv vKM/129 ->4
126 3 <#> gvsv[*a] s/LVINTRO ->4
128 # 4 <@> leave[1 ref] vKP/REFC ->(end)
130 # 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
131 # - <1> ex-rv2sv vKM/129 ->4
132 # 3 <$> gvsv(*a) s/LVINTRO ->4
135 pass("MY, OUR, LOCAL, BOTH SUB AND MAIN, = undef");
137 checkOptree ( name => 'sub {my $a=undef}',
138 code => sub {my $a=undef},
140 strip_open_hints => 1,
141 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
142 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
144 1 <;> nextstate(main 641 optree_varinit.t:130) v:>,<,% ->2
145 4 <2> sassign sKS/2 ->5
147 3 <0> padsv[$a:641,642] sRM*/LVINTRO ->4
149 # 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
150 # - <@> lineseq KP ->5
151 # 1 <;> nextstate(main 641 optree_varinit.t:130) v:>,<,% ->2
152 # 4 <2> sassign sKS/2 ->5
154 # 3 <0> padsv[$a:641,642] sRM*/LVINTRO ->4
157 checkOptree ( name => 'sub {our $a=undef}',
158 code => sub {our $a=undef},
159 note => 'the global must be reset',
161 strip_open_hints => 1,
162 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
163 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
165 1 <;> nextstate(main 26 optree.t:109) v:>,<,%,{ ->2
166 4 <2> sassign sKS/2 ->5
168 - <1> ex-rv2sv sKRM*/17 ->4
169 3 <#> gvsv[*a] s/OURINTR ->4
171 # 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
172 # - <@> lineseq KP ->5
173 # 1 <;> nextstate(main 446 optree_varinit.t:137) v:>,<,%,{ ->2
174 # 4 <2> sassign sKS/2 ->5
176 # - <1> ex-rv2sv sKRM*/17 ->4
177 # 3 <$> gvsv(*a) s/OURINTR ->4
180 checkOptree ( name => 'sub {local $a=undef}',
181 code => sub {local $a=undef},
182 note => 'local not used enough to bother',
184 strip_open_hints => 1,
185 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
186 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
188 1 <;> nextstate(main 28 optree.t:122) v:>,<,%,{ ->2
189 4 <2> sassign sKS/2 ->5
191 - <1> ex-rv2sv sKRM*/129 ->4
192 3 <#> gvsv[*a] s/LVINTRO ->4
194 # 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
195 # - <@> lineseq KP ->5
196 # 1 <;> nextstate(main 58 optree.t:141) v:>,<,%,{ ->2
197 # 4 <2> sassign sKS/2 ->5
199 # - <1> ex-rv2sv sKRM*/129 ->4
200 # 3 <$> gvsv(*a) s/LVINTRO ->4
203 checkOptree ( name => 'my $a=undef',
204 prog => 'my $a=undef',
206 strip_open_hints => 1,
207 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
208 6 <@> leave[1 ref] vKP/REFC ->(end)
210 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
211 5 <2> sassign vKS/2 ->6
213 4 <0> padsv[$a:1,2] sRM*/LVINTRO ->5
215 # 6 <@> leave[1 ref] vKP/REFC ->(end)
217 # 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
218 # 5 <2> sassign vKS/2 ->6
220 # 4 <0> padsv[$a:1,2] sRM*/LVINTRO ->5
223 checkOptree ( name => 'our $a=undef',
224 prog => 'our $a=undef',
225 note => 'global must be reassigned',
227 strip_open_hints => 1,
228 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
229 6 <@> leave[1 ref] vKP/REFC ->(end)
231 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
232 5 <2> sassign vKS/2 ->6
234 - <1> ex-rv2sv sKRM*/17 ->5
235 4 <#> gvsv[*a] s/OURINTR ->5
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
246 checkOptree ( name => 'local $a=undef',
247 prog => 'local $a=undef',
248 errs => ['Name "main::a" used only once: possible typo at -e line 1.'],
249 note => 'locals are rare, probly not worth doing',
251 strip_open_hints => 1,
252 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
253 6 <@> leave[1 ref] vKP/REFC ->(end)
255 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
256 5 <2> sassign vKS/2 ->6
258 - <1> ex-rv2sv sKRM*/129 ->5
259 4 <#> gvsv[*a] s/LVINTRO ->5
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
270 checkOptree ( name => 'sub {my $a=()}',
271 code => sub {my $a=()},
273 strip_open_hints => 1,
274 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
275 1 <;> nextstate(main -439 optree.t:105) v:>,<,%
277 3 <0> padsv[$a:-439,-438] sRM*/LVINTRO
279 5 <1> leavesub[1 ref] K/REFC,1
281 # 1 <;> nextstate(main 438 optree_varinit.t:247) v:>,<,%
283 # 3 <0> padsv[$a:438,439] sRM*/LVINTRO
284 # 4 <2> sassign sKS/2
285 # 5 <1> leavesub[1 ref] K/REFC,1
288 checkOptree ( name => 'sub {our $a=()}',
289 code => sub {our $a=()},
290 #todo => 'probly not worth doing',
292 strip_open_hints => 1,
293 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
294 1 <;> nextstate(main 31 optree.t:177) v:>,<,%,{
296 3 <#> gvsv[*a] s/OURINTR
298 5 <1> leavesub[1 ref] K/REFC,1
300 # 1 <;> nextstate(main 440 optree_varinit.t:262) v:>,<,%,{
302 # 3 <$> gvsv(*a) s/OURINTR
303 # 4 <2> sassign sKS/2
304 # 5 <1> leavesub[1 ref] K/REFC,1
307 checkOptree ( name => 'sub {local $a=()}',
308 code => sub {local $a=()},
309 #todo => 'probly not worth doing',
311 strip_open_hints => 1,
312 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
313 1 <;> nextstate(main 33 optree.t:190) v:>,<,%,{
315 3 <#> gvsv[*a] s/LVINTRO
317 5 <1> leavesub[1 ref] K/REFC,1
319 # 1 <;> nextstate(main 63 optree.t:225) v:>,<,%,{
321 # 3 <$> gvsv(*a) s/LVINTRO
322 # 4 <2> sassign sKS/2
323 # 5 <1> leavesub[1 ref] K/REFC,1
326 checkOptree ( name => 'my $a=()',
329 strip_open_hints => 1,
330 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
332 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
334 4 <0> padsv[$a:1,2] sRM*/LVINTRO
336 6 <@> leave[1 ref] vKP/REFC
339 # 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
341 # 4 <0> padsv[$a:1,2] sRM*/LVINTRO
342 # 5 <2> sassign vKS/2
343 # 6 <@> leave[1 ref] vKP/REFC
346 checkOptree ( name => 'our $a=()',
348 #todo => 'probly not worth doing',
350 strip_open_hints => 1,
351 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
353 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
355 4 <#> gvsv[*a] s/OURINTR
357 6 <@> leave[1 ref] vKP/REFC
360 # 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
362 # 4 <$> gvsv(*a) s/OURINTR
363 # 5 <2> sassign vKS/2
364 # 6 <@> leave[1 ref] vKP/REFC
367 checkOptree ( name => 'local $a=()',
368 prog => 'local $a=()',
369 errs => ['Name "main::a" used only once: possible typo at -e line 1.'],
370 #todo => 'probly not worth doing',
372 strip_open_hints => 1,
373 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
375 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
377 4 <#> gvsv[*a] s/LVINTRO
379 6 <@> leave[1 ref] vKP/REFC
382 # 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
384 # 4 <$> gvsv(*a) s/LVINTRO
385 # 5 <2> sassign vKS/2
386 # 6 <@> leave[1 ref] vKP/REFC
389 checkOptree ( name => 'my ($a,$b)=()',
390 prog => 'my ($a,$b)=()',
391 #todo => 'probly not worth doing',
393 strip_open_hints => 1,
394 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
396 # 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
398 # 4 <0> pushmark sRM*/128
399 # 5 <0> padsv[$a:1,2] lRM*/LVINTRO
400 # 6 <0> padsv[$b:1,2] lRM*/LVINTRO
401 # 7 <2> aassign[t3] vKS
402 # 8 <@> leave[1 ref] vKP/REFC
405 # 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
407 # 4 <0> pushmark sRM*/128
408 # 5 <0> padsv[$a:1,2] lRM*/LVINTRO
409 # 6 <0> padsv[$b:1,2] lRM*/LVINTRO
410 # 7 <2> aassign[t3] vKS
411 # 8 <@> leave[1 ref] vKP/REFC