5 @INC = ('../lib', '../ext/B/t');
11 pass("OPTIMIZER TESTS - VAR INITIALIZATION");
13 checkOptree ( name => 'sub {my $a}',
16 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
17 # 1 <;> nextstate(main 45 optree.t:23) v
18 # 2 <0> padsv[$a:45,46] M/LVINTRO
19 # 3 <1> leavesub[1 ref] K/REFC,1
21 # 1 <;> nextstate(main 45 optree.t:23) v
22 # 2 <0> padsv[$a:45,46] M/LVINTRO
23 # 3 <1> leavesub[1 ref] K/REFC,1
26 checkOptree ( name => '-exec sub {my $a}',
29 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
31 # 1 <;> nextstate(main 49 optree.t:52) v
32 # 2 <0> padsv[$a:49,50] M/LVINTRO
33 # 3 <1> leavesub[1 ref] K/REFC,1
36 # 1 <;> nextstate(main 49 optree.t:45) v
37 # 2 <0> padsv[$a:49,50] M/LVINTRO
38 # 3 <1> leavesub[1 ref] K/REFC,1
41 checkOptree ( name => 'sub {our $a}',
44 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
46 1 <;> nextstate(main 21 optree.t:47) v
47 2 <#> gvsv[*a] s/OURINTR
48 3 <1> leavesub[1 ref] K/REFC,1
51 # 1 <;> nextstate(main 51 optree.t:56) v
52 # 2 <$> gvsv(*a) s/OURINTR
53 # 3 <1> leavesub[1 ref] K/REFC,1
56 checkOptree ( name => 'sub {local $a}',
58 code => sub {local $a},
59 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
61 1 <;> nextstate(main 23 optree.t:57) v
62 2 <#> gvsv[*a] s/LVINTRO
63 3 <1> leavesub[1 ref] K/REFC,1
66 # 1 <;> nextstate(main 53 optree.t:67) v
67 # 2 <$> gvsv(*a) s/LVINTRO
68 # 3 <1> leavesub[1 ref] K/REFC,1
71 checkOptree ( name => 'my $a',
74 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
75 # 4 <@> leave[1 ref] vKP/REFC ->(end)
77 # 2 <;> nextstate(main 1 -e:1) v ->3
78 # 3 <0> padsv[$a:1,2] vM/LVINTRO ->4
80 # 4 <@> leave[1 ref] vKP/REFC ->(end)
82 # 2 <;> nextstate(main 1 -e:1) v ->3
83 # 3 <0> padsv[$a:1,2] vM/LVINTRO ->4
86 checkOptree ( name => 'our $a',
89 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
90 4 <@> leave[1 ref] vKP/REFC ->(end)
92 2 <;> nextstate(main 1 -e:1) v ->3
93 - <1> ex-rv2sv vK/17 ->4
94 3 <#> gvsv[*a] s/OURINTR ->4
96 # 4 <@> leave[1 ref] vKP/REFC ->(end)
98 # 2 <;> nextstate(main 1 -e:1) v ->3
99 # - <1> ex-rv2sv vK/17 ->4
100 # 3 <$> gvsv(*a) s/OURINTR ->4
103 checkOptree ( name => 'local $a',
106 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
107 4 <@> leave[1 ref] vKP/REFC ->(end)
109 2 <;> nextstate(main 1 -e:1) v ->3
110 - <1> ex-rv2sv vKM/129 ->4
111 3 <#> gvsv[*a] s/LVINTRO ->4
113 # 4 <@> leave[1 ref] vKP/REFC ->(end)
115 # 2 <;> nextstate(main 1 -e:1) v ->3
116 # - <1> ex-rv2sv vKM/129 ->4
117 # 3 <$> gvsv(*a) s/LVINTRO ->4
120 pass("MY, OUR, LOCAL, BOTH SUB AND MAIN, = undef");
122 checkOptree ( name => 'sub {my $a=undef}',
123 code => sub {my $a=undef},
125 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
126 3 <1> leavesub[1 ref] K/REFC,1 ->(end)
128 1 <;> nextstate(main 24 optree.t:99) v ->2
129 2 <0> padsv[$a:24,25] sRM*/LVINTRO ->3
131 # 3 <1> leavesub[1 ref] K/REFC,1 ->(end)
132 # - <@> lineseq KP ->3
133 # 1 <;> nextstate(main 54 optree.t:149) v ->2
134 # 2 <0> padsv[$a:54,55] sRM*/LVINTRO ->3
137 checkOptree ( name => 'sub {our $a=undef}',
138 code => sub {our $a=undef},
139 note => 'the global must be reset',
141 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
142 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
144 1 <;> nextstate(main 26 optree.t:109) v ->2
145 4 <2> sassign sKS/2 ->5
147 - <1> ex-rv2sv sKRM*/17 ->4
148 3 <#> gvsv[*a] s/OURINTR ->4
150 # 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
151 # - <@> lineseq KP ->5
152 # 1 <;> nextstate(main 446 optree_varinit.t:137) v ->2
153 # 4 <2> sassign sKS/2 ->5
155 # - <1> ex-rv2sv sKRM*/17 ->4
156 # 3 <$> gvsv(*a) s/OURINTR ->4
159 checkOptree ( name => 'sub {local $a=undef}',
160 code => sub {local $a=undef},
161 note => 'local not used enough to bother',
163 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
164 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
166 1 <;> nextstate(main 28 optree.t:122) v ->2
167 4 <2> sassign sKS/2 ->5
169 - <1> ex-rv2sv sKRM*/129 ->4
170 3 <#> gvsv[*a] s/LVINTRO ->4
172 # 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
173 # - <@> lineseq KP ->5
174 # 1 <;> nextstate(main 58 optree.t:141) v ->2
175 # 4 <2> sassign sKS/2 ->5
177 # - <1> ex-rv2sv sKRM*/129 ->4
178 # 3 <$> gvsv(*a) s/LVINTRO ->4
181 checkOptree ( name => 'my $a=undef',
182 prog => 'my $a=undef',
184 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
185 4 <@> leave[1 ref] vKP/REFC ->(end)
187 2 <;> nextstate(main 1 -e:1) v ->3
188 3 <0> padsv[$a:1,2] vRM*/LVINTRO ->4
190 # 4 <@> leave[1 ref] vKP/REFC ->(end)
192 # 2 <;> nextstate(main 1 -e:1) v ->3
193 # 3 <0> padsv[$a:1,2] vRM*/LVINTRO ->4
196 checkOptree ( name => 'our $a=undef',
197 prog => 'our $a=undef',
198 note => 'global must be reassigned',
200 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
201 6 <@> leave[1 ref] vKP/REFC ->(end)
203 2 <;> nextstate(main 1 -e:1) v ->3
204 5 <2> sassign vKS/2 ->6
206 - <1> ex-rv2sv sKRM*/17 ->5
207 4 <#> gvsv[*a] s/OURINTR ->5
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
218 checkOptree ( name => 'local $a=undef',
219 prog => 'local $a=undef',
220 note => 'locals are rare, probly not worth doing',
222 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
223 6 <@> leave[1 ref] vKP/REFC ->(end)
225 2 <;> nextstate(main 1 -e:1) v ->3
226 5 <2> sassign vKS/2 ->6
228 - <1> ex-rv2sv sKRM*/129 ->5
229 4 <#> gvsv[*a] s/LVINTRO ->5
231 # 6 <@> leave[1 ref] vKP/REFC ->(end)
233 # 2 <;> nextstate(main 1 -e:1) v ->3
234 # 5 <2> sassign vKS/2 ->6
236 # - <1> ex-rv2sv sKRM*/129 ->5
237 # 4 <$> gvsv(*a) s/LVINTRO ->5
240 checkOptree ( name => 'sub {my $a=()}',
241 code => sub {my $a=()},
244 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
246 1 <;> nextstate(main -439 optree.t:105) v
248 3 <0> padsv[$a:-439,-438] sRM*/LVINTRO
250 5 <1> leavesub[1 ref] K/REFC,1
252 # 1 <;> nextstate(main 438 optree_varinit.t:247) v
254 # 3 <0> padsv[$a:438,439] sRM*/LVINTRO
255 # 4 <2> sassign sKS/2
256 # 5 <1> leavesub[1 ref] K/REFC,1
259 checkOptree ( name => 'sub {our $a=()}',
260 code => sub {our $a=()},
261 #todo => 'probly not worth doing',
263 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
264 1 <;> nextstate(main 31 optree.t:177) v
266 3 <#> gvsv[*a] s/OURINTR
268 5 <1> leavesub[1 ref] K/REFC,1
270 # 1 <;> nextstate(main 440 optree_varinit.t:262) v
272 # 3 <$> gvsv(*a) s/OURINTR
273 # 4 <2> sassign sKS/2
274 # 5 <1> leavesub[1 ref] K/REFC,1
277 checkOptree ( name => 'sub {local $a=()}',
278 code => sub {local $a=()},
279 #todo => 'probly not worth doing',
281 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
290 # 1 <;> nextstate(main 63 optree.t:225) v
292 # 3 <$> gvsv(*a) s/LVINTRO
293 # 4 <2> sassign sKS/2
294 # 5 <1> leavesub[1 ref] K/REFC,1
297 checkOptree ( name => 'my $a=()',
299 todo => 'optimize ? its one of the idioms',
301 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
303 2 <;> nextstate(main 1 -e:1) v
305 4 <0> padsv[$a:1,2] sRM*/LVINTRO
307 6 <@> leave[1 ref] vKP/REFC
310 # 2 <;> nextstate(main 1 -e:1) v
312 # 4 <0> padsv[$a:1,2] sRM*/LVINTRO
313 # 5 <2> sassign vKS/2
314 # 6 <@> leave[1 ref] vKP/REFC
317 checkOptree ( name => 'our $a=()',
319 #todo => 'probly not worth doing',
321 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
323 2 <;> nextstate(main 1 -e:1) v
325 4 <#> gvsv[*a] s/OURINTR
327 6 <@> leave[1 ref] vKP/REFC
330 # 2 <;> nextstate(main 1 -e:1) v
332 # 4 <$> gvsv(*a) s/OURINTR
333 # 5 <2> sassign vKS/2
334 # 6 <@> leave[1 ref] vKP/REFC
337 checkOptree ( name => 'local $a=()',
338 prog => 'local $a=()',
339 #todo => 'probly not worth doing',
341 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
343 2 <;> nextstate(main 1 -e:1) v
345 4 <#> gvsv[*a] s/LVINTRO
347 6 <@> leave[1 ref] vKP/REFC
350 # 2 <;> nextstate(main 1 -e:1) v
352 # 4 <$> gvsv(*a) s/LVINTRO
353 # 5 <2> sassign vKS/2
354 # 6 <@> leave[1 ref] vKP/REFC
357 checkOptree ( name => 'my ($a,$b)=()',
358 prog => 'my ($a,$b)=()',
359 #todo => 'probly not worth doing',
361 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
363 # 2 <;> nextstate(main 1 -e:1) v
365 # 4 <0> pushmark sRM*/128
366 # 5 <0> padsv[$a:1,2] lRM*/LVINTRO
367 # 6 <0> padsv[$b:1,2] lRM*/LVINTRO
368 # 7 <2> aassign[t3] vKS
369 # 8 <@> leave[1 ref] vKP/REFC
372 # 2 <;> nextstate(main 1 -e:1) v
374 # 4 <0> pushmark sRM*/128
375 # 5 <0> padsv[$a:1,2] lRM*/LVINTRO
376 # 6 <0> padsv[$b:1,2] lRM*/LVINTRO
377 # 7 <2> aassign[t3] vKS
378 # 8 <@> leave[1 ref] vKP/REFC