Fix deparsing of reversed foreach loops,
[p5sagit/p5-mst-13.2.git] / ext / B / t / optree_sort.t
1 #!perl
2
3 BEGIN {
4     chdir 't';
5     @INC = ('../lib', '../ext/B/t');
6     require Config;
7     if (($Config::Config{'extensions'} !~ /\bB\b/) ){
8         print "1..0 # Skip -- Perl configured without B module\n";
9         exit 0;
10     }
11     if ($Config::Config{'extensions'} !~ /\bData\/Dumper\b/) {
12         print
13             "1..0 # Skip: Data::Dumper was not built, needed by OptreeCheck\n";
14         exit 0;
15     }
16     require './test.pl';
17 }
18 use OptreeCheck;
19 use Config;
20 plan tests => 11;
21
22 SKIP: {
23 skip "no perlio in this build", 11 unless $Config::Config{useperlio};
24
25 pass("SORT OPTIMIZATION");
26
27 checkOptree ( name      => 'sub {sort @a}',
28               code      => sub {sort @a},
29               bcopts    => '-exec',
30               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
31 # 1  <;> nextstate(main 424 optree_sort.t:14) v
32 # 2  <0> pushmark s
33 # 3  <#> gv[*a] s
34 # 4  <1> rv2av[t2] lK/1
35 # 5  <@> sort K
36 # 6  <1> leavesub[1 ref] K/REFC,1
37 EOT_EOT
38 # 1  <;> nextstate(main 424 optree_sort.t:14) v
39 # 2  <0> pushmark s
40 # 3  <$> gv(*a) s
41 # 4  <1> rv2av[t1] lK/1
42 # 5  <@> sort K
43 # 6  <1> leavesub[1 ref] K/REFC,1
44 EONT_EONT
45
46 checkOptree ( name      => 'sort @a',
47               prog      => 'sort @a',
48               bcopts    => '-exec',
49               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
50 1  <0> enter 
51 2  <;> nextstate(main 1 -e:1) v
52 3  <0> pushmark s
53 4  <#> gv[*a] s
54 5  <1> rv2av[t2] lK/1
55 6  <@> sort vK
56 7  <@> leave[1 ref] vKP/REFC
57 EOT_EOT
58 # 1  <0> enter 
59 # 2  <;> nextstate(main 1 -e:1) v
60 # 3  <0> pushmark s
61 # 4  <$> gv(*a) s
62 # 5  <1> rv2av[t1] lK/1
63 # 6  <@> sort vK
64 # 7  <@> leave[1 ref] vKP/REFC
65 EONT_EONT
66
67 checkOptree ( name      => 'sub {@a = sort @a}',
68               code      => sub {@a = sort @a},
69               bcopts    => '-exec',
70               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
71 1  <;> nextstate(main -438 optree.t:244) v
72 2  <0> pushmark s
73 3  <0> pushmark s
74 4  <#> gv[*a] s
75 5  <1> rv2av[t4] lK/1
76 6  <@> sort lK
77 7  <0> pushmark s
78 8  <#> gv[*a] s
79 9  <1> rv2av[t2] lKRM*/1
80 a  <2> aassign[t\d+] KS/COMMON
81 b  <1> leavesub[1 ref] K/REFC,1
82 EOT_EOT
83 # 1  <;> nextstate(main 65 optree.t:311) v
84 # 2  <0> pushmark s
85 # 3  <0> pushmark s
86 # 4  <$> gv(*a) s
87 # 5  <1> rv2av[t2] lK/1
88 # 6  <@> sort lK
89 # 7  <0> pushmark s
90 # 8  <$> gv(*a) s
91 # 9  <1> rv2av[t1] lKRM*/1
92 # a  <2> aassign[t3] KS/COMMON
93 # b  <1> leavesub[1 ref] K/REFC,1
94 EONT_EONT
95
96 checkOptree ( name      => '@a = sort @a',
97               prog      => '@a = sort @a',
98               bcopts    => '-exec',
99               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
100 1  <0> enter 
101 2  <;> nextstate(main 1 -e:1) v
102 3  <0> pushmark s
103 4  <0> pushmark s
104 5  <#> gv[*a] s
105 6  <1> rv2av[t4] lKRM*/1
106 7  <@> sort lK/INPLACE
107 8  <@> leave[1 ref] vKP/REFC
108 EOT_EOT
109 # 1  <0> enter 
110 # 2  <;> nextstate(main 1 -e:1) v
111 # 3  <0> pushmark s
112 # 4  <0> pushmark s
113 # 5  <$> gv(*a) s
114 # 6  <1> rv2av[t2] lKRM*/1
115 # 7  <@> sort lK/INPLACE
116 # 8  <@> leave[1 ref] vKP/REFC
117 EONT_EONT
118
119 checkOptree ( name      => 'sub {@a = sort @a; reverse @a}',
120               code      => sub {@a = sort @a; reverse @a},
121               bcopts    => '-exec',
122               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
123 1  <;> nextstate(main -438 optree.t:286) v
124 2  <0> pushmark s
125 3  <0> pushmark s
126 4  <#> gv[*a] s
127 5  <1> rv2av[t4] lKRM*/1
128 6  <@> sort lK/INPLACE
129 7  <;> nextstate(main -438 optree.t:288) v
130 8  <0> pushmark s
131 9  <#> gv[*a] s
132 a  <1> rv2av[t7] lK/1
133 b  <@> reverse[t8] K/1
134 c  <1> leavesub[1 ref] K/REFC,1
135 EOT_EOT
136 # 1  <;> nextstate(main 66 optree.t:345) v
137 # 2  <0> pushmark s
138 # 3  <0> pushmark s
139 # 4  <$> gv(*a) s
140 # 5  <1> rv2av[t2] lKRM*/1
141 # 6  <@> sort lK/INPLACE
142 # 7  <;> nextstate(main 66 optree.t:346) v
143 # 8  <0> pushmark s
144 # 9  <$> gv(*a) s
145 # a  <1> rv2av[t4] lK/1
146 # b  <@> reverse[t5] K/1
147 # c  <1> leavesub[1 ref] K/REFC,1
148 EONT_EONT
149
150 checkOptree ( name      => '@a = sort @a; reverse @a',
151               prog      => '@a = sort @a; reverse @a',
152               bcopts    => '-exec',
153               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
154 1  <0> enter 
155 2  <;> nextstate(main 1 -e:1) v
156 3  <0> pushmark s
157 4  <0> pushmark s
158 5  <#> gv[*a] s
159 6  <1> rv2av[t4] lKRM*/1
160 7  <@> sort lK/INPLACE
161 8  <;> nextstate(main 1 -e:1) v
162 9  <0> pushmark s
163 a  <#> gv[*a] s
164 b  <1> rv2av[t7] lK/1
165 c  <@> reverse[t8] vK/1
166 d  <@> leave[1 ref] vKP/REFC
167 EOT_EOT
168 # 1  <0> enter 
169 # 2  <;> nextstate(main 1 -e:1) v
170 # 3  <0> pushmark s
171 # 4  <0> pushmark s
172 # 5  <$> gv(*a) s
173 # 6  <1> rv2av[t2] lKRM*/1
174 # 7  <@> sort lK/INPLACE
175 # 8  <;> nextstate(main 1 -e:1) v
176 # 9  <0> pushmark s
177 # a  <$> gv(*a) s
178 # b  <1> rv2av[t4] lK/1
179 # c  <@> reverse[t5] vK/1
180 # d  <@> leave[1 ref] vKP/REFC
181 EONT_EONT
182
183 checkOptree ( name      => 'sub {my @a; @a = sort @a}',
184               code      => sub {my @a; @a = sort @a},
185               bcopts    => '-exec',
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
190 4  <0> pushmark s
191 5  <0> pushmark s
192 6  <0> padav[@a:-437,-436] l
193 7  <@> sort lK
194 8  <0> pushmark s
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
198 EOT_EOT
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
202 # 4  <0> pushmark s
203 # 5  <0> pushmark s
204 # 6  <0> padav[@a:427,428] l
205 # 7  <@> sort lK
206 # 8  <0> pushmark s
207 # 9  <0> padav[@a:427,428] lRM*
208 # a  <2> aassign[t2] KS/COMMON
209 # b  <1> leavesub[1 ref] K/REFC,1
210 EONT_EONT
211
212 checkOptree ( name      => 'my @a; @a = sort @a',
213               prog      => 'my @a; @a = sort @a',
214               bcopts    => '-exec',
215               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
216 1  <0> enter 
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
220 5  <0> pushmark s
221 6  <0> pushmark s
222 7  <0> padav[@a:1,2] lRM*
223 8  <@> sort lK/INPLACE
224 9  <@> leave[1 ref] vKP/REFC
225 EOT_EOT
226 # 1  <0> enter 
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
230 # 5  <0> pushmark s
231 # 6  <0> pushmark s
232 # 7  <0> padav[@a:1,2] lRM*
233 # 8  <@> sort lK/INPLACE
234 # 9  <@> leave[1 ref] vKP/REFC
235 EONT_EONT
236
237 checkOptree ( name      => 'sub {my @a; @a = sort @a; push @a, 1}',
238               code      => sub {my @a; @a = sort @a; push @a, 1},
239               bcopts    => '-exec',
240               debug     => 0,
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
245 4  <0> pushmark s
246 5  <0> pushmark s
247 6  <0> padav[@a:-437,-436] lRM*
248 7  <@> sort lK/INPLACE
249 8  <;> nextstate(main -436 optree.t:325) v
250 9  <0> pushmark s
251 a  <0> padav[@a:-437,-436] lRM
252 b  <$> const[IV 1] s
253 c  <@> push[t3] sK/2
254 d  <1> leavesub[1 ref] K/REFC,1
255 EOT_EOT
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
259 # 4  <0> pushmark s
260 # 5  <0> pushmark s
261 # 6  <0> padav[@a:429,430] lRM*
262 # 7  <@> sort lK/INPLACE
263 # 8  <;> nextstate(main 430 optree_sort.t:220) v
264 # 9  <0> pushmark s
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
269 EONT_EONT
270
271 checkOptree ( name      => 'sub {my @a; @a = sort @a; 1}',
272               code      => sub {my @a; @a = sort @a; 1},
273               bcopts    => '-exec',
274               debug     => 0,
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
279 4  <0> pushmark s
280 5  <0> pushmark s
281 6  <0> padav[@a:-437,-436] lRM*
282 7  <@> sort lK/INPLACE
283 8  <;> nextstate(main -436 optree.t:346) v
284 9  <$> const[IV 1] s
285 a  <1> leavesub[1 ref] K/REFC,1
286 EOT_EOT
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
290 # 4  <0> pushmark s
291 # 5  <0> pushmark s
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
297 EONT_EONT
298
299 } #skip
300
301 __END__
302