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 if ($Config::Config{'extensions'} !~ /\bData\/Dumper\b/) {
18 "1..0 # Skip: Data::Dumper was not built, needed by OptreeCheck\n";
27 skip "no perlio in this build", 22 unless $Config::Config{useperlio};
29 pass("OPTIMIZER TESTS - VAR INITIALIZATION");
31 checkOptree ( name => 'sub {my $a}',
34 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
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
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
44 checkOptree ( name => '-exec sub {my $a}',
47 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
48 # 1 <;> nextstate(main 49 optree.t:52) v
49 # 2 <0> padsv[$a:49,50] M/LVINTRO
50 # 3 <1> leavesub[1 ref] K/REFC,1
52 # 1 <;> nextstate(main 49 optree.t:45) v
53 # 2 <0> padsv[$a:49,50] M/LVINTRO
54 # 3 <1> leavesub[1 ref] K/REFC,1
57 checkOptree ( name => 'sub {our $a}',
60 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
61 1 <;> nextstate(main 21 optree.t:47) v
62 2 <#> gvsv[*a] s/OURINTR
63 3 <1> leavesub[1 ref] K/REFC,1
65 # 1 <;> nextstate(main 51 optree.t:56) v
66 # 2 <$> gvsv(*a) s/OURINTR
67 # 3 <1> leavesub[1 ref] K/REFC,1
70 checkOptree ( name => 'sub {local $a}',
72 code => sub {local $a},
73 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
74 1 <;> nextstate(main 23 optree.t:57) v
75 2 <#> gvsv[*a] s/LVINTRO
76 3 <1> leavesub[1 ref] K/REFC,1
78 # 1 <;> nextstate(main 53 optree.t:67) v
79 # 2 <$> gvsv(*a) s/LVINTRO
80 # 3 <1> leavesub[1 ref] K/REFC,1
83 checkOptree ( name => 'my $a',
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 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
102 4 <@> leave[1 ref] vKP/REFC ->(end)
104 2 <;> nextstate(main 1 -e:1) v ->3
105 - <1> ex-rv2sv vK/17 ->4
106 3 <#> gvsv[*a] s/OURINTR ->4
108 # 4 <@> leave[1 ref] vKP/REFC ->(end)
110 # 2 <;> nextstate(main 1 -e:1) v ->3
111 # - <1> ex-rv2sv vK/17 ->4
112 # 3 <$> gvsv(*a) s/OURINTR ->4
115 checkOptree ( name => 'local $a',
118 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
119 4 <@> leave[1 ref] vKP/REFC ->(end)
121 2 <;> nextstate(main 1 -e:1) v ->3
122 - <1> ex-rv2sv vKM/129 ->4
123 3 <#> gvsv[*a] s/LVINTRO ->4
125 # 4 <@> leave[1 ref] vKP/REFC ->(end)
127 # 2 <;> nextstate(main 1 -e:1) v ->3
128 # - <1> ex-rv2sv vKM/129 ->4
129 # 3 <$> gvsv(*a) s/LVINTRO ->4
132 pass("MY, OUR, LOCAL, BOTH SUB AND MAIN, = undef");
134 checkOptree ( name => 'sub {my $a=undef}',
135 code => sub {my $a=undef},
137 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
138 3 <1> leavesub[1 ref] K/REFC,1 ->(end)
140 1 <;> nextstate(main 24 optree.t:99) v ->2
141 2 <0> padsv[$a:24,25] sRM*/LVINTRO ->3
143 # 3 <1> leavesub[1 ref] K/REFC,1 ->(end)
144 # - <@> lineseq KP ->3
145 # 1 <;> nextstate(main 54 optree.t:149) v ->2
146 # 2 <0> padsv[$a:54,55] sRM*/LVINTRO ->3
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 4 <@> leave[1 ref] vKP/REFC ->(end)
199 2 <;> nextstate(main 1 -e:1) v ->3
200 3 <0> padsv[$a:1,2] vRM*/LVINTRO ->4
202 # 4 <@> leave[1 ref] vKP/REFC ->(end)
204 # 2 <;> nextstate(main 1 -e:1) v ->3
205 # 3 <0> padsv[$a:1,2] vRM*/LVINTRO ->4
208 checkOptree ( name => 'our $a=undef',
209 prog => 'our $a=undef',
210 note => 'global must be reassigned',
212 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
213 6 <@> leave[1 ref] vKP/REFC ->(end)
215 2 <;> nextstate(main 1 -e:1) v ->3
216 5 <2> sassign vKS/2 ->6
218 - <1> ex-rv2sv sKRM*/17 ->5
219 4 <#> gvsv[*a] s/OURINTR ->5
221 # 6 <@> leave[1 ref] vKP/REFC ->(end)
223 # 2 <;> nextstate(main 1 -e:1) v ->3
224 # 5 <2> sassign vKS/2 ->6
226 # - <1> ex-rv2sv sKRM*/17 ->5
227 # 4 <$> gvsv(*a) s/OURINTR ->5
230 checkOptree ( name => 'local $a=undef',
231 prog => 'local $a=undef',
232 note => 'locals are rare, probly not worth doing',
234 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
235 6 <@> leave[1 ref] vKP/REFC ->(end)
237 2 <;> nextstate(main 1 -e:1) v ->3
238 5 <2> sassign vKS/2 ->6
240 - <1> ex-rv2sv sKRM*/129 ->5
241 4 <#> gvsv[*a] s/LVINTRO ->5
243 # 6 <@> leave[1 ref] vKP/REFC ->(end)
245 # 2 <;> nextstate(main 1 -e:1) v ->3
246 # 5 <2> sassign vKS/2 ->6
248 # - <1> ex-rv2sv sKRM*/129 ->5
249 # 4 <$> gvsv(*a) s/LVINTRO ->5
252 checkOptree ( name => 'sub {my $a=()}',
253 code => sub {my $a=()},
255 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
256 1 <;> nextstate(main -439 optree.t:105) v
258 3 <0> padsv[$a:-439,-438] sRM*/LVINTRO
260 5 <1> leavesub[1 ref] K/REFC,1
262 # 1 <;> nextstate(main 438 optree_varinit.t:247) v
264 # 3 <0> padsv[$a:438,439] sRM*/LVINTRO
265 # 4 <2> sassign sKS/2
266 # 5 <1> leavesub[1 ref] K/REFC,1
269 checkOptree ( name => 'sub {our $a=()}',
270 code => sub {our $a=()},
271 #todo => 'probly not worth doing',
273 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
274 1 <;> nextstate(main 31 optree.t:177) v
276 3 <#> gvsv[*a] s/OURINTR
278 5 <1> leavesub[1 ref] K/REFC,1
280 # 1 <;> nextstate(main 440 optree_varinit.t:262) v
282 # 3 <$> gvsv(*a) s/OURINTR
283 # 4 <2> sassign sKS/2
284 # 5 <1> leavesub[1 ref] K/REFC,1
287 checkOptree ( name => 'sub {local $a=()}',
288 code => sub {local $a=()},
289 #todo => 'probly not worth doing',
291 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
292 1 <;> nextstate(main 33 optree.t:190) v
294 3 <#> gvsv[*a] s/LVINTRO
296 5 <1> leavesub[1 ref] K/REFC,1
298 # 1 <;> nextstate(main 63 optree.t:225) v
300 # 3 <$> gvsv(*a) s/LVINTRO
301 # 4 <2> sassign sKS/2
302 # 5 <1> leavesub[1 ref] K/REFC,1
305 checkOptree ( name => 'my $a=()',
308 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
310 2 <;> nextstate(main 1 -e:1) v
312 4 <0> padsv[$a:1,2] sRM*/LVINTRO
314 6 <@> leave[1 ref] vKP/REFC
317 # 2 <;> nextstate(main 1 -e:1) v
319 # 4 <0> padsv[$a:1,2] sRM*/LVINTRO
320 # 5 <2> sassign vKS/2
321 # 6 <@> leave[1 ref] vKP/REFC
324 checkOptree ( name => 'our $a=()',
326 #todo => 'probly not worth doing',
328 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
330 2 <;> nextstate(main 1 -e:1) v
332 4 <#> gvsv[*a] s/OURINTR
334 6 <@> leave[1 ref] vKP/REFC
337 # 2 <;> nextstate(main 1 -e:1) v
339 # 4 <$> gvsv(*a) s/OURINTR
340 # 5 <2> sassign vKS/2
341 # 6 <@> leave[1 ref] vKP/REFC
344 checkOptree ( name => 'local $a=()',
345 prog => 'local $a=()',
346 #todo => 'probly not worth doing',
348 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
350 2 <;> nextstate(main 1 -e:1) v
352 4 <#> gvsv[*a] s/LVINTRO
354 6 <@> leave[1 ref] vKP/REFC
357 # 2 <;> nextstate(main 1 -e:1) v
359 # 4 <$> gvsv(*a) s/LVINTRO
360 # 5 <2> sassign vKS/2
361 # 6 <@> leave[1 ref] vKP/REFC
364 checkOptree ( name => 'my ($a,$b)=()',
365 prog => 'my ($a,$b)=()',
366 #todo => 'probly not worth doing',
368 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
370 # 2 <;> nextstate(main 1 -e:1) v
372 # 4 <0> pushmark sRM*/128
373 # 5 <0> padsv[$a:1,2] lRM*/LVINTRO
374 # 6 <0> padsv[$b:1,2] lRM*/LVINTRO
375 # 7 <2> aassign[t3] vKS
376 # 8 <@> leave[1 ref] vKP/REFC
379 # 2 <;> nextstate(main 1 -e:1) v
381 # 4 <0> pushmark sRM*/128
382 # 5 <0> padsv[$a:1,2] lRM*/LVINTRO
383 # 6 <0> padsv[$b:1,2] lRM*/LVINTRO
384 # 7 <2> aassign[t3] vKS
385 # 8 <@> leave[1 ref] vKP/REFC