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 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
30 # 1 <;> nextstate(main 45 optree.t:23) v
31 # 2 <0> padsv[$a:45,46] M/LVINTRO
32 # 3 <1> leavesub[1 ref] K/REFC,1
34 # 1 <;> nextstate(main 45 optree.t:23) v
35 # 2 <0> padsv[$a:45,46] M/LVINTRO
36 # 3 <1> leavesub[1 ref] K/REFC,1
39 checkOptree ( name => '-exec sub {my $a}',
42 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
43 # 1 <;> nextstate(main 49 optree.t:52) v
44 # 2 <0> padsv[$a:49,50] M/LVINTRO
45 # 3 <1> leavesub[1 ref] K/REFC,1
47 # 1 <;> nextstate(main 49 optree.t:45) v
48 # 2 <0> padsv[$a:49,50] M/LVINTRO
49 # 3 <1> leavesub[1 ref] K/REFC,1
52 checkOptree ( name => 'sub {our $a}',
55 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
56 1 <;> nextstate(main 21 optree.t:47) v
57 2 <#> gvsv[*a] s/OURINTR
58 3 <1> leavesub[1 ref] K/REFC,1
60 # 1 <;> nextstate(main 51 optree.t:56) v
61 # 2 <$> gvsv(*a) s/OURINTR
62 # 3 <1> leavesub[1 ref] K/REFC,1
65 checkOptree ( name => 'sub {local $a}',
67 code => sub {local $a},
68 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
69 1 <;> nextstate(main 23 optree.t:57) v
70 2 <#> gvsv[*a] s/LVINTRO
71 3 <1> leavesub[1 ref] K/REFC,1
73 # 1 <;> nextstate(main 53 optree.t:67) v
74 # 2 <$> gvsv(*a) s/LVINTRO
75 # 3 <1> leavesub[1 ref] K/REFC,1
78 checkOptree ( name => 'my $a',
81 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
82 # 4 <@> leave[1 ref] vKP/REFC ->(end)
84 # 2 <;> nextstate(main 1 -e:1) v ->3
85 # 3 <0> padsv[$a:1,2] vM/LVINTRO ->4
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
93 checkOptree ( name => 'our $a',
96 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
97 4 <@> leave[1 ref] vKP/REFC ->(end)
99 2 <;> nextstate(main 1 -e:1) v ->3
100 - <1> ex-rv2sv vK/17 ->4
101 3 <#> gvsv[*a] s/OURINTR ->4
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
110 checkOptree ( name => 'local $a',
112 errs => ['Name "main::a" used only once: possible typo at -e line 1.'],
114 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
115 4 <@> leave[1 ref] vKP/REFC ->(end)
117 2 <;> nextstate(main 1 -e:1) v ->3
118 - <1> ex-rv2sv vKM/129 ->4
119 3 <#> gvsv[*a] s/LVINTRO ->4
121 # 4 <@> leave[1 ref] vKP/REFC ->(end)
123 # 2 <;> nextstate(main 1 -e:1) v ->3
124 # - <1> ex-rv2sv vKM/129 ->4
125 # 3 <$> gvsv(*a) s/LVINTRO ->4
128 pass("MY, OUR, LOCAL, BOTH SUB AND MAIN, = undef");
130 checkOptree ( name => 'sub {my $a=undef}',
131 code => sub {my $a=undef},
133 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
134 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
136 1 <;> nextstate(main 641 optree_varinit.t:130) v ->2
137 4 <2> sassign sKS/2 ->5
139 3 <0> padsv[$a:641,642] sRM*/LVINTRO ->4
141 # 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
142 # - <@> lineseq KP ->5
143 # 1 <;> nextstate(main 641 optree_varinit.t:130) v ->2
144 # 4 <2> sassign sKS/2 ->5
146 # 3 <0> padsv[$a:641,642] sRM*/LVINTRO ->4
149 checkOptree ( name => 'sub {our $a=undef}',
150 code => sub {our $a=undef},
151 note => 'the global must be reset',
153 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
154 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
156 1 <;> nextstate(main 26 optree.t:109) v ->2
157 4 <2> sassign sKS/2 ->5
159 - <1> ex-rv2sv sKRM*/17 ->4
160 3 <#> gvsv[*a] s/OURINTR ->4
162 # 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
163 # - <@> lineseq KP ->5
164 # 1 <;> nextstate(main 446 optree_varinit.t:137) v ->2
165 # 4 <2> sassign sKS/2 ->5
167 # - <1> ex-rv2sv sKRM*/17 ->4
168 # 3 <$> gvsv(*a) s/OURINTR ->4
171 checkOptree ( name => 'sub {local $a=undef}',
172 code => sub {local $a=undef},
173 note => 'local not used enough to bother',
175 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
176 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
178 1 <;> nextstate(main 28 optree.t:122) v ->2
179 4 <2> sassign sKS/2 ->5
181 - <1> ex-rv2sv sKRM*/129 ->4
182 3 <#> gvsv[*a] s/LVINTRO ->4
184 # 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
185 # - <@> lineseq KP ->5
186 # 1 <;> nextstate(main 58 optree.t:141) v ->2
187 # 4 <2> sassign sKS/2 ->5
189 # - <1> ex-rv2sv sKRM*/129 ->4
190 # 3 <$> gvsv(*a) s/LVINTRO ->4
193 checkOptree ( name => 'my $a=undef',
194 prog => 'my $a=undef',
196 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
197 6 <@> leave[1 ref] vKP/REFC ->(end)
199 2 <;> nextstate(main 1 -e:1) v ->3
200 5 <2> sassign vKS/2 ->6
202 4 <0> padsv[$a:1,2] sRM*/LVINTRO ->5
204 # 6 <@> leave[1 ref] vKP/REFC ->(end)
206 # 2 <;> nextstate(main 1 -e:1) v ->3
207 # 5 <2> sassign vKS/2 ->6
209 # 4 <0> padsv[$a:1,2] sRM*/LVINTRO ->5
212 checkOptree ( name => 'our $a=undef',
213 prog => 'our $a=undef',
214 note => 'global must be reassigned',
216 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
217 6 <@> leave[1 ref] vKP/REFC ->(end)
219 2 <;> nextstate(main 1 -e:1) v ->3
220 5 <2> sassign vKS/2 ->6
222 - <1> ex-rv2sv sKRM*/17 ->5
223 4 <#> gvsv[*a] s/OURINTR ->5
225 # 6 <@> leave[1 ref] vKP/REFC ->(end)
227 # 2 <;> nextstate(main 1 -e:1) v ->3
228 # 5 <2> sassign vKS/2 ->6
230 # - <1> ex-rv2sv sKRM*/17 ->5
231 # 4 <$> gvsv(*a) s/OURINTR ->5
234 checkOptree ( name => 'local $a=undef',
235 prog => 'local $a=undef',
236 errs => ['Name "main::a" used only once: possible typo at -e line 1.'],
237 note => 'locals are rare, probly not worth doing',
239 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
240 6 <@> leave[1 ref] vKP/REFC ->(end)
242 2 <;> nextstate(main 1 -e:1) v ->3
243 5 <2> sassign vKS/2 ->6
245 - <1> ex-rv2sv sKRM*/129 ->5
246 4 <#> gvsv[*a] s/LVINTRO ->5
248 # 6 <@> leave[1 ref] vKP/REFC ->(end)
250 # 2 <;> nextstate(main 1 -e:1) v ->3
251 # 5 <2> sassign vKS/2 ->6
253 # - <1> ex-rv2sv sKRM*/129 ->5
254 # 4 <$> gvsv(*a) s/LVINTRO ->5
257 checkOptree ( name => 'sub {my $a=()}',
258 code => sub {my $a=()},
260 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
261 1 <;> nextstate(main -439 optree.t:105) v
263 3 <0> padsv[$a:-439,-438] sRM*/LVINTRO
265 5 <1> leavesub[1 ref] K/REFC,1
267 # 1 <;> nextstate(main 438 optree_varinit.t:247) v
269 # 3 <0> padsv[$a:438,439] sRM*/LVINTRO
270 # 4 <2> sassign sKS/2
271 # 5 <1> leavesub[1 ref] K/REFC,1
274 checkOptree ( name => 'sub {our $a=()}',
275 code => sub {our $a=()},
276 #todo => 'probly not worth doing',
278 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
279 1 <;> nextstate(main 31 optree.t:177) v
281 3 <#> gvsv[*a] s/OURINTR
283 5 <1> leavesub[1 ref] K/REFC,1
285 # 1 <;> nextstate(main 440 optree_varinit.t:262) v
287 # 3 <$> gvsv(*a) s/OURINTR
288 # 4 <2> sassign sKS/2
289 # 5 <1> leavesub[1 ref] K/REFC,1
292 checkOptree ( name => 'sub {local $a=()}',
293 code => sub {local $a=()},
294 #todo => 'probly not worth doing',
296 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
297 1 <;> nextstate(main 33 optree.t:190) v
299 3 <#> gvsv[*a] s/LVINTRO
301 5 <1> leavesub[1 ref] K/REFC,1
303 # 1 <;> nextstate(main 63 optree.t:225) v
305 # 3 <$> gvsv(*a) s/LVINTRO
306 # 4 <2> sassign sKS/2
307 # 5 <1> leavesub[1 ref] K/REFC,1
310 checkOptree ( name => 'my $a=()',
313 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
315 2 <;> nextstate(main 1 -e:1) v
317 4 <0> padsv[$a:1,2] sRM*/LVINTRO
319 6 <@> leave[1 ref] vKP/REFC
322 # 2 <;> nextstate(main 1 -e:1) v
324 # 4 <0> padsv[$a:1,2] sRM*/LVINTRO
325 # 5 <2> sassign vKS/2
326 # 6 <@> leave[1 ref] vKP/REFC
329 checkOptree ( name => 'our $a=()',
331 #todo => 'probly not worth doing',
333 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
335 2 <;> nextstate(main 1 -e:1) v
337 4 <#> gvsv[*a] s/OURINTR
339 6 <@> leave[1 ref] vKP/REFC
342 # 2 <;> nextstate(main 1 -e:1) v
344 # 4 <$> gvsv(*a) s/OURINTR
345 # 5 <2> sassign vKS/2
346 # 6 <@> leave[1 ref] vKP/REFC
349 checkOptree ( name => 'local $a=()',
350 prog => 'local $a=()',
351 errs => ['Name "main::a" used only once: possible typo at -e line 1.'],
352 #todo => 'probly not worth doing',
354 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
356 2 <;> nextstate(main 1 -e:1) v
358 4 <#> gvsv[*a] s/LVINTRO
360 6 <@> leave[1 ref] vKP/REFC
363 # 2 <;> nextstate(main 1 -e:1) v
365 # 4 <$> gvsv(*a) s/LVINTRO
366 # 5 <2> sassign vKS/2
367 # 6 <@> leave[1 ref] vKP/REFC
370 checkOptree ( name => 'my ($a,$b)=()',
371 prog => 'my ($a,$b)=()',
372 #todo => 'probly not worth doing',
374 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
376 # 2 <;> nextstate(main 1 -e:1) v
378 # 4 <0> pushmark sRM*/128
379 # 5 <0> padsv[$a:1,2] lRM*/LVINTRO
380 # 6 <0> padsv[$b:1,2] lRM*/LVINTRO
381 # 7 <2> aassign[t3] vKS
382 # 8 <@> leave[1 ref] vKP/REFC
385 # 2 <;> nextstate(main 1 -e:1) v
387 # 4 <0> pushmark sRM*/128
388 # 5 <0> padsv[$a:1,2] lRM*/LVINTRO
389 # 6 <0> padsv[$b:1,2] lRM*/LVINTRO
390 # 7 <2> aassign[t3] vKS
391 # 8 <@> leave[1 ref] vKP/REFC