Silly Nick. If you see a nextstate op, then it may have open hints,
[p5sagit/p5-mst-13.2.git] / ext / B / t / optree_sort.t
1 #!perl
2
3 BEGIN {
4     if ($ENV{PERL_CORE}){
5         chdir('t') if -d 't';
6         @INC = ('.', '../lib', '../ext/B/t');
7     } else {
8         unshift @INC, 't';
9         push @INC, "../../t";
10     }
11     require Config;
12     if (($Config::Config{'extensions'} !~ /\bB\b/) ){
13         print "1..0 # Skip -- Perl configured without B module\n";
14         exit 0;
15     }
16     # require 'test.pl'; # now done by OptreeCheck
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               strip_open_hints => 1,
31               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
32 # 1  <;> nextstate(main 424 optree_sort.t:14) v:>,<,%
33 # 2  <0> pushmark s
34 # 3  <#> gv[*a] s
35 # 4  <1> rv2av[t2] lK/1
36 # 5  <@> sort K
37 # 6  <1> leavesub[1 ref] K/REFC,1
38 EOT_EOT
39 # 1  <;> nextstate(main 424 optree_sort.t:14) v:>,<,%
40 # 2  <0> pushmark s
41 # 3  <$> gv(*a) s
42 # 4  <1> rv2av[t1] lK/1
43 # 5  <@> sort K
44 # 6  <1> leavesub[1 ref] K/REFC,1
45 EONT_EONT
46
47 checkOptree ( name => 'sort @a',
48               prog => 'sort @a',
49               errs => [ 'Useless use of sort in void context at -e line 1.',
50                         'Name "main::a" used only once: possible typo at -e line 1.',
51                         ],
52               bcopts => '-exec',
53               strip_open_hints => 1,
54               expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
55 1  <0> enter 
56 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
57 3  <0> pushmark s
58 4  <#> gv[*a] s
59 5  <1> rv2av[t2] lK/1
60 6  <@> sort vK
61 7  <@> leave[1 ref] vKP/REFC
62 EOT_EOT
63 # 1  <0> enter 
64 # 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
65 # 3  <0> pushmark s
66 # 4  <$> gv(*a) s
67 # 5  <1> rv2av[t1] lK/1
68 # 6  <@> sort vK
69 # 7  <@> leave[1 ref] vKP/REFC
70 EONT_EONT
71
72 checkOptree ( name      => 'sub {@a = sort @a}',
73               code      => sub {@a = sort @a},
74               bcopts    => '-exec',
75               strip_open_hints => 1,
76               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
77 1  <;> nextstate(main -438 optree.t:244) v:>,<,%
78 2  <0> pushmark s
79 3  <0> pushmark s
80 4  <#> gv[*a] s
81 5  <1> rv2av[t4] lK/1
82 6  <@> sort lK
83 7  <0> pushmark s
84 8  <#> gv[*a] s
85 9  <1> rv2av[t2] lKRM*/1
86 a  <2> aassign[t5] KS/COMMON
87 b  <1> leavesub[1 ref] K/REFC,1
88 EOT_EOT
89 # 1  <;> nextstate(main 65 optree.t:311) v:>,<,%
90 # 2  <0> pushmark s
91 # 3  <0> pushmark s
92 # 4  <$> gv(*a) s
93 # 5  <1> rv2av[t2] lK/1
94 # 6  <@> sort lK
95 # 7  <0> pushmark s
96 # 8  <$> gv(*a) s
97 # 9  <1> rv2av[t1] lKRM*/1
98 # a  <2> aassign[t3] KS/COMMON
99 # b  <1> leavesub[1 ref] K/REFC,1
100 EONT_EONT
101
102 checkOptree ( name      => '@a = sort @a',
103               prog      => '@a = sort @a',
104               bcopts    => '-exec',
105               strip_open_hints => 1,
106               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
107 1  <0> enter 
108 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
109 3  <0> pushmark s
110 4  <0> pushmark s
111 5  <#> gv[*a] s
112 6  <1> rv2av[t4] lKRM*/1
113 7  <@> sort lK/INPLACE
114 8  <@> leave[1 ref] vKP/REFC
115 EOT_EOT
116 # 1  <0> enter 
117 # 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
118 # 3  <0> pushmark s
119 # 4  <0> pushmark s
120 # 5  <$> gv(*a) s
121 # 6  <1> rv2av[t2] lKRM*/1
122 # 7  <@> sort lK/INPLACE
123 # 8  <@> leave[1 ref] vKP/REFC
124 EONT_EONT
125
126 checkOptree ( name      => 'sub {@a = sort @a; reverse @a}',
127               code      => sub {@a = sort @a; reverse @a},
128               bcopts    => '-exec',
129               strip_open_hints => 1,
130               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
131 1  <;> nextstate(main -438 optree.t:286) v:>,<,%
132 2  <0> pushmark s
133 3  <0> pushmark s
134 4  <#> gv[*a] s
135 5  <1> rv2av[t4] lKRM*/1
136 6  <@> sort lK/INPLACE
137 7  <;> nextstate(main -438 optree.t:288) v:>,<,%
138 8  <0> pushmark s
139 9  <#> gv[*a] s
140 a  <1> rv2av[t7] lK/1
141 b  <@> reverse[t8] K/1
142 c  <1> leavesub[1 ref] K/REFC,1
143 EOT_EOT
144 # 1  <;> nextstate(main 66 optree.t:345) v:>,<,%
145 # 2  <0> pushmark s
146 # 3  <0> pushmark s
147 # 4  <$> gv(*a) s
148 # 5  <1> rv2av[t2] lKRM*/1
149 # 6  <@> sort lK/INPLACE
150 # 7  <;> nextstate(main 66 optree.t:346) v:>,<,%
151 # 8  <0> pushmark s
152 # 9  <$> gv(*a) s
153 # a  <1> rv2av[t4] lK/1
154 # b  <@> reverse[t5] K/1
155 # c  <1> leavesub[1 ref] K/REFC,1
156 EONT_EONT
157
158 checkOptree ( name      => '@a = sort @a; reverse @a',
159               prog      => '@a = sort @a; reverse @a',
160               errs      => ['Useless use of reverse in void context at -e line 1.'],
161               bcopts    => '-exec',
162               strip_open_hints => 1,
163               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
164 1  <0> enter 
165 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
166 3  <0> pushmark s
167 4  <0> pushmark s
168 5  <#> gv[*a] s
169 6  <1> rv2av[t4] lKRM*/1
170 7  <@> sort lK/INPLACE
171 8  <;> nextstate(main 1 -e:1) v:>,<,%,{
172 9  <0> pushmark s
173 a  <#> gv[*a] s
174 b  <1> rv2av[t7] lK/1
175 c  <@> reverse[t8] vK/1
176 d  <@> leave[1 ref] vKP/REFC
177 EOT_EOT
178 # 1  <0> enter 
179 # 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
180 # 3  <0> pushmark s
181 # 4  <0> pushmark s
182 # 5  <$> gv(*a) s
183 # 6  <1> rv2av[t2] lKRM*/1
184 # 7  <@> sort lK/INPLACE
185 # 8  <;> nextstate(main 1 -e:1) v:>,<,%,{
186 # 9  <0> pushmark s
187 # a  <$> gv(*a) s
188 # b  <1> rv2av[t4] lK/1
189 # c  <@> reverse[t5] vK/1
190 # d  <@> leave[1 ref] vKP/REFC
191 EONT_EONT
192
193 checkOptree ( name      => 'sub {my @a; @a = sort @a}',
194               code      => sub {my @a; @a = sort @a},
195               bcopts    => '-exec',
196               strip_open_hints => 1,
197               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
198 1  <;> nextstate(main -437 optree.t:254) v:>,<,%
199 2  <0> padav[@a:-437,-436] vM/LVINTRO
200 3  <;> nextstate(main -436 optree.t:256) v:>,<,%
201 4  <0> pushmark s
202 5  <0> pushmark s
203 6  <0> padav[@a:-437,-436] l
204 7  <@> sort lK
205 8  <0> pushmark s
206 9  <0> padav[@a:-437,-436] lRM*
207 a  <2> aassign[t2] KS/COMMON
208 b  <1> leavesub[1 ref] K/REFC,1
209 EOT_EOT
210 # 1  <;> nextstate(main 427 optree_sort.t:172) v:>,<,%
211 # 2  <0> padav[@a:427,428] vM/LVINTRO
212 # 3  <;> nextstate(main 428 optree_sort.t:173) v:>,<,%
213 # 4  <0> pushmark s
214 # 5  <0> pushmark s
215 # 6  <0> padav[@a:427,428] l
216 # 7  <@> sort lK
217 # 8  <0> pushmark s
218 # 9  <0> padav[@a:427,428] lRM*
219 # a  <2> aassign[t2] KS/COMMON
220 # b  <1> leavesub[1 ref] K/REFC,1
221 EONT_EONT
222
223 checkOptree ( name      => 'my @a; @a = sort @a',
224               prog      => 'my @a; @a = sort @a',
225               bcopts    => '-exec',
226               strip_open_hints => 1,
227               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
228 1  <0> enter 
229 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
230 3  <0> padav[@a:1,2] vM/LVINTRO
231 4  <;> nextstate(main 2 -e:1) v:>,<,%,{
232 5  <0> pushmark s
233 6  <0> pushmark s
234 7  <0> padav[@a:1,2] lRM*
235 8  <@> sort lK/INPLACE
236 9  <@> leave[1 ref] vKP/REFC
237 EOT_EOT
238 # 1  <0> enter 
239 # 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
240 # 3  <0> padav[@a:1,2] vM/LVINTRO
241 # 4  <;> nextstate(main 2 -e:1) v:>,<,%,{
242 # 5  <0> pushmark s
243 # 6  <0> pushmark s
244 # 7  <0> padav[@a:1,2] lRM*
245 # 8  <@> sort lK/INPLACE
246 # 9  <@> leave[1 ref] vKP/REFC
247 EONT_EONT
248
249 checkOptree ( name      => 'sub {my @a; @a = sort @a; push @a, 1}',
250               code      => sub {my @a; @a = sort @a; push @a, 1},
251               bcopts    => '-exec',
252               debug     => 0,
253               strip_open_hints => 1,
254               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
255 1  <;> nextstate(main -437 optree.t:325) v:>,<,%
256 2  <0> padav[@a:-437,-436] vM/LVINTRO
257 3  <;> nextstate(main -436 optree.t:325) v:>,<,%
258 4  <0> pushmark s
259 5  <0> pushmark s
260 6  <0> padav[@a:-437,-436] lRM*
261 7  <@> sort lK/INPLACE
262 8  <;> nextstate(main -436 optree.t:325) v:>,<,%,{
263 9  <0> pushmark s
264 a  <0> padav[@a:-437,-436] lRM
265 b  <$> const[IV 1] s
266 c  <@> push[t3] sK/2
267 d  <1> leavesub[1 ref] K/REFC,1
268 EOT_EOT
269 # 1  <;> nextstate(main 429 optree_sort.t:219) v:>,<,%
270 # 2  <0> padav[@a:429,430] vM/LVINTRO
271 # 3  <;> nextstate(main 430 optree_sort.t:220) v:>,<,%
272 # 4  <0> pushmark s
273 # 5  <0> pushmark s
274 # 6  <0> padav[@a:429,430] lRM*
275 # 7  <@> sort lK/INPLACE
276 # 8  <;> nextstate(main 430 optree_sort.t:220) v:>,<,%,{
277 # 9  <0> pushmark s
278 # a  <0> padav[@a:429,430] lRM
279 # b  <$> const(IV 1) s
280 # c  <@> push[t3] sK/2
281 # d  <1> leavesub[1 ref] K/REFC,1
282 EONT_EONT
283
284 checkOptree ( name      => 'sub {my @a; @a = sort @a; 1}',
285               code      => sub {my @a; @a = sort @a; 1},
286               bcopts    => '-exec',
287               debug     => 0,
288               strip_open_hints => 1,
289               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
290 1  <;> nextstate(main -437 optree.t:325) v:>,<,%
291 2  <0> padav[@a:-437,-436] vM/LVINTRO
292 3  <;> nextstate(main -436 optree.t:325) v:>,<,%
293 4  <0> pushmark s
294 5  <0> pushmark s
295 6  <0> padav[@a:-437,-436] lRM*
296 7  <@> sort lK/INPLACE
297 8  <;> nextstate(main -436 optree.t:346) v:>,<,%,{
298 9  <$> const[IV 1] s
299 a  <1> leavesub[1 ref] K/REFC,1
300 EOT_EOT
301 # 1  <;> nextstate(main 431 optree_sort.t:250) v:>,<,%
302 # 2  <0> padav[@a:431,432] vM/LVINTRO
303 # 3  <;> nextstate(main 432 optree_sort.t:251) v:>,<,%
304 # 4  <0> pushmark s
305 # 5  <0> pushmark s
306 # 6  <0> padav[@a:431,432] lRM*
307 # 7  <@> sort lK/INPLACE
308 # 8  <;> nextstate(main 432 optree_sort.t:251) v:>,<,%,{
309 # 9  <$> const(IV 1) s
310 # a  <1> leavesub[1 ref] K/REFC,1
311 EONT_EONT
312
313 } #skip
314
315 __END__
316