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