This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Move all the xxxpvs() macros to handy.h.
[perl5.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               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               errs => [ 'Useless use of sort in void context at -e line 1.',
49                         'Name "main::a" used only once: possible typo at -e line 1.',
50                         ],
51               bcopts => '-exec',
52               expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
53 1  <0> enter 
54 2  <;> nextstate(main 1 -e:1) v
55 3  <0> pushmark s
56 4  <#> gv[*a] s
57 5  <1> rv2av[t2] lK/1
58 6  <@> sort vK
59 7  <@> leave[1 ref] vKP/REFC
60 EOT_EOT
61 # 1  <0> enter 
62 # 2  <;> nextstate(main 1 -e:1) v
63 # 3  <0> pushmark s
64 # 4  <$> gv(*a) s
65 # 5  <1> rv2av[t1] lK/1
66 # 6  <@> sort vK
67 # 7  <@> leave[1 ref] vKP/REFC
68 EONT_EONT
69
70 checkOptree ( name      => 'sub {@a = sort @a}',
71               code      => sub {@a = sort @a},
72               bcopts    => '-exec',
73               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
74 1  <;> nextstate(main -438 optree.t:244) v
75 2  <0> pushmark s
76 3  <0> pushmark s
77 4  <#> gv[*a] s
78 5  <1> rv2av[t4] lK/1
79 6  <@> sort lK
80 7  <0> pushmark s
81 8  <#> gv[*a] s
82 9  <1> rv2av[t2] lKRM*/1
83 a  <2> aassign[t5] KS/COMMON
84 b  <1> leavesub[1 ref] K/REFC,1
85 EOT_EOT
86 # 1  <;> nextstate(main 65 optree.t:311) v
87 # 2  <0> pushmark s
88 # 3  <0> pushmark s
89 # 4  <$> gv(*a) s
90 # 5  <1> rv2av[t2] lK/1
91 # 6  <@> sort lK
92 # 7  <0> pushmark s
93 # 8  <$> gv(*a) s
94 # 9  <1> rv2av[t1] lKRM*/1
95 # a  <2> aassign[t3] KS/COMMON
96 # b  <1> leavesub[1 ref] K/REFC,1
97 EONT_EONT
98
99 checkOptree ( name      => '@a = sort @a',
100               prog      => '@a = sort @a',
101               bcopts    => '-exec',
102               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
103 1  <0> enter 
104 2  <;> nextstate(main 1 -e:1) v
105 3  <0> pushmark s
106 4  <0> pushmark s
107 5  <#> gv[*a] s
108 6  <1> rv2av[t4] lKRM*/1
109 7  <@> sort lK/INPLACE
110 8  <@> leave[1 ref] vKP/REFC
111 EOT_EOT
112 # 1  <0> enter 
113 # 2  <;> nextstate(main 1 -e:1) v
114 # 3  <0> pushmark s
115 # 4  <0> pushmark s
116 # 5  <$> gv(*a) s
117 # 6  <1> rv2av[t2] lKRM*/1
118 # 7  <@> sort lK/INPLACE
119 # 8  <@> leave[1 ref] vKP/REFC
120 EONT_EONT
121
122 checkOptree ( name      => 'sub {@a = sort @a; reverse @a}',
123               code      => sub {@a = sort @a; reverse @a},
124               bcopts    => '-exec',
125               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
126 1  <;> nextstate(main -438 optree.t:286) v
127 2  <0> pushmark s
128 3  <0> pushmark s
129 4  <#> gv[*a] s
130 5  <1> rv2av[t4] lKRM*/1
131 6  <@> sort lK/INPLACE
132 7  <;> nextstate(main -438 optree.t:288) v
133 8  <0> pushmark s
134 9  <#> gv[*a] s
135 a  <1> rv2av[t7] lK/1
136 b  <@> reverse[t8] K/1
137 c  <1> leavesub[1 ref] K/REFC,1
138 EOT_EOT
139 # 1  <;> nextstate(main 66 optree.t:345) v
140 # 2  <0> pushmark s
141 # 3  <0> pushmark s
142 # 4  <$> gv(*a) s
143 # 5  <1> rv2av[t2] lKRM*/1
144 # 6  <@> sort lK/INPLACE
145 # 7  <;> nextstate(main 66 optree.t:346) v
146 # 8  <0> pushmark s
147 # 9  <$> gv(*a) s
148 # a  <1> rv2av[t4] lK/1
149 # b  <@> reverse[t5] K/1
150 # c  <1> leavesub[1 ref] K/REFC,1
151 EONT_EONT
152
153 checkOptree ( name      => '@a = sort @a; reverse @a',
154               prog      => '@a = sort @a; reverse @a',
155               errs      => ['Useless use of reverse in void context at -e line 1.'],
156               bcopts    => '-exec',
157               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
158 1  <0> enter 
159 2  <;> nextstate(main 1 -e:1) v
160 3  <0> pushmark s
161 4  <0> pushmark s
162 5  <#> gv[*a] s
163 6  <1> rv2av[t4] lKRM*/1
164 7  <@> sort lK/INPLACE
165 8  <;> nextstate(main 1 -e:1) v
166 9  <0> pushmark s
167 a  <#> gv[*a] s
168 b  <1> rv2av[t7] lK/1
169 c  <@> reverse[t8] vK/1
170 d  <@> leave[1 ref] vKP/REFC
171 EOT_EOT
172 # 1  <0> enter 
173 # 2  <;> nextstate(main 1 -e:1) v
174 # 3  <0> pushmark s
175 # 4  <0> pushmark s
176 # 5  <$> gv(*a) s
177 # 6  <1> rv2av[t2] lKRM*/1
178 # 7  <@> sort lK/INPLACE
179 # 8  <;> nextstate(main 1 -e:1) v
180 # 9  <0> pushmark s
181 # a  <$> gv(*a) s
182 # b  <1> rv2av[t4] lK/1
183 # c  <@> reverse[t5] vK/1
184 # d  <@> leave[1 ref] vKP/REFC
185 EONT_EONT
186
187 checkOptree ( name      => 'sub {my @a; @a = sort @a}',
188               code      => sub {my @a; @a = sort @a},
189               bcopts    => '-exec',
190               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
191 1  <;> nextstate(main -437 optree.t:254) v
192 2  <0> padav[@a:-437,-436] vM/LVINTRO
193 3  <;> nextstate(main -436 optree.t:256) v
194 4  <0> pushmark s
195 5  <0> pushmark s
196 6  <0> padav[@a:-437,-436] l
197 7  <@> sort lK
198 8  <0> pushmark s
199 9  <0> padav[@a:-437,-436] lRM*
200 a  <2> aassign[t2] KS/COMMON
201 b  <1> leavesub[1 ref] K/REFC,1
202 EOT_EOT
203 # 1  <;> nextstate(main 427 optree_sort.t:172) v
204 # 2  <0> padav[@a:427,428] vM/LVINTRO
205 # 3  <;> nextstate(main 428 optree_sort.t:173) v
206 # 4  <0> pushmark s
207 # 5  <0> pushmark s
208 # 6  <0> padav[@a:427,428] l
209 # 7  <@> sort lK
210 # 8  <0> pushmark s
211 # 9  <0> padav[@a:427,428] lRM*
212 # a  <2> aassign[t2] KS/COMMON
213 # b  <1> leavesub[1 ref] K/REFC,1
214 EONT_EONT
215
216 checkOptree ( name      => 'my @a; @a = sort @a',
217               prog      => 'my @a; @a = sort @a',
218               bcopts    => '-exec',
219               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
220 1  <0> enter 
221 2  <;> nextstate(main 1 -e:1) v
222 3  <0> padav[@a:1,2] vM/LVINTRO
223 4  <;> nextstate(main 2 -e:1) v
224 5  <0> pushmark s
225 6  <0> pushmark s
226 7  <0> padav[@a:1,2] lRM*
227 8  <@> sort lK/INPLACE
228 9  <@> leave[1 ref] vKP/REFC
229 EOT_EOT
230 # 1  <0> enter 
231 # 2  <;> nextstate(main 1 -e:1) v
232 # 3  <0> padav[@a:1,2] vM/LVINTRO
233 # 4  <;> nextstate(main 2 -e:1) v
234 # 5  <0> pushmark s
235 # 6  <0> pushmark s
236 # 7  <0> padav[@a:1,2] lRM*
237 # 8  <@> sort lK/INPLACE
238 # 9  <@> leave[1 ref] vKP/REFC
239 EONT_EONT
240
241 checkOptree ( name      => 'sub {my @a; @a = sort @a; push @a, 1}',
242               code      => sub {my @a; @a = sort @a; push @a, 1},
243               bcopts    => '-exec',
244               debug     => 0,
245               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
246 1  <;> nextstate(main -437 optree.t:325) v
247 2  <0> padav[@a:-437,-436] vM/LVINTRO
248 3  <;> nextstate(main -436 optree.t:325) v
249 4  <0> pushmark s
250 5  <0> pushmark s
251 6  <0> padav[@a:-437,-436] lRM*
252 7  <@> sort lK/INPLACE
253 8  <;> nextstate(main -436 optree.t:325) v
254 9  <0> pushmark s
255 a  <0> padav[@a:-437,-436] lRM
256 b  <$> const[IV 1] s
257 c  <@> push[t3] sK/2
258 d  <1> leavesub[1 ref] K/REFC,1
259 EOT_EOT
260 # 1  <;> nextstate(main 429 optree_sort.t:219) v
261 # 2  <0> padav[@a:429,430] vM/LVINTRO
262 # 3  <;> nextstate(main 430 optree_sort.t:220) v
263 # 4  <0> pushmark s
264 # 5  <0> pushmark s
265 # 6  <0> padav[@a:429,430] lRM*
266 # 7  <@> sort lK/INPLACE
267 # 8  <;> nextstate(main 430 optree_sort.t:220) v
268 # 9  <0> pushmark s
269 # a  <0> padav[@a:429,430] lRM
270 # b  <$> const(IV 1) s
271 # c  <@> push[t3] sK/2
272 # d  <1> leavesub[1 ref] K/REFC,1
273 EONT_EONT
274
275 checkOptree ( name      => 'sub {my @a; @a = sort @a; 1}',
276               code      => sub {my @a; @a = sort @a; 1},
277               bcopts    => '-exec',
278               debug     => 0,
279               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
280 1  <;> nextstate(main -437 optree.t:325) v
281 2  <0> padav[@a:-437,-436] vM/LVINTRO
282 3  <;> nextstate(main -436 optree.t:325) v
283 4  <0> pushmark s
284 5  <0> pushmark s
285 6  <0> padav[@a:-437,-436] lRM*
286 7  <@> sort lK/INPLACE
287 8  <;> nextstate(main -436 optree.t:346) v
288 9  <$> const[IV 1] s
289 a  <1> leavesub[1 ref] K/REFC,1
290 EOT_EOT
291 # 1  <;> nextstate(main 431 optree_sort.t:250) v
292 # 2  <0> padav[@a:431,432] vM/LVINTRO
293 # 3  <;> nextstate(main 432 optree_sort.t:251) v
294 # 4  <0> pushmark s
295 # 5  <0> pushmark s
296 # 6  <0> padav[@a:431,432] lRM*
297 # 7  <@> sort lK/INPLACE
298 # 8  <;> nextstate(main 432 optree_sort.t:251) v
299 # 9  <$> const(IV 1) s
300 # a  <1> leavesub[1 ref] K/REFC,1
301 EONT_EONT
302
303 } #skip
304
305 __END__
306