6 if (($Config::Config{'extensions'} !~ /\bB\b/) ){
7 print "1..0 # Skip -- Perl configured without B module\n";
10 if (!$Config::Config{useperlio}) {
11 print "1..0 # Skip -- need perlio to walk the optree\n";
19 pass("OPTIMIZER TESTS - VAR INITIALIZATION");
21 checkOptree ( name => 'sub {my $a}',
24 strip_open_hints => 1,
25 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
26 # 1 <;> nextstate(main 45 optree.t:23) v:>,<,%
27 # 2 <0> padsv[$a:45,46] M/LVINTRO
28 # 3 <1> leavesub[1 ref] K/REFC,1
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
35 checkOptree ( name => '-exec sub {my $a}',
38 strip_open_hints => 1,
39 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
40 # 1 <;> nextstate(main 49 optree.t:52) v:>,<,%
41 # 2 <0> padsv[$a:49,50] M/LVINTRO
42 # 3 <1> leavesub[1 ref] K/REFC,1
44 # 1 <;> nextstate(main 49 optree.t:45) v:>,<,%
45 # 2 <0> padsv[$a:49,50] M/LVINTRO
46 # 3 <1> leavesub[1 ref] K/REFC,1
49 checkOptree ( name => 'sub {our $a}',
52 strip_open_hints => 1,
53 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
54 1 <;> nextstate(main 21 optree.t:47) v:>,<,%
55 2 <#> gvsv[*a] s/OURINTR
56 3 <1> leavesub[1 ref] K/REFC,1
58 # 1 <;> nextstate(main 51 optree.t:56) v:>,<,%
59 # 2 <$> gvsv(*a) s/OURINTR
60 # 3 <1> leavesub[1 ref] K/REFC,1
63 checkOptree ( name => 'sub {local $a}',
65 code => sub {local $a},
66 strip_open_hints => 1,
67 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
68 1 <;> nextstate(main 23 optree.t:57) v:>,<,%,{
69 2 <#> gvsv[*a] s/LVINTRO
70 3 <1> leavesub[1 ref] K/REFC,1
72 # 1 <;> nextstate(main 53 optree.t:67) v:>,<,%,{
73 # 2 <$> gvsv(*a) s/LVINTRO
74 # 3 <1> leavesub[1 ref] K/REFC,1
77 checkOptree ( name => 'my $a',
80 strip_open_hints => 1,
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 strip_open_hints => 1,
97 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
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
104 # 4 <@> leave[1 ref] vKP/REFC ->(end)
106 # 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
107 # - <1> ex-rv2sv vK/17 ->4
108 # 3 <$> gvsv(*a) s/OURINTR ->4
111 checkOptree ( name => 'local $a',
113 errs => ['Name "main::a" used only once: possible typo at -e line 1.'],
115 strip_open_hints => 1,
116 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
117 4 <@> leave[1 ref] vKP/REFC ->(end)
119 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
120 - <1> ex-rv2sv vKM/129 ->4
121 3 <#> gvsv[*a] s/LVINTRO ->4
123 # 4 <@> leave[1 ref] vKP/REFC ->(end)
125 # 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
126 # - <1> ex-rv2sv vKM/129 ->4
127 # 3 <$> gvsv(*a) s/LVINTRO ->4
130 pass("MY, OUR, LOCAL, BOTH SUB AND MAIN, = undef");
132 checkOptree ( name => 'sub {my $a=undef}',
133 code => sub {my $a=undef},
135 strip_open_hints => 1,
136 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
137 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
139 1 <;> nextstate(main 641 optree_varinit.t:130) v:>,<,% ->2
140 4 <2> sassign sKS/2 ->5
142 3 <0> padsv[$a:641,642] sRM*/LVINTRO ->4
144 # 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
145 # - <@> lineseq KP ->5
146 # 1 <;> nextstate(main 641 optree_varinit.t:130) v:>,<,% ->2
147 # 4 <2> sassign sKS/2 ->5
149 # 3 <0> padsv[$a:641,642] sRM*/LVINTRO ->4
152 checkOptree ( name => 'sub {our $a=undef}',
153 code => sub {our $a=undef},
154 note => 'the global must be reset',
156 strip_open_hints => 1,
157 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
158 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
160 1 <;> nextstate(main 26 optree.t:109) v:>,<,%,{ ->2
161 4 <2> sassign sKS/2 ->5
163 - <1> ex-rv2sv sKRM*/17 ->4
164 3 <#> gvsv[*a] s/OURINTR ->4
166 # 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
167 # - <@> lineseq KP ->5
168 # 1 <;> nextstate(main 446 optree_varinit.t:137) v:>,<,%,{ ->2
169 # 4 <2> sassign sKS/2 ->5
171 # - <1> ex-rv2sv sKRM*/17 ->4
172 # 3 <$> gvsv(*a) s/OURINTR ->4
175 checkOptree ( name => 'sub {local $a=undef}',
176 code => sub {local $a=undef},
177 note => 'local not used enough to bother',
179 strip_open_hints => 1,
180 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
181 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
183 1 <;> nextstate(main 28 optree.t:122) v:>,<,%,{ ->2
184 4 <2> sassign sKS/2 ->5
186 - <1> ex-rv2sv sKRM*/129 ->4
187 3 <#> gvsv[*a] s/LVINTRO ->4
189 # 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
190 # - <@> lineseq KP ->5
191 # 1 <;> nextstate(main 58 optree.t:141) v:>,<,%,{ ->2
192 # 4 <2> sassign sKS/2 ->5
194 # - <1> ex-rv2sv sKRM*/129 ->4
195 # 3 <$> gvsv(*a) s/LVINTRO ->4
198 checkOptree ( name => 'my $a=undef',
199 prog => 'my $a=undef',
201 strip_open_hints => 1,
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 4 <0> padsv[$a:1,2] sRM*/LVINTRO ->5
210 # 6 <@> leave[1 ref] vKP/REFC ->(end)
212 # 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
213 # 5 <2> sassign vKS/2 ->6
215 # 4 <0> padsv[$a:1,2] sRM*/LVINTRO ->5
218 checkOptree ( name => 'our $a=undef',
219 prog => 'our $a=undef',
220 note => 'global must be reassigned',
222 strip_open_hints => 1,
223 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
224 6 <@> leave[1 ref] vKP/REFC ->(end)
226 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
227 5 <2> sassign vKS/2 ->6
229 - <1> ex-rv2sv sKRM*/17 ->5
230 4 <#> gvsv[*a] s/OURINTR ->5
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*/17 ->5
238 # 4 <$> gvsv(*a) s/OURINTR ->5
241 checkOptree ( name => 'local $a=undef',
242 prog => 'local $a=undef',
243 errs => ['Name "main::a" used only once: possible typo at -e line 1.'],
244 note => 'locals are rare, probably not worth doing',
246 strip_open_hints => 1,
247 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
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
256 # 6 <@> leave[1 ref] vKP/REFC ->(end)
258 # 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
259 # 5 <2> sassign vKS/2 ->6
261 # - <1> ex-rv2sv sKRM*/129 ->5
262 # 4 <$> gvsv(*a) s/LVINTRO ->5
265 checkOptree ( name => 'sub {my $a=()}',
266 code => sub {my $a=()},
268 strip_open_hints => 1,
269 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
270 1 <;> nextstate(main -439 optree.t:105) v:>,<,%
272 3 <0> padsv[$a:-439,-438] sRM*/LVINTRO
274 5 <1> leavesub[1 ref] K/REFC,1
276 # 1 <;> nextstate(main 438 optree_varinit.t:247) v:>,<,%
278 # 3 <0> padsv[$a:438,439] sRM*/LVINTRO
279 # 4 <2> sassign sKS/2
280 # 5 <1> leavesub[1 ref] K/REFC,1
283 checkOptree ( name => 'sub {our $a=()}',
284 code => sub {our $a=()},
285 #todo => 'probly not worth doing',
287 strip_open_hints => 1,
288 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
289 1 <;> nextstate(main 31 optree.t:177) v:>,<,%,{
291 3 <#> gvsv[*a] s/OURINTR
293 5 <1> leavesub[1 ref] K/REFC,1
295 # 1 <;> nextstate(main 440 optree_varinit.t:262) v:>,<,%,{
297 # 3 <$> gvsv(*a) s/OURINTR
298 # 4 <2> sassign sKS/2
299 # 5 <1> leavesub[1 ref] K/REFC,1
302 checkOptree ( name => 'sub {local $a=()}',
303 code => sub {local $a=()},
304 #todo => 'probly not worth doing',
306 strip_open_hints => 1,
307 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
308 1 <;> nextstate(main 33 optree.t:190) v:>,<,%,{
310 3 <#> gvsv[*a] s/LVINTRO
312 5 <1> leavesub[1 ref] K/REFC,1
314 # 1 <;> nextstate(main 63 optree.t:225) v:>,<,%,{
316 # 3 <$> gvsv(*a) s/LVINTRO
317 # 4 <2> sassign sKS/2
318 # 5 <1> leavesub[1 ref] K/REFC,1
321 checkOptree ( name => 'my $a=()',
324 strip_open_hints => 1,
325 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
327 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
329 4 <0> padsv[$a:1,2] sRM*/LVINTRO
331 6 <@> leave[1 ref] vKP/REFC
334 # 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
336 # 4 <0> padsv[$a:1,2] sRM*/LVINTRO
337 # 5 <2> sassign vKS/2
338 # 6 <@> leave[1 ref] vKP/REFC
341 checkOptree ( name => 'our $a=()',
343 #todo => 'probly not worth doing',
345 strip_open_hints => 1,
346 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
348 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
350 4 <#> gvsv[*a] s/OURINTR
352 6 <@> leave[1 ref] vKP/REFC
355 # 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
357 # 4 <$> gvsv(*a) s/OURINTR
358 # 5 <2> sassign vKS/2
359 # 6 <@> leave[1 ref] vKP/REFC
362 checkOptree ( name => 'local $a=()',
363 prog => 'local $a=()',
364 errs => ['Name "main::a" used only once: possible typo at -e line 1.'],
365 #todo => 'probly not worth doing',
367 strip_open_hints => 1,
368 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
370 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
372 4 <#> gvsv[*a] s/LVINTRO
374 6 <@> leave[1 ref] vKP/REFC
377 # 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
379 # 4 <$> gvsv(*a) s/LVINTRO
380 # 5 <2> sassign vKS/2
381 # 6 <@> leave[1 ref] vKP/REFC
384 checkOptree ( name => 'my ($a,$b)=()',
385 prog => 'my ($a,$b)=()',
386 #todo => 'probly not worth doing',
388 strip_open_hints => 1,
389 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
391 # 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
393 # 4 <0> padrange[$a:1,2; $b:1,2] lRM/LVINTRO,2
394 # 5 <2> aassign[t3] vKS
395 # 6 <@> leave[1 ref] vKP/REFC
398 # 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
400 # 4 <0> padrange[$a:1,2; $b:1,2] lRM/LVINTRO,2
401 # 5 <2> aassign[t3] vKS
402 # 6 <@> leave[1 ref] vKP/REFC