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 3 <1> leavesub[1 ref] K/REFC,1 ->(end)
136 1 <;> nextstate(main 24 optree.t:99) v ->2
137 2 <0> padsv[$a:24,25] sRM*/LVINTRO ->3
139 # 3 <1> leavesub[1 ref] K/REFC,1 ->(end)
140 # - <@> lineseq KP ->3
141 # 1 <;> nextstate(main 54 optree.t:149) v ->2
142 # 2 <0> padsv[$a:54,55] sRM*/LVINTRO ->3
145 checkOptree ( name => 'sub {our $a=undef}',
146 code => sub {our $a=undef},
147 note => 'the global must be reset',
149 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
150 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
152 1 <;> nextstate(main 26 optree.t:109) v ->2
153 4 <2> sassign sKS/2 ->5
155 - <1> ex-rv2sv sKRM*/17 ->4
156 3 <#> gvsv[*a] s/OURINTR ->4
158 # 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
159 # - <@> lineseq KP ->5
160 # 1 <;> nextstate(main 446 optree_varinit.t:137) v ->2
161 # 4 <2> sassign sKS/2 ->5
163 # - <1> ex-rv2sv sKRM*/17 ->4
164 # 3 <$> gvsv(*a) s/OURINTR ->4
167 checkOptree ( name => 'sub {local $a=undef}',
168 code => sub {local $a=undef},
169 note => 'local not used enough to bother',
171 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
172 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
174 1 <;> nextstate(main 28 optree.t:122) v ->2
175 4 <2> sassign sKS/2 ->5
177 - <1> ex-rv2sv sKRM*/129 ->4
178 3 <#> gvsv[*a] s/LVINTRO ->4
180 # 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
181 # - <@> lineseq KP ->5
182 # 1 <;> nextstate(main 58 optree.t:141) v ->2
183 # 4 <2> sassign sKS/2 ->5
185 # - <1> ex-rv2sv sKRM*/129 ->4
186 # 3 <$> gvsv(*a) s/LVINTRO ->4
189 checkOptree ( name => 'my $a=undef',
190 prog => 'my $a=undef',
192 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
193 4 <@> leave[1 ref] vKP/REFC ->(end)
195 2 <;> nextstate(main 1 -e:1) v ->3
196 3 <0> padsv[$a:1,2] vRM*/LVINTRO ->4
198 # 4 <@> leave[1 ref] vKP/REFC ->(end)
200 # 2 <;> nextstate(main 1 -e:1) v ->3
201 # 3 <0> padsv[$a:1,2] vRM*/LVINTRO ->4
204 checkOptree ( name => 'our $a=undef',
205 prog => 'our $a=undef',
206 note => 'global must be reassigned',
208 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
209 6 <@> leave[1 ref] vKP/REFC ->(end)
211 2 <;> nextstate(main 1 -e:1) v ->3
212 5 <2> sassign vKS/2 ->6
214 - <1> ex-rv2sv sKRM*/17 ->5
215 4 <#> gvsv[*a] s/OURINTR ->5
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
226 checkOptree ( name => 'local $a=undef',
227 prog => 'local $a=undef',
228 errs => ['Name "main::a" used only once: possible typo at -e line 1.'],
229 note => 'locals are rare, probly not worth doing',
231 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
232 6 <@> leave[1 ref] vKP/REFC ->(end)
234 2 <;> nextstate(main 1 -e:1) v ->3
235 5 <2> sassign vKS/2 ->6
237 - <1> ex-rv2sv sKRM*/129 ->5
238 4 <#> gvsv[*a] s/LVINTRO ->5
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
249 checkOptree ( name => 'sub {my $a=()}',
250 code => sub {my $a=()},
252 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
253 1 <;> nextstate(main -439 optree.t:105) v
255 3 <0> padsv[$a:-439,-438] sRM*/LVINTRO
257 5 <1> leavesub[1 ref] K/REFC,1
259 # 1 <;> nextstate(main 438 optree_varinit.t:247) v
261 # 3 <0> padsv[$a:438,439] sRM*/LVINTRO
262 # 4 <2> sassign sKS/2
263 # 5 <1> leavesub[1 ref] K/REFC,1
266 checkOptree ( name => 'sub {our $a=()}',
267 code => sub {our $a=()},
268 #todo => 'probly not worth doing',
270 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
271 1 <;> nextstate(main 31 optree.t:177) v
273 3 <#> gvsv[*a] s/OURINTR
275 5 <1> leavesub[1 ref] K/REFC,1
277 # 1 <;> nextstate(main 440 optree_varinit.t:262) v
279 # 3 <$> gvsv(*a) s/OURINTR
280 # 4 <2> sassign sKS/2
281 # 5 <1> leavesub[1 ref] K/REFC,1
284 checkOptree ( name => 'sub {local $a=()}',
285 code => sub {local $a=()},
286 #todo => 'probly not worth doing',
288 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
289 1 <;> nextstate(main 33 optree.t:190) v
291 3 <#> gvsv[*a] s/LVINTRO
293 5 <1> leavesub[1 ref] K/REFC,1
295 # 1 <;> nextstate(main 63 optree.t:225) v
297 # 3 <$> gvsv(*a) s/LVINTRO
298 # 4 <2> sassign sKS/2
299 # 5 <1> leavesub[1 ref] K/REFC,1
302 checkOptree ( name => 'my $a=()',
305 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
307 2 <;> nextstate(main 1 -e:1) v
309 4 <0> padsv[$a:1,2] sRM*/LVINTRO
311 6 <@> leave[1 ref] vKP/REFC
314 # 2 <;> nextstate(main 1 -e:1) v
316 # 4 <0> padsv[$a:1,2] sRM*/LVINTRO
317 # 5 <2> sassign vKS/2
318 # 6 <@> leave[1 ref] vKP/REFC
321 checkOptree ( name => 'our $a=()',
323 #todo => 'probly not worth doing',
325 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
327 2 <;> nextstate(main 1 -e:1) v
329 4 <#> gvsv[*a] s/OURINTR
331 6 <@> leave[1 ref] vKP/REFC
334 # 2 <;> nextstate(main 1 -e:1) v
336 # 4 <$> gvsv(*a) s/OURINTR
337 # 5 <2> sassign vKS/2
338 # 6 <@> leave[1 ref] vKP/REFC
341 checkOptree ( name => 'local $a=()',
342 prog => 'local $a=()',
343 errs => ['Name "main::a" used only once: possible typo at -e line 1.'],
344 #todo => 'probly not worth doing',
346 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
348 2 <;> nextstate(main 1 -e:1) v
350 4 <#> gvsv[*a] s/LVINTRO
352 6 <@> leave[1 ref] vKP/REFC
355 # 2 <;> nextstate(main 1 -e:1) v
357 # 4 <$> gvsv(*a) s/LVINTRO
358 # 5 <2> sassign vKS/2
359 # 6 <@> leave[1 ref] vKP/REFC
362 checkOptree ( name => 'my ($a,$b)=()',
363 prog => 'my ($a,$b)=()',
364 #todo => 'probly not worth doing',
366 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
368 # 2 <;> nextstate(main 1 -e:1) v
370 # 4 <0> pushmark sRM*/128
371 # 5 <0> padsv[$a:1,2] lRM*/LVINTRO
372 # 6 <0> padsv[$b:1,2] lRM*/LVINTRO
373 # 7 <2> aassign[t3] vKS
374 # 8 <@> leave[1 ref] vKP/REFC
377 # 2 <;> nextstate(main 1 -e:1) v
379 # 4 <0> pushmark sRM*/128
380 # 5 <0> padsv[$a:1,2] lRM*/LVINTRO
381 # 6 <0> padsv[$b:1,2] lRM*/LVINTRO
382 # 7 <2> aassign[t3] vKS
383 # 8 <@> leave[1 ref] vKP/REFC