5 @INC = ('../lib', '../ext/B/t');
7 if (($Config::Config{'extensions'} !~ /\bB\b/) ){
8 print "1..0 # Skip -- Perl configured without B module\n";
17 skip "no perlio in this build", 22 unless $Config::Config{useperlio};
19 pass("OPTIMIZER TESTS - VAR INITIALIZATION");
21 checkOptree ( name => 'sub {my $a}',
24 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
25 # 1 <;> nextstate(main 45 optree.t:23) v
26 # 2 <0> padsv[$a:45,46] M/LVINTRO
27 # 3 <1> leavesub[1 ref] K/REFC,1
29 # 1 <;> nextstate(main 45 optree.t:23) v
30 # 2 <0> padsv[$a:45,46] M/LVINTRO
31 # 3 <1> leavesub[1 ref] K/REFC,1
34 checkOptree ( name => '-exec sub {my $a}',
37 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
38 # 1 <;> nextstate(main 49 optree.t:52) v
39 # 2 <0> padsv[$a:49,50] M/LVINTRO
40 # 3 <1> leavesub[1 ref] K/REFC,1
42 # 1 <;> nextstate(main 49 optree.t:45) v
43 # 2 <0> padsv[$a:49,50] M/LVINTRO
44 # 3 <1> leavesub[1 ref] K/REFC,1
47 checkOptree ( name => 'sub {our $a}',
50 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
51 1 <;> nextstate(main 21 optree.t:47) v
52 2 <#> gvsv[*a] s/OURINTR
53 3 <1> leavesub[1 ref] K/REFC,1
55 # 1 <;> nextstate(main 51 optree.t:56) v
56 # 2 <$> gvsv(*a) s/OURINTR
57 # 3 <1> leavesub[1 ref] K/REFC,1
60 checkOptree ( name => 'sub {local $a}',
62 code => sub {local $a},
63 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
64 1 <;> nextstate(main 23 optree.t:57) v
65 2 <#> gvsv[*a] s/LVINTRO
66 3 <1> leavesub[1 ref] K/REFC,1
68 # 1 <;> nextstate(main 53 optree.t:67) v
69 # 2 <$> gvsv(*a) s/LVINTRO
70 # 3 <1> leavesub[1 ref] K/REFC,1
73 checkOptree ( name => 'my $a',
76 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
77 # 4 <@> leave[1 ref] vKP/REFC ->(end)
79 # 2 <;> nextstate(main 1 -e:1) v ->3
80 # 3 <0> padsv[$a:1,2] vM/LVINTRO ->4
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
88 checkOptree ( name => 'our $a',
91 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
92 4 <@> leave[1 ref] vKP/REFC ->(end)
94 2 <;> nextstate(main 1 -e:1) v ->3
95 - <1> ex-rv2sv vK/17 ->4
96 3 <#> gvsv[*a] s/OURINTR ->4
98 # 4 <@> leave[1 ref] vKP/REFC ->(end)
100 # 2 <;> nextstate(main 1 -e:1) v ->3
101 # - <1> ex-rv2sv vK/17 ->4
102 # 3 <$> gvsv(*a) s/OURINTR ->4
105 checkOptree ( name => 'local $a',
108 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
109 4 <@> leave[1 ref] vKP/REFC ->(end)
111 2 <;> nextstate(main 1 -e:1) v ->3
112 - <1> ex-rv2sv vKM/129 ->4
113 3 <#> gvsv[*a] s/LVINTRO ->4
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
122 pass("MY, OUR, LOCAL, BOTH SUB AND MAIN, = undef");
124 checkOptree ( name => 'sub {my $a=undef}',
125 code => sub {my $a=undef},
127 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
128 3 <1> leavesub[1 ref] K/REFC,1 ->(end)
130 1 <;> nextstate(main 24 optree.t:99) v ->2
131 2 <0> padsv[$a:24,25] sRM*/LVINTRO ->3
133 # 3 <1> leavesub[1 ref] K/REFC,1 ->(end)
134 # - <@> lineseq KP ->3
135 # 1 <;> nextstate(main 54 optree.t:149) v ->2
136 # 2 <0> padsv[$a:54,55] sRM*/LVINTRO ->3
139 checkOptree ( name => 'sub {our $a=undef}',
140 code => sub {our $a=undef},
141 note => 'the global must be reset',
143 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
144 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
146 1 <;> nextstate(main 26 optree.t:109) v ->2
147 4 <2> sassign sKS/2 ->5
149 - <1> ex-rv2sv sKRM*/17 ->4
150 3 <#> gvsv[*a] s/OURINTR ->4
152 # 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
153 # - <@> lineseq KP ->5
154 # 1 <;> nextstate(main 446 optree_varinit.t:137) v ->2
155 # 4 <2> sassign sKS/2 ->5
157 # - <1> ex-rv2sv sKRM*/17 ->4
158 # 3 <$> gvsv(*a) s/OURINTR ->4
161 checkOptree ( name => 'sub {local $a=undef}',
162 code => sub {local $a=undef},
163 note => 'local not used enough to bother',
165 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
166 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
168 1 <;> nextstate(main 28 optree.t:122) v ->2
169 4 <2> sassign sKS/2 ->5
171 - <1> ex-rv2sv sKRM*/129 ->4
172 3 <#> gvsv[*a] s/LVINTRO ->4
174 # 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
175 # - <@> lineseq KP ->5
176 # 1 <;> nextstate(main 58 optree.t:141) v ->2
177 # 4 <2> sassign sKS/2 ->5
179 # - <1> ex-rv2sv sKRM*/129 ->4
180 # 3 <$> gvsv(*a) s/LVINTRO ->4
183 checkOptree ( name => 'my $a=undef',
184 prog => 'my $a=undef',
186 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
187 4 <@> leave[1 ref] vKP/REFC ->(end)
189 2 <;> nextstate(main 1 -e:1) v ->3
190 3 <0> padsv[$a:1,2] vRM*/LVINTRO ->4
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
198 checkOptree ( name => 'our $a=undef',
199 prog => 'our $a=undef',
200 note => 'global must be reassigned',
202 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
203 6 <@> leave[1 ref] vKP/REFC ->(end)
205 2 <;> nextstate(main 1 -e:1) v ->3
206 5 <2> sassign vKS/2 ->6
208 - <1> ex-rv2sv sKRM*/17 ->5
209 4 <#> gvsv[*a] s/OURINTR ->5
211 # 6 <@> leave[1 ref] vKP/REFC ->(end)
213 # 2 <;> nextstate(main 1 -e:1) v ->3
214 # 5 <2> sassign vKS/2 ->6
216 # - <1> ex-rv2sv sKRM*/17 ->5
217 # 4 <$> gvsv(*a) s/OURINTR ->5
220 checkOptree ( name => 'local $a=undef',
221 prog => 'local $a=undef',
222 note => 'locals are rare, probly not worth doing',
224 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
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*/129 ->5
231 4 <#> gvsv[*a] s/LVINTRO ->5
233 # 6 <@> leave[1 ref] vKP/REFC ->(end)
235 # 2 <;> nextstate(main 1 -e:1) v ->3
236 # 5 <2> sassign vKS/2 ->6
238 # - <1> ex-rv2sv sKRM*/129 ->5
239 # 4 <$> gvsv(*a) s/LVINTRO ->5
242 checkOptree ( name => 'sub {my $a=()}',
243 code => sub {my $a=()},
244 todo => 'apparently done, by patch #?',
246 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
247 1 <;> nextstate(main -439 optree.t:105) v
249 3 <0> padsv[$a:-439,-438] sRM*/LVINTRO
251 5 <1> leavesub[1 ref] K/REFC,1
253 # 1 <;> nextstate(main 438 optree_varinit.t:247) v
255 # 3 <0> padsv[$a:438,439] sRM*/LVINTRO
256 # 4 <2> sassign sKS/2
257 # 5 <1> leavesub[1 ref] K/REFC,1
260 checkOptree ( name => 'sub {our $a=()}',
261 code => sub {our $a=()},
262 #todo => 'probly not worth doing',
264 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
265 1 <;> nextstate(main 31 optree.t:177) v
267 3 <#> gvsv[*a] s/OURINTR
269 5 <1> leavesub[1 ref] K/REFC,1
271 # 1 <;> nextstate(main 440 optree_varinit.t:262) v
273 # 3 <$> gvsv(*a) s/OURINTR
274 # 4 <2> sassign sKS/2
275 # 5 <1> leavesub[1 ref] K/REFC,1
278 checkOptree ( name => 'sub {local $a=()}',
279 code => sub {local $a=()},
280 #todo => 'probly not worth doing',
282 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
283 1 <;> nextstate(main 33 optree.t:190) v
285 3 <#> gvsv[*a] s/LVINTRO
287 5 <1> leavesub[1 ref] K/REFC,1
289 # 1 <;> nextstate(main 63 optree.t:225) v
291 # 3 <$> gvsv(*a) s/LVINTRO
292 # 4 <2> sassign sKS/2
293 # 5 <1> leavesub[1 ref] K/REFC,1
296 checkOptree ( name => 'my $a=()',
298 todo => 'apparently done, by patch #?',
300 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
302 2 <;> nextstate(main 1 -e:1) v
304 4 <0> padsv[$a:1,2] sRM*/LVINTRO
306 6 <@> leave[1 ref] vKP/REFC
309 # 2 <;> nextstate(main 1 -e:1) v
311 # 4 <0> padsv[$a:1,2] sRM*/LVINTRO
312 # 5 <2> sassign vKS/2
313 # 6 <@> leave[1 ref] vKP/REFC
316 checkOptree ( name => 'our $a=()',
318 #todo => 'probly not worth doing',
320 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
322 2 <;> nextstate(main 1 -e:1) v
324 4 <#> gvsv[*a] s/OURINTR
326 6 <@> leave[1 ref] vKP/REFC
329 # 2 <;> nextstate(main 1 -e:1) v
331 # 4 <$> gvsv(*a) s/OURINTR
332 # 5 <2> sassign vKS/2
333 # 6 <@> leave[1 ref] vKP/REFC
336 checkOptree ( name => 'local $a=()',
337 prog => 'local $a=()',
338 #todo => 'probly not worth doing',
340 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
342 2 <;> nextstate(main 1 -e:1) v
344 4 <#> gvsv[*a] s/LVINTRO
346 6 <@> leave[1 ref] vKP/REFC
349 # 2 <;> nextstate(main 1 -e:1) v
351 # 4 <$> gvsv(*a) s/LVINTRO
352 # 5 <2> sassign vKS/2
353 # 6 <@> leave[1 ref] vKP/REFC
356 checkOptree ( name => 'my ($a,$b)=()',
357 prog => 'my ($a,$b)=()',
358 #todo => 'probly not worth doing',
360 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
362 # 2 <;> nextstate(main 1 -e:1) v
364 # 4 <0> pushmark sRM*/128
365 # 5 <0> padsv[$a:1,2] lRM*/LVINTRO
366 # 6 <0> padsv[$b:1,2] lRM*/LVINTRO
367 # 7 <2> aassign[t3] vKS
368 # 8 <@> leave[1 ref] vKP/REFC
371 # 2 <;> nextstate(main 1 -e:1) v
373 # 4 <0> pushmark sRM*/128
374 # 5 <0> padsv[$a:1,2] lRM*/LVINTRO
375 # 6 <0> padsv[$b:1,2] lRM*/LVINTRO
376 # 7 <2> aassign[t3] vKS
377 # 8 <@> leave[1 ref] vKP/REFC