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