Eliminate most of the UTF-8 black smoke by skipping optree tests when
[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 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
35 checkOptree ( name      => 'sub {sort @a}',
36               code      => sub {sort @a},
37               bcopts    => '-exec',
38               @open_todo,
39               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
40 # 1  <;> nextstate(main 424 optree_sort.t:14) v
41 # 2  <0> pushmark s
42 # 3  <#> gv[*a] s
43 # 4  <1> rv2av[t2] lK/1
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
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',
61               @open_todo,
62               expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
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[t2] lK/1
68 6  <@> sort vK
69 7  <@> leave[1 ref] vKP/REFC
70 EOT_EOT
71 # 1  <0> enter 
72 # 2  <;> nextstate(main 1 -e:1) v:{
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',
83               @open_todo,
84               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
85 1  <;> nextstate(main -438 optree.t:244) v
86 2  <0> pushmark s
87 3  <0> pushmark s
88 4  <#> gv[*a] s
89 5  <1> rv2av[t4] lK/1
90 6  <@> sort lK
91 7  <0> pushmark s
92 8  <#> gv[*a] s
93 9  <1> rv2av[t2] lKRM*/1
94 a  <2> aassign[t5] KS/COMMON
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',
113               @open_todo,
114               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
115 1  <0> enter 
116 2  <;> nextstate(main 1 -e:1) v:{
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 
125 # 2  <;> nextstate(main 1 -e:1) v:{
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',
137               @open_todo,
138               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
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',
168               errs      => ['Useless use of reverse in void context at -e line 1.'],
169               bcopts    => '-exec',
170               @open_todo,
171               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
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[t4] 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[t7] lK/1
183 c  <@> reverse[t8] vK/1
184 d  <@> leave[1 ref] vKP/REFC
185 EOT_EOT
186 # 1  <0> enter 
187 # 2  <;> nextstate(main 1 -e:1) v:{
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
193 # 8  <;> nextstate(main 1 -e:1) v:{
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',
204               @open_todo,
205               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
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*
215 a  <2> aassign[t2] KS/COMMON
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',
234               @open_todo,
235               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
236 1  <0> enter 
237 2  <;> nextstate(main 1 -e:1) v:{
238 3  <0> padav[@a:1,2] vM/LVINTRO
239 4  <;> nextstate(main 2 -e:1) v:{
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 
247 # 2  <;> nextstate(main 1 -e:1) v:{
248 # 3  <0> padav[@a:1,2] vM/LVINTRO
249 # 4  <;> nextstate(main 2 -e:1) v:{
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,
261               @open_todo,
262               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
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
270 8  <;> nextstate(main -436 optree.t:325) v:{
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
284 # 8  <;> nextstate(main 430 optree_sort.t:220) v:{
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,
296               @open_todo,
297               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
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
305 8  <;> nextstate(main -436 optree.t:346) v:{
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
316 # 8  <;> nextstate(main 432 optree_sort.t:251) v:{
317 # 9  <$> const(IV 1) s
318 # a  <1> leavesub[1 ref] K/REFC,1
319 EONT_EONT
320
321 } #skip
322
323 __END__
324