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";
23 skip "no perlio in this build", 11 unless $Config::Config{useperlio};
25 pass("SORT OPTIMIZATION");
27 checkOptree ( name => 'sub {sort @a}',
28 code => sub {sort @a},
30 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
31 # 1 <;> nextstate(main 424 optree_sort.t:14) v
34 # 4 <1> rv2av[t2] lK/1
36 # 6 <1> leavesub[1 ref] K/REFC,1
38 # 1 <;> nextstate(main 424 optree_sort.t:14) v
41 # 4 <1> rv2av[t1] lK/1
43 # 6 <1> leavesub[1 ref] K/REFC,1
46 checkOptree ( name => 'sort @a',
49 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
51 2 <;> nextstate(main 1 -e:1) v
56 7 <@> leave[1 ref] vKP/REFC
59 # 2 <;> nextstate(main 1 -e:1) v
62 # 5 <1> rv2av[t1] lK/1
64 # 7 <@> leave[1 ref] vKP/REFC
67 checkOptree ( name => 'sub {@a = sort @a}',
68 code => sub {@a = sort @a},
70 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
71 1 <;> nextstate(main -438 optree.t:244) v
79 9 <1> rv2av[t2] lKRM*/1
80 a <2> aassign[t\d+] KS/COMMON
81 b <1> leavesub[1 ref] K/REFC,1
83 # 1 <;> nextstate(main 65 optree.t:311) v
87 # 5 <1> rv2av[t2] lK/1
91 # 9 <1> rv2av[t1] lKRM*/1
92 # a <2> aassign[t3] KS/COMMON
93 # b <1> leavesub[1 ref] K/REFC,1
96 checkOptree ( name => '@a = sort @a',
97 prog => '@a = sort @a',
99 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
101 2 <;> nextstate(main 1 -e:1) v
105 6 <1> rv2av[t4] lKRM*/1
106 7 <@> sort lK/INPLACE
107 8 <@> leave[1 ref] vKP/REFC
110 # 2 <;> nextstate(main 1 -e:1) v
114 # 6 <1> rv2av[t2] lKRM*/1
115 # 7 <@> sort lK/INPLACE
116 # 8 <@> leave[1 ref] vKP/REFC
119 checkOptree ( name => 'sub {@a = sort @a; reverse @a}',
120 code => sub {@a = sort @a; reverse @a},
122 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
123 1 <;> nextstate(main -438 optree.t:286) v
127 5 <1> rv2av[t4] lKRM*/1
128 6 <@> sort lK/INPLACE
129 7 <;> nextstate(main -438 optree.t:288) v
133 b <@> reverse[t8] K/1
134 c <1> leavesub[1 ref] K/REFC,1
136 # 1 <;> nextstate(main 66 optree.t:345) v
140 # 5 <1> rv2av[t2] lKRM*/1
141 # 6 <@> sort lK/INPLACE
142 # 7 <;> nextstate(main 66 optree.t:346) v
145 # a <1> rv2av[t4] lK/1
146 # b <@> reverse[t5] K/1
147 # c <1> leavesub[1 ref] K/REFC,1
150 checkOptree ( name => '@a = sort @a; reverse @a',
151 prog => '@a = sort @a; reverse @a',
153 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
155 2 <;> nextstate(main 1 -e:1) v
159 6 <1> rv2av[t4] lKRM*/1
160 7 <@> sort lK/INPLACE
161 8 <;> nextstate(main 1 -e:1) v
165 c <@> reverse[t8] vK/1
166 d <@> leave[1 ref] vKP/REFC
169 # 2 <;> nextstate(main 1 -e:1) v
173 # 6 <1> rv2av[t2] lKRM*/1
174 # 7 <@> sort lK/INPLACE
175 # 8 <;> nextstate(main 1 -e:1) v
178 # b <1> rv2av[t4] lK/1
179 # c <@> reverse[t5] vK/1
180 # d <@> leave[1 ref] vKP/REFC
183 checkOptree ( name => 'sub {my @a; @a = sort @a}',
184 code => sub {my @a; @a = sort @a},
186 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
187 1 <;> nextstate(main -437 optree.t:254) v
188 2 <0> padav[@a:-437,-436] vM/LVINTRO
189 3 <;> nextstate(main -436 optree.t:256) v
192 6 <0> padav[@a:-437,-436] l
195 9 <0> padav[@a:-437,-436] lRM*
196 a <2> aassign[t\d+] KS/COMMON
197 b <1> leavesub[1 ref] K/REFC,1
199 # 1 <;> nextstate(main 427 optree_sort.t:172) v
200 # 2 <0> padav[@a:427,428] vM/LVINTRO
201 # 3 <;> nextstate(main 428 optree_sort.t:173) v
204 # 6 <0> padav[@a:427,428] l
207 # 9 <0> padav[@a:427,428] lRM*
208 # a <2> aassign[t2] KS/COMMON
209 # b <1> leavesub[1 ref] K/REFC,1
212 checkOptree ( name => 'my @a; @a = sort @a',
213 prog => 'my @a; @a = sort @a',
215 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
217 2 <;> nextstate(main 1 -e:1) v
218 3 <0> padav[@a:1,2] vM/LVINTRO
219 4 <;> nextstate(main 2 -e:1) v
222 7 <0> padav[@a:1,2] lRM*
223 8 <@> sort lK/INPLACE
224 9 <@> leave[1 ref] vKP/REFC
227 # 2 <;> nextstate(main 1 -e:1) v
228 # 3 <0> padav[@a:1,2] vM/LVINTRO
229 # 4 <;> nextstate(main 2 -e:1) v
232 # 7 <0> padav[@a:1,2] lRM*
233 # 8 <@> sort lK/INPLACE
234 # 9 <@> leave[1 ref] vKP/REFC
237 checkOptree ( name => 'sub {my @a; @a = sort @a; push @a, 1}',
238 code => sub {my @a; @a = sort @a; push @a, 1},
241 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
242 1 <;> nextstate(main -437 optree.t:325) v
243 2 <0> padav[@a:-437,-436] vM/LVINTRO
244 3 <;> nextstate(main -436 optree.t:325) v
247 6 <0> padav[@a:-437,-436] lRM*
248 7 <@> sort lK/INPLACE
249 8 <;> nextstate(main -436 optree.t:325) v
251 a <0> padav[@a:-437,-436] lRM
254 d <1> leavesub[1 ref] K/REFC,1
256 # 1 <;> nextstate(main 429 optree_sort.t:219) v
257 # 2 <0> padav[@a:429,430] vM/LVINTRO
258 # 3 <;> nextstate(main 430 optree_sort.t:220) v
261 # 6 <0> padav[@a:429,430] lRM*
262 # 7 <@> sort lK/INPLACE
263 # 8 <;> nextstate(main 430 optree_sort.t:220) v
265 # a <0> padav[@a:429,430] lRM
266 # b <$> const(IV 1) s
267 # c <@> push[t3] sK/2
268 # d <1> leavesub[1 ref] K/REFC,1
271 checkOptree ( name => 'sub {my @a; @a = sort @a; 1}',
272 code => sub {my @a; @a = sort @a; 1},
275 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
276 1 <;> nextstate(main -437 optree.t:325) v
277 2 <0> padav[@a:-437,-436] vM/LVINTRO
278 3 <;> nextstate(main -436 optree.t:325) v
281 6 <0> padav[@a:-437,-436] lRM*
282 7 <@> sort lK/INPLACE
283 8 <;> nextstate(main -436 optree.t:346) v
285 a <1> leavesub[1 ref] K/REFC,1
287 # 1 <;> nextstate(main 431 optree_sort.t:250) v
288 # 2 <0> padav[@a:431,432] vM/LVINTRO
289 # 3 <;> nextstate(main 432 optree_sort.t:251) v
292 # 6 <0> padav[@a:431,432] lRM*
293 # 7 <@> sort lK/INPLACE
294 # 8 <;> nextstate(main 432 optree_sort.t:251) v
295 # 9 <$> const(IV 1) s
296 # a <1> leavesub[1 ref] K/REFC,1