This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
regcomp.c: Use symbolic constant instead of number
[perl5.git] / ext / B / t / optree_sort.t
1 #!perl
2
3 BEGIN {
4     unshift @INC, 't';
5     require Config;
6     if (($Config::Config{'extensions'} !~ /\bB\b/) ){
7         print "1..0 # Skip -- Perl configured without B module\n";
8         exit 0;
9     }
10     if (!$Config::Config{useperlio}) {
11         print "1..0 # Skip -- need perlio to walk the optree\n";
12         exit 0;
13     }
14 }
15 use OptreeCheck;
16 use Config;
17 plan tests => 21;
18
19 pass("SORT OPTIMIZATION");
20
21 checkOptree ( name      => 'sub {sort @a}',
22               code      => sub {sort @a},
23               bcopts    => '-exec',
24               strip_open_hints => 1,
25               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
26 # 1  <;> nextstate(main 424 optree_sort.t:14) v:>,<,%
27 # 2  <0> pushmark s
28 # 3  <#> gv[*a] s
29 # 4  <1> rv2av[t2] lK/1
30 # 5  <@> sort K
31 # 6  <1> leavesub[1 ref] K/REFC,1
32 EOT_EOT
33 # 1  <;> nextstate(main 424 optree_sort.t:14) v:>,<,%
34 # 2  <0> pushmark s
35 # 3  <$> gv(*a) s
36 # 4  <1> rv2av[t1] lK/1
37 # 5  <@> sort K
38 # 6  <1> leavesub[1 ref] K/REFC,1
39 EONT_EONT
40
41 checkOptree ( name => 'sort @a',
42               prog => 'sort @a',
43               errs => [ 'Useless use of sort in void context at -e line 1.',
44                         'Name "main::a" used only once: possible typo at -e line 1.',
45                         ],
46               bcopts => '-exec',
47               strip_open_hints => 1,
48               expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
49 1  <0> enter 
50 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
51 3  <0> pushmark s
52 4  <#> gv[*a] s
53 5  <1> rv2av[t2] lK/1
54 6  <@> sort vK
55 7  <@> leave[1 ref] vKP/REFC
56 EOT_EOT
57 # 1  <0> enter 
58 # 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
59 # 3  <0> pushmark s
60 # 4  <$> gv(*a) s
61 # 5  <1> rv2av[t1] lK/1
62 # 6  <@> sort vK
63 # 7  <@> leave[1 ref] vKP/REFC
64 EONT_EONT
65
66 checkOptree ( name      => 'sub {@a = sort @a}',
67               code      => sub {@a = sort @a},
68               bcopts    => '-exec',
69               strip_open_hints => 1,
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[t5] 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               strip_open_hints => 1,
100               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
101 1  <0> enter 
102 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
103 3  <0> pushmark s
104 4  <0> pushmark s
105 5  <#> gv[*a] s
106 6  <1> rv2av[t4] lKRM*/1
107 7  <@> sort lK/INPLACE
108 8  <@> leave[1 ref] vKP/REFC
109 EOT_EOT
110 # 1  <0> enter 
111 # 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
112 # 3  <0> pushmark s
113 # 4  <0> pushmark s
114 # 5  <$> gv(*a) s
115 # 6  <1> rv2av[t2] lKRM*/1
116 # 7  <@> sort lK/INPLACE
117 # 8  <@> leave[1 ref] vKP/REFC
118 EONT_EONT
119
120 checkOptree ( name      => 'sub {@a = sort @a; reverse @a}',
121               code      => sub {@a = sort @a; reverse @a},
122               bcopts    => '-exec',
123               strip_open_hints => 1,
124               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
125 1  <;> nextstate(main -438 optree.t:286) v:>,<,%
126 2  <0> pushmark s
127 3  <0> pushmark s
128 4  <#> gv[*a] s
129 5  <1> rv2av[t4] lKRM*/1
130 6  <@> sort lK/INPLACE
131 7  <;> nextstate(main -438 optree.t:288) v:>,<,%
132 8  <0> pushmark s
133 9  <#> gv[*a] s
134 a  <1> rv2av[t7] lK/1
135 b  <@> reverse[t8] K/1
136 c  <1> leavesub[1 ref] K/REFC,1
137 EOT_EOT
138 # 1  <;> nextstate(main 66 optree.t:345) v:>,<,%
139 # 2  <0> pushmark s
140 # 3  <0> pushmark s
141 # 4  <$> gv(*a) s
142 # 5  <1> rv2av[t2] lKRM*/1
143 # 6  <@> sort lK/INPLACE
144 # 7  <;> nextstate(main 66 optree.t:346) v:>,<,%
145 # 8  <0> pushmark s
146 # 9  <$> gv(*a) s
147 # a  <1> rv2av[t4] lK/1
148 # b  <@> reverse[t5] K/1
149 # c  <1> leavesub[1 ref] K/REFC,1
150 EONT_EONT
151
152 checkOptree ( name      => '@a = sort @a; reverse @a',
153               prog      => '@a = sort @a; reverse @a',
154               errs      => ['Useless use of reverse in void context at -e line 1.'],
155               bcopts    => '-exec',
156               strip_open_hints => 1,
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               strip_open_hints => 1,
191               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
192 1  <;> nextstate(main -437 optree.t:254) v:>,<,%
193 2  <0> padav[@a:-437,-436] vM/LVINTRO
194 3  <;> nextstate(main -436 optree.t:256) v:>,<,%
195 4  <0> pushmark s
196 5  <0> pushmark s
197 6  <0> padav[@a:-437,-436] l
198 7  <@> sort lK
199 8  <0> padrange[@a:-437,-436] l/1
200 9  <2> aassign[t2] KS/COMMON
201 a  <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> padrange[@a:427,428] l/1
211 # 9  <2> aassign[t2] KS/COMMON
212 # a  <1> leavesub[1 ref] K/REFC,1
213 EONT_EONT
214
215 checkOptree ( name      => 'my @a; @a = sort @a',
216               prog      => 'my @a; @a = sort @a',
217               bcopts    => '-exec',
218               strip_open_hints => 1,
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> padrange[@a:1,2] l/1
226 7  <@> sort lK/INPLACE
227 8  <@> leave[1 ref] vKP/REFC
228 EOT_EOT
229 # 1  <0> enter 
230 # 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
231 # 3  <0> padav[@a:1,2] vM/LVINTRO
232 # 4  <;> nextstate(main 2 -e:1) v:>,<,%,{
233 # 5  <0> pushmark s
234 # 6  <0> padrange[@a:1,2] l/1
235 # 7  <@> sort lK/INPLACE
236 # 8  <@> leave[1 ref] vKP/REFC
237 EONT_EONT
238
239 checkOptree ( name      => 'sub {my @a; @a = sort @a; push @a, 1}',
240               code      => sub {my @a; @a = sort @a; push @a, 1},
241               bcopts    => '-exec',
242               debug     => 0,
243               strip_open_hints => 1,
244               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
245 1  <;> nextstate(main -437 optree.t:325) v:>,<,%
246 2  <0> padav[@a:-437,-436] vM/LVINTRO
247 3  <;> nextstate(main -436 optree.t:325) v:>,<,%
248 4  <0> pushmark s
249 5  <0> padrange[@a:-437,-436] l/1
250 6  <@> sort lK/INPLACE
251 7  <;> nextstate(main -436 optree.t:325) v:>,<,%,{
252 8  <0> padrange[@a:-437,-436] l/1
253 9  <$> const[IV 1] s
254 a  <@> push[t3] sK/2
255 b  <1> leavesub[1 ref] K/REFC,1
256 EOT_EOT
257 # 1  <;> nextstate(main 429 optree_sort.t:219) v:>,<,%
258 # 2  <0> padav[@a:429,430] vM/LVINTRO
259 # 3  <;> nextstate(main 430 optree_sort.t:220) v:>,<,%
260 # 4  <0> pushmark s
261 # 5  <0> padrange[@a:429,430] l/1
262 # 6  <@> sort lK/INPLACE
263 # 7  <;> nextstate(main 430 optree_sort.t:220) v:>,<,%,{
264 # 8  <0> padrange[@a:429,430] l/1
265 # 9  <$> const(IV 1) s
266 # a  <@> push[t3] sK/2
267 # b  <1> leavesub[1 ref] K/REFC,1
268 EONT_EONT
269
270 checkOptree ( name      => 'sub {my @a; @a = sort @a; 1}',
271               code      => sub {my @a; @a = sort @a; 1},
272               bcopts    => '-exec',
273               debug     => 0,
274               strip_open_hints => 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:>,<,%
279 4  <0> pushmark s
280 5  <0> padrange[@a:-437,-436] l/1
281 6  <@> sort lK/INPLACE
282 7  <;> nextstate(main -436 optree.t:346) v:>,<,%,{
283 8  <$> const[IV 1] s
284 9  <1> leavesub[1 ref] K/REFC,1
285 EOT_EOT
286 # 1  <;> nextstate(main 431 optree_sort.t:250) v:>,<,%
287 # 2  <0> padav[@a:431,432] vM/LVINTRO
288 # 3  <;> nextstate(main 432 optree_sort.t:251) v:>,<,%
289 # 4  <0> pushmark s
290 # 5  <0> padrange[@a:431,432] l/1
291 # 6  <@> sort lK/INPLACE
292 # 7  <;> nextstate(main 432 optree_sort.t:251) v:>,<,%,{
293 # 8  <$> const(IV 1) s
294 # 9  <1> leavesub[1 ref] K/REFC,1
295 EONT_EONT