5 @INC = ('../lib', '../ext/B/t');
7 if (($Config::Config{'extensions'} !~ /\bB\b/) ){
8 print "1..0 # Skip -- Perl configured without B module\n";
11 if ($Config::Config{'extensions'} !~ /\bData\/Dumper\b/) {
13 "1..0 # Skip: Data::Dumper was not built, needed by OptreeCheck\n";
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',
113 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
114 4 <@> leave[1 ref] vKP/REFC ->(end)
116 2 <;> nextstate(main 1 -e:1) v ->3
117 - <1> ex-rv2sv vKM/129 ->4
118 3 <#> gvsv[*a] s/LVINTRO ->4
120 # 4 <@> leave[1 ref] vKP/REFC ->(end)
122 # 2 <;> nextstate(main 1 -e:1) v ->3
123 # - <1> ex-rv2sv vKM/129 ->4
124 # 3 <$> gvsv(*a) s/LVINTRO ->4
127 pass("MY, OUR, LOCAL, BOTH SUB AND MAIN, = undef");
129 checkOptree ( name => 'sub {my $a=undef}',
130 code => sub {my $a=undef},
132 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
133 3 <1> leavesub[1 ref] K/REFC,1 ->(end)
135 1 <;> nextstate(main 24 optree.t:99) v ->2
136 2 <0> padsv[$a:24,25] sRM*/LVINTRO ->3
138 # 3 <1> leavesub[1 ref] K/REFC,1 ->(end)
139 # - <@> lineseq KP ->3
140 # 1 <;> nextstate(main 54 optree.t:149) v ->2
141 # 2 <0> padsv[$a:54,55] sRM*/LVINTRO ->3
144 checkOptree ( name => 'sub {our $a=undef}',
145 code => sub {our $a=undef},
146 note => 'the global must be reset',
148 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
149 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
151 1 <;> nextstate(main 26 optree.t:109) v ->2
152 4 <2> sassign sKS/2 ->5
154 - <1> ex-rv2sv sKRM*/17 ->4
155 3 <#> gvsv[*a] s/OURINTR ->4
157 # 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
158 # - <@> lineseq KP ->5
159 # 1 <;> nextstate(main 446 optree_varinit.t:137) v ->2
160 # 4 <2> sassign sKS/2 ->5
162 # - <1> ex-rv2sv sKRM*/17 ->4
163 # 3 <$> gvsv(*a) s/OURINTR ->4
166 checkOptree ( name => 'sub {local $a=undef}',
167 code => sub {local $a=undef},
168 note => 'local not used enough to bother',
170 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
171 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
173 1 <;> nextstate(main 28 optree.t:122) v ->2
174 4 <2> sassign sKS/2 ->5
176 - <1> ex-rv2sv sKRM*/129 ->4
177 3 <#> gvsv[*a] s/LVINTRO ->4
179 # 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
180 # - <@> lineseq KP ->5
181 # 1 <;> nextstate(main 58 optree.t:141) v ->2
182 # 4 <2> sassign sKS/2 ->5
184 # - <1> ex-rv2sv sKRM*/129 ->4
185 # 3 <$> gvsv(*a) s/LVINTRO ->4
188 checkOptree ( name => 'my $a=undef',
189 prog => 'my $a=undef',
191 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
192 4 <@> leave[1 ref] vKP/REFC ->(end)
194 2 <;> nextstate(main 1 -e:1) v ->3
195 3 <0> padsv[$a:1,2] vRM*/LVINTRO ->4
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
203 checkOptree ( name => 'our $a=undef',
204 prog => 'our $a=undef',
205 note => 'global must be reassigned',
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 - <1> ex-rv2sv sKRM*/17 ->5
214 4 <#> gvsv[*a] s/OURINTR ->5
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 # - <1> ex-rv2sv sKRM*/17 ->5
222 # 4 <$> gvsv(*a) s/OURINTR ->5
225 checkOptree ( name => 'local $a=undef',
226 prog => 'local $a=undef',
227 note => 'locals are rare, probly not worth doing',
229 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
230 6 <@> leave[1 ref] vKP/REFC ->(end)
232 2 <;> nextstate(main 1 -e:1) v ->3
233 5 <2> sassign vKS/2 ->6
235 - <1> ex-rv2sv sKRM*/129 ->5
236 4 <#> gvsv[*a] s/LVINTRO ->5
238 # 6 <@> leave[1 ref] vKP/REFC ->(end)
240 # 2 <;> nextstate(main 1 -e:1) v ->3
241 # 5 <2> sassign vKS/2 ->6
243 # - <1> ex-rv2sv sKRM*/129 ->5
244 # 4 <$> gvsv(*a) s/LVINTRO ->5
247 checkOptree ( name => 'sub {my $a=()}',
248 code => sub {my $a=()},
249 todo => 'apparently done, by patch #?',
251 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
252 1 <;> nextstate(main -439 optree.t:105) v
254 3 <0> padsv[$a:-439,-438] sRM*/LVINTRO
256 5 <1> leavesub[1 ref] K/REFC,1
258 # 1 <;> nextstate(main 438 optree_varinit.t:247) v
260 # 3 <0> padsv[$a:438,439] sRM*/LVINTRO
261 # 4 <2> sassign sKS/2
262 # 5 <1> leavesub[1 ref] K/REFC,1
265 checkOptree ( name => 'sub {our $a=()}',
266 code => sub {our $a=()},
267 #todo => 'probly not worth doing',
269 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
270 1 <;> nextstate(main 31 optree.t:177) v
272 3 <#> gvsv[*a] s/OURINTR
274 5 <1> leavesub[1 ref] K/REFC,1
276 # 1 <;> nextstate(main 440 optree_varinit.t:262) v
278 # 3 <$> gvsv(*a) s/OURINTR
279 # 4 <2> sassign sKS/2
280 # 5 <1> leavesub[1 ref] K/REFC,1
283 checkOptree ( name => 'sub {local $a=()}',
284 code => sub {local $a=()},
285 #todo => 'probly not worth doing',
287 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
288 1 <;> nextstate(main 33 optree.t:190) v
290 3 <#> gvsv[*a] s/LVINTRO
292 5 <1> leavesub[1 ref] K/REFC,1
294 # 1 <;> nextstate(main 63 optree.t:225) v
296 # 3 <$> gvsv(*a) s/LVINTRO
297 # 4 <2> sassign sKS/2
298 # 5 <1> leavesub[1 ref] K/REFC,1
301 checkOptree ( name => 'my $a=()',
303 todo => 'apparently done, by patch #?',
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 #todo => 'probly not worth doing',
345 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
347 2 <;> nextstate(main 1 -e:1) v
349 4 <#> gvsv[*a] s/LVINTRO
351 6 <@> leave[1 ref] vKP/REFC
354 # 2 <;> nextstate(main 1 -e:1) v
356 # 4 <$> gvsv(*a) s/LVINTRO
357 # 5 <2> sassign vKS/2
358 # 6 <@> leave[1 ref] vKP/REFC
361 checkOptree ( name => 'my ($a,$b)=()',
362 prog => 'my ($a,$b)=()',
363 #todo => 'probly not worth doing',
365 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
367 # 2 <;> nextstate(main 1 -e:1) v
369 # 4 <0> pushmark sRM*/128
370 # 5 <0> padsv[$a:1,2] lRM*/LVINTRO
371 # 6 <0> padsv[$b:1,2] lRM*/LVINTRO
372 # 7 <2> aassign[t3] vKS
373 # 8 <@> leave[1 ref] vKP/REFC
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