1#!perl
2
3BEGIN {
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}
11use OptreeCheck;
12plan tests => 21;
13
14pass("SORT OPTIMIZATION");
15
16checkOptree ( name	=> 'sub {sort @a}',
17	      code	=> sub {sort @a},
18	      bcopts	=> '-exec',
19	      strip_open_hints => 1,
20	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
21# 1  <;> nextstate(main 424 optree_sort.t:14) v:>,<,%
22# 2  <0> pushmark s
23# 3  <#> gv[*a] s
24# 4  <1> rv2av[t2] lK/1
25# 5  <@> sort K
26# 6  <1> leavesub[1 ref] K/REFC,1
27EOT_EOT
28# 1  <;> nextstate(main 424 optree_sort.t:14) v:>,<,%
29# 2  <0> pushmark s
30# 3  <$> gv(*a) s
31# 4  <1> rv2av[t1] lK/1
32# 5  <@> sort K
33# 6  <1> leavesub[1 ref] K/REFC,1
34EONT_EONT
35
36checkOptree ( name => 'sort @a',
37	      prog => 'sort @a',
38	      errs => [ 'Useless use of sort in void context at -e line 1.',
39			'Name "main::a" used only once: possible typo at -e line 1.',
40			],
41	      bcopts => '-exec',
42	      strip_open_hints => 1,
43	      expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
441  <0> enter v
452  <;> nextstate(main 1 -e:1) v:>,<,%,{
463  <0> pushmark s
474  <#> gv[*a] s
485  <1> rv2av[t2] lK/1
496  <@> sort vK
507  <@> leave[1 ref] vKP/REFC
51EOT_EOT
52# 1  <0> enter v
53# 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
54# 3  <0> pushmark s
55# 4  <$> gv(*a) s
56# 5  <1> rv2av[t1] lK/1
57# 6  <@> sort vK
58# 7  <@> leave[1 ref] vKP/REFC
59EONT_EONT
60
61checkOptree ( name	=> 'sub {@a = sort @a}',
62	      code	=> sub {@a = sort @a},
63	      bcopts	=> '-exec',
64	      strip_open_hints => 1,
65	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
661  <;> nextstate(main -438 optree.t:244) v:>,<,%
672  <0> pushmark s
683  <0> pushmark s
694  <#> gv[*a] s
705  <1> rv2av[t4] lK/1
716  <@> sort lK
727  <0> pushmark s
738  <#> gv[*a] s
749  <1> rv2av[t2] lKRM*/1
75a  <2> aassign[t5] KS/COM_AGG
76b  <1> leavesub[1 ref] K/REFC,1
77EOT_EOT
78# 1  <;> nextstate(main 65 optree.t:311) v:>,<,%
79# 2  <0> pushmark s
80# 3  <0> pushmark s
81# 4  <$> gv(*a) s
82# 5  <1> rv2av[t2] lK/1
83# 6  <@> sort lK
84# 7  <0> pushmark s
85# 8  <$> gv(*a) s
86# 9  <1> rv2av[t1] lKRM*/1
87# a  <2> aassign[t3] KS/COM_AGG
88# b  <1> leavesub[1 ref] K/REFC,1
89EONT_EONT
90
91checkOptree ( name	=> '@a = sort @a',
92	      prog	=> '@a = sort @a',
93	      bcopts	=> '-exec',
94	      strip_open_hints => 1,
95	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
961  <0> enter v
972  <;> nextstate(main 1 -e:1) v:>,<,%,{
983  <0> pushmark s
994  <0> pushmark s
1005  <#> gv[*a] s
1016  <1> rv2av[t4] lKRM*/1
1027  <@> sort lK/INPLACE
1038  <@> leave[1 ref] vKP/REFC
104EOT_EOT
105# 1  <0> enter v
106# 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
107# 3  <0> pushmark s
108# 4  <0> pushmark s
109# 5  <$> gv(*a) s
110# 6  <1> rv2av[t2] lKRM*/1
111# 7  <@> sort lK/INPLACE
112# 8  <@> leave[1 ref] vKP/REFC
113EONT_EONT
114
115checkOptree ( name	=> 'sub {@a = sort @a; reverse @a}',
116	      code	=> sub {@a = sort @a; reverse @a},
117	      bcopts	=> '-exec',
118	      strip_open_hints => 1,
119	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
1201  <;> nextstate(main -438 optree.t:286) v:>,<,%
1212  <0> pushmark s
1223  <0> pushmark s
1234  <#> gv[*a] s
1245  <1> rv2av[t4] lKRM*/1
1256  <@> sort lK/INPLACE
1267  <;> nextstate(main -438 optree.t:288) v:>,<,%
1278  <0> pushmark s
1289  <#> gv[*a] s
129a  <1> rv2av[t7] lK/1
130b  <@> reverse[t8] K/1
131c  <1> leavesub[1 ref] K/REFC,1
132EOT_EOT
133# 1  <;> nextstate(main 66 optree.t:345) v:>,<,%
134# 2  <0> pushmark s
135# 3  <0> pushmark s
136# 4  <$> gv(*a) s
137# 5  <1> rv2av[t2] lKRM*/1
138# 6  <@> sort lK/INPLACE
139# 7  <;> nextstate(main 66 optree.t:346) v:>,<,%
140# 8  <0> pushmark s
141# 9  <$> gv(*a) s
142# a  <1> rv2av[t4] lK/1
143# b  <@> reverse[t5] K/1
144# c  <1> leavesub[1 ref] K/REFC,1
145EONT_EONT
146
147checkOptree ( name	=> '@a = sort @a; reverse @a',
148	      prog	=> '@a = sort @a; reverse @a',
149	      errs      => ['Useless use of reverse in void context at -e line 1.'],
150	      bcopts	=> '-exec',
151	      strip_open_hints => 1,
152	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
1531  <0> enter v
1542  <;> nextstate(main 1 -e:1) v:>,<,%,{
1553  <0> pushmark s
1564  <0> pushmark s
1575  <#> gv[*a] s
1586  <1> rv2av[t4] lKRM*/1
1597  <@> sort lK/INPLACE
1608  <;> nextstate(main 1 -e:1) v:>,<,%,{
1619  <0> pushmark s
162a  <#> gv[*a] s
163b  <1> rv2av[t7] lK/1
164c  <@> reverse[t8] vK/1
165d  <@> leave[1 ref] vKP/REFC
166EOT_EOT
167# 1  <0> enter v
168# 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
169# 3  <0> pushmark s
170# 4  <0> pushmark s
171# 5  <$> gv(*a) s
172# 6  <1> rv2av[t2] lKRM*/1
173# 7  <@> sort lK/INPLACE
174# 8  <;> nextstate(main 1 -e:1) v:>,<,%,{
175# 9  <0> pushmark s
176# a  <$> gv(*a) s
177# b  <1> rv2av[t4] lK/1
178# c  <@> reverse[t5] vK/1
179# d  <@> leave[1 ref] vKP/REFC
180EONT_EONT
181
182checkOptree ( name	=> 'sub {my @a; @a = sort @a}',
183	      code	=> sub {my @a; @a = sort @a},
184	      bcopts	=> '-exec',
185	      strip_open_hints => 1,
186	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
1871  <;> nextstate(main -437 optree.t:254) v:>,<,%
1882  <0> padav[@a:-437,-436] vM/LVINTRO
1893  <;> nextstate(main -436 optree.t:256) v:>,<,%
1904  <0> pushmark s
1915  <0> pushmark s
1926  <0> padav[@a:-437,-436] l
1937  <@> sort lK
1948  <0> pushmark s
1959  <0> padav[@a:-437,-436] lRM*
196a  <2> aassign[t2] KS/COM_AGG
197b  <1> leavesub[1 ref] K/REFC,1
198EOT_EOT
199# 1  <;> nextstate(main 427 optree_sort.t:172) v:>,<,%
200# 2  <0> padav[@a:427,428] vM/LVINTRO
201# 3  <;> nextstate(main 428 optree_sort.t:173) v:>,<,%
202# 4  <0> pushmark s
203# 5  <0> pushmark s
204# 6  <0> padav[@a:427,428] l
205# 7  <@> sort lK
206# 8  <0> pushmark s
207# 9  <0> padav[@a:-437,-436] lRM*
208# a  <2> aassign[t2] KS/COM_AGG
209# b  <1> leavesub[1 ref] K/REFC,1
210EONT_EONT
211
212checkOptree ( name	=> 'my @a; @a = sort @a',
213	      prog	=> 'my @a; @a = sort @a',
214	      bcopts	=> '-exec',
215	      strip_open_hints => 1,
216	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
2171  <0> enter v
2182  <;> nextstate(main 1 -e:1) v:>,<,%,{
2193  <0> padav[@a:1,2] vM/LVINTRO
2204  <;> nextstate(main 2 -e:1) v:>,<,%,{
2215  <0> pushmark s
2226  <0> pushmark s
2237  <0> padav[@a:1,2] lRM*
2248  <@> sort lK/INPLACE
2259  <@> leave[1 ref] vKP/REFC
226EOT_EOT
227# 1  <0> enter v
228# 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
229# 3  <0> padav[@a:1,2] vM/LVINTRO
230# 4  <;> nextstate(main 2 -e:1) v:>,<,%,{
231# 5  <0> pushmark s
232# 6  <0> pushmark s
233# 7  <0> padav[@a:1,2] lRM*
234# 8  <@> sort lK/INPLACE
235# 9  <@> leave[1 ref] vKP/REFC
236EONT_EONT
237
238checkOptree ( name	=> 'sub {my @a; @a = sort @a; push @a, 1}',
239	      code	=> sub {my @a; @a = sort @a; push @a, 1},
240	      bcopts	=> '-exec',
241	      debug	=> 0,
242	      strip_open_hints => 1,
243	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
2441  <;> nextstate(main -437 optree.t:325) v:>,<,%
2452  <0> padav[@a:-437,-436] vM/LVINTRO
2463  <;> nextstate(main -436 optree.t:325) v:>,<,%
2474  <0> pushmark s
2485  <0> pushmark s
2496  <0> padav[@a:-437,-436] lRM*
2507  <@> sort lK/INPLACE
2518  <;> nextstate(main -436 optree.t:325) v:>,<,%,{
2529  <0> pushmark s
253a  <0> padav[@a:-437,-436] lRM
254b  <$> const[IV 1] s
255c  <@> push[t3] sK/2
256d  <1> leavesub[1 ref] K/REFC,1
257EOT_EOT
258# 1  <;> nextstate(main 429 optree_sort.t:219) v:>,<,%
259# 2  <0> padav[@a:429,430] vM/LVINTRO
260# 3  <;> nextstate(main 430 optree_sort.t:220) v:>,<,%
261# 4  <0> pushmark s
262# 5  <0> pushmark s
263# 6  <0> padav[@a:429,430] lRM*
264# 7  <@> sort lK/INPLACE
265# 8  <;> nextstate(main 430 optree_sort.t:220) v:>,<,%,{
266# 9  <0> pushmark s
267# a  <0> padav[@a:429,430] lRM
268# b  <$> const(IV 1) s
269# c  <@> push[t3] sK/2
270# d  <1> leavesub[1 ref] K/REFC,1
271EONT_EONT
272
273checkOptree ( name	=> 'sub {my @a; @a = sort @a; 1}',
274	      code	=> sub {my @a; @a = sort @a; 1},
275	      bcopts	=> '-exec',
276	      debug	=> 0,
277	      strip_open_hints => 1,
278	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
2791  <;> nextstate(main -437 optree.t:325) v:>,<,%
2802  <0> padav[@a:-437,-436] vM/LVINTRO
2813  <;> nextstate(main -436 optree.t:325) v:>,<,%
2824  <0> pushmark s
2835  <0> pushmark s
2846  <0> padav[@a:-437,-436] lRM*
2857  <@> sort lK/INPLACE
2868  <;> nextstate(main -436 optree.t:346) v:>,<,%,{
2879  <$> const[IV 1] s
288a  <1> leavesub[1 ref] K/REFC,1
289EOT_EOT
290# 1  <;> nextstate(main 431 optree_sort.t:250) v:>,<,%
291# 2  <0> padav[@a:431,432] vM/LVINTRO
292# 3  <;> nextstate(main 432 optree_sort.t:251) v:>,<,%
293# 4  <0> pushmark s
294# 5  <0> pushmark s
295# 6  <0> padav[@a:431,432] lRM*
296# 7  <@> sort lK/INPLACE
297# 8  <;> nextstate(main 432 optree_sort.t:251) v:>,<,%,{
298# 9  <$> const(IV 1) s
299# a  <1> leavesub[1 ref] K/REFC,1
300EONT_EONT
301