5 @INC = ('../lib', '../ext/B/t');
12 skip "no perlio in this build", 22 unless $Config::Config{useperlio};
14 pass("OPTIMIZER TESTS - VAR INITIALIZATION");
16 checkOptree ( name => 'sub {my $a}',
19 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
20 # 1 <;> nextstate(main 45 optree.t:23) v
21 # 2 <0> padsv[$a:45,46] M/LVINTRO
22 # 3 <1> leavesub[1 ref] K/REFC,1
24 # 1 <;> nextstate(main 45 optree.t:23) v
25 # 2 <0> padsv[$a:45,46] M/LVINTRO
26 # 3 <1> leavesub[1 ref] K/REFC,1
29 checkOptree ( name => '-exec sub {my $a}',
32 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
33 # 1 <;> nextstate(main 49 optree.t:52) v
34 # 2 <0> padsv[$a:49,50] M/LVINTRO
35 # 3 <1> leavesub[1 ref] K/REFC,1
37 # 1 <;> nextstate(main 49 optree.t:45) v
38 # 2 <0> padsv[$a:49,50] M/LVINTRO
39 # 3 <1> leavesub[1 ref] K/REFC,1
42 checkOptree ( name => 'sub {our $a}',
45 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
50 # 1 <;> nextstate(main 51 optree.t:56) v
51 # 2 <$> gvsv(*a) s/OURINTR
52 # 3 <1> leavesub[1 ref] K/REFC,1
55 checkOptree ( name => 'sub {local $a}',
57 code => sub {local $a},
58 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
59 1 <;> nextstate(main 23 optree.t:57) v
60 2 <#> gvsv[*a] s/LVINTRO
61 3 <1> leavesub[1 ref] K/REFC,1
63 # 1 <;> nextstate(main 53 optree.t:67) v
64 # 2 <$> gvsv(*a) s/LVINTRO
65 # 3 <1> leavesub[1 ref] K/REFC,1
68 checkOptree ( name => 'my $a',
71 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
72 # 4 <@> leave[1 ref] vKP/REFC ->(end)
74 # 2 <;> nextstate(main 1 -e:1) v ->3
75 # 3 <0> padsv[$a:1,2] vM/LVINTRO ->4
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
83 checkOptree ( name => 'our $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 - <1> ex-rv2sv vK/17 ->4
91 3 <#> gvsv[*a] s/OURINTR ->4
93 # 4 <@> leave[1 ref] vKP/REFC ->(end)
95 # 2 <;> nextstate(main 1 -e:1) v ->3
96 # - <1> ex-rv2sv vK/17 ->4
97 # 3 <$> gvsv(*a) s/OURINTR ->4
100 checkOptree ( name => 'local $a',
103 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
104 4 <@> leave[1 ref] vKP/REFC ->(end)
106 2 <;> nextstate(main 1 -e:1) v ->3
107 - <1> ex-rv2sv vKM/129 ->4
108 3 <#> gvsv[*a] s/LVINTRO ->4
110 # 4 <@> leave[1 ref] vKP/REFC ->(end)
112 # 2 <;> nextstate(main 1 -e:1) v ->3
113 # - <1> ex-rv2sv vKM/129 ->4
114 # 3 <$> gvsv(*a) s/LVINTRO ->4
117 pass("MY, OUR, LOCAL, BOTH SUB AND MAIN, = undef");
119 checkOptree ( name => 'sub {my $a=undef}',
120 code => sub {my $a=undef},
122 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
123 3 <1> leavesub[1 ref] K/REFC,1 ->(end)
125 1 <;> nextstate(main 24 optree.t:99) v ->2
126 2 <0> padsv[$a:24,25] sRM*/LVINTRO ->3
128 # 3 <1> leavesub[1 ref] K/REFC,1 ->(end)
129 # - <@> lineseq KP ->3
130 # 1 <;> nextstate(main 54 optree.t:149) v ->2
131 # 2 <0> padsv[$a:54,55] sRM*/LVINTRO ->3
134 checkOptree ( name => 'sub {our $a=undef}',
135 code => sub {our $a=undef},
136 note => 'the global must be reset',
138 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
139 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
141 1 <;> nextstate(main 26 optree.t:109) v ->2
142 4 <2> sassign sKS/2 ->5
144 - <1> ex-rv2sv sKRM*/17 ->4
145 3 <#> gvsv[*a] s/OURINTR ->4
147 # 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
148 # - <@> lineseq KP ->5
149 # 1 <;> nextstate(main 446 optree_varinit.t:137) v ->2
150 # 4 <2> sassign sKS/2 ->5
152 # - <1> ex-rv2sv sKRM*/17 ->4
153 # 3 <$> gvsv(*a) s/OURINTR ->4
156 checkOptree ( name => 'sub {local $a=undef}',
157 code => sub {local $a=undef},
158 note => 'local not used enough to bother',
160 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
161 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
163 1 <;> nextstate(main 28 optree.t:122) v ->2
164 4 <2> sassign sKS/2 ->5
166 - <1> ex-rv2sv sKRM*/129 ->4
167 3 <#> gvsv[*a] s/LVINTRO ->4
169 # 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
170 # - <@> lineseq KP ->5
171 # 1 <;> nextstate(main 58 optree.t:141) v ->2
172 # 4 <2> sassign sKS/2 ->5
174 # - <1> ex-rv2sv sKRM*/129 ->4
175 # 3 <$> gvsv(*a) s/LVINTRO ->4
178 checkOptree ( name => 'my $a=undef',
179 prog => 'my $a=undef',
181 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
182 4 <@> leave[1 ref] vKP/REFC ->(end)
184 2 <;> nextstate(main 1 -e:1) v ->3
185 3 <0> padsv[$a:1,2] vRM*/LVINTRO ->4
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
193 checkOptree ( name => 'our $a=undef',
194 prog => 'our $a=undef',
195 note => 'global must be reassigned',
197 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
198 6 <@> leave[1 ref] vKP/REFC ->(end)
200 2 <;> nextstate(main 1 -e:1) v ->3
201 5 <2> sassign vKS/2 ->6
203 - <1> ex-rv2sv sKRM*/17 ->5
204 4 <#> gvsv[*a] s/OURINTR ->5
206 # 6 <@> leave[1 ref] vKP/REFC ->(end)
208 # 2 <;> nextstate(main 1 -e:1) v ->3
209 # 5 <2> sassign vKS/2 ->6
211 # - <1> ex-rv2sv sKRM*/17 ->5
212 # 4 <$> gvsv(*a) s/OURINTR ->5
215 checkOptree ( name => 'local $a=undef',
216 prog => 'local $a=undef',
217 note => 'locals are rare, probly not worth doing',
219 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
220 6 <@> leave[1 ref] vKP/REFC ->(end)
222 2 <;> nextstate(main 1 -e:1) v ->3
223 5 <2> sassign vKS/2 ->6
225 - <1> ex-rv2sv sKRM*/129 ->5
226 4 <#> gvsv[*a] s/LVINTRO ->5
228 # 6 <@> leave[1 ref] vKP/REFC ->(end)
230 # 2 <;> nextstate(main 1 -e:1) v ->3
231 # 5 <2> sassign vKS/2 ->6
233 # - <1> ex-rv2sv sKRM*/129 ->5
234 # 4 <$> gvsv(*a) s/LVINTRO ->5
237 checkOptree ( name => 'sub {my $a=()}',
238 code => sub {my $a=()},
239 todo => 'apparently done, by patch #?',
241 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
242 1 <;> nextstate(main -439 optree.t:105) v
244 3 <0> padsv[$a:-439,-438] sRM*/LVINTRO
246 5 <1> leavesub[1 ref] K/REFC,1
248 # 1 <;> nextstate(main 438 optree_varinit.t:247) v
250 # 3 <0> padsv[$a:438,439] sRM*/LVINTRO
251 # 4 <2> sassign sKS/2
252 # 5 <1> leavesub[1 ref] K/REFC,1
255 checkOptree ( name => 'sub {our $a=()}',
256 code => sub {our $a=()},
257 #todo => 'probly not worth doing',
259 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
260 1 <;> nextstate(main 31 optree.t:177) v
262 3 <#> gvsv[*a] s/OURINTR
264 5 <1> leavesub[1 ref] K/REFC,1
266 # 1 <;> nextstate(main 440 optree_varinit.t:262) v
268 # 3 <$> gvsv(*a) s/OURINTR
269 # 4 <2> sassign sKS/2
270 # 5 <1> leavesub[1 ref] K/REFC,1
273 checkOptree ( name => 'sub {local $a=()}',
274 code => sub {local $a=()},
275 #todo => 'probly not worth doing',
277 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
278 1 <;> nextstate(main 33 optree.t:190) v
280 3 <#> gvsv[*a] s/LVINTRO
282 5 <1> leavesub[1 ref] K/REFC,1
284 # 1 <;> nextstate(main 63 optree.t:225) v
286 # 3 <$> gvsv(*a) s/LVINTRO
287 # 4 <2> sassign sKS/2
288 # 5 <1> leavesub[1 ref] K/REFC,1
291 checkOptree ( name => 'my $a=()',
293 todo => 'apparently done, by patch #?',
295 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
297 2 <;> nextstate(main 1 -e:1) v
299 4 <0> padsv[$a:1,2] sRM*/LVINTRO
301 6 <@> leave[1 ref] vKP/REFC
304 # 2 <;> nextstate(main 1 -e:1) v
306 # 4 <0> padsv[$a:1,2] sRM*/LVINTRO
307 # 5 <2> sassign vKS/2
308 # 6 <@> leave[1 ref] vKP/REFC
311 checkOptree ( name => 'our $a=()',
313 #todo => 'probly not worth doing',
315 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
317 2 <;> nextstate(main 1 -e:1) v
319 4 <#> gvsv[*a] s/OURINTR
321 6 <@> leave[1 ref] vKP/REFC
324 # 2 <;> nextstate(main 1 -e:1) v
326 # 4 <$> gvsv(*a) s/OURINTR
327 # 5 <2> sassign vKS/2
328 # 6 <@> leave[1 ref] vKP/REFC
331 checkOptree ( name => 'local $a=()',
332 prog => 'local $a=()',
333 #todo => 'probly not worth doing',
335 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
337 2 <;> nextstate(main 1 -e:1) v
339 4 <#> gvsv[*a] s/LVINTRO
341 6 <@> leave[1 ref] vKP/REFC
344 # 2 <;> nextstate(main 1 -e:1) v
346 # 4 <$> gvsv(*a) s/LVINTRO
347 # 5 <2> sassign vKS/2
348 # 6 <@> leave[1 ref] vKP/REFC
351 checkOptree ( name => 'my ($a,$b)=()',
352 prog => 'my ($a,$b)=()',
353 #todo => 'probly not worth doing',
355 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
357 # 2 <;> nextstate(main 1 -e:1) v
359 # 4 <0> pushmark sRM*/128
360 # 5 <0> padsv[$a:1,2] lRM*/LVINTRO
361 # 6 <0> padsv[$b:1,2] lRM*/LVINTRO
362 # 7 <2> aassign[t3] vKS
363 # 8 <@> leave[1 ref] vKP/REFC
366 # 2 <;> nextstate(main 1 -e:1) v
368 # 4 <0> pushmark sRM*/128
369 # 5 <0> padsv[$a:1,2] lRM*/LVINTRO
370 # 6 <0> padsv[$b:1,2] lRM*/LVINTRO
371 # 7 <2> aassign[t3] vKS
372 # 8 <@> leave[1 ref] vKP/REFC