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 => 46; 13 14pass("OPTIMIZER TESTS - VAR INITIALIZATION"); 15 16checkOptree ( name => 'sub {my $a}', 17 bcopts => '-exec', 18 code => sub {my $a}, 19 strip_open_hints => 1, 20 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 21# 1 <;> nextstate(main 45 optree.t:23) v:>,<,% 22# 2 <0> padsv[$a:45,46] sM/LVINTRO 23# 3 <1> leavesub[1 ref] K/REFC,1 24EOT_EOT 25# 1 <;> nextstate(main 45 optree.t:23) v:>,<,% 26# 2 <0> padsv[$a:45,46] sM/LVINTRO 27# 3 <1> leavesub[1 ref] K/REFC,1 28EONT_EONT 29 30checkOptree ( name => '-exec sub {my $a}', 31 bcopts => '-exec', 32 code => sub {my $a}, 33 strip_open_hints => 1, 34 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 35# 1 <;> nextstate(main 49 optree.t:52) v:>,<,% 36# 2 <0> padsv[$a:49,50] sM/LVINTRO 37# 3 <1> leavesub[1 ref] K/REFC,1 38EOT_EOT 39# 1 <;> nextstate(main 49 optree.t:45) v:>,<,% 40# 2 <0> padsv[$a:49,50] sM/LVINTRO 41# 3 <1> leavesub[1 ref] K/REFC,1 42EONT_EONT 43 44checkOptree ( name => 'sub {our $a}', 45 bcopts => '-exec', 46 code => sub {our $a}, 47 strip_open_hints => 1, 48 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 491 <;> nextstate(main 21 optree.t:47) v:>,<,% 502 <#> gvsv[*a] s/OURINTR 513 <1> leavesub[1 ref] K/REFC,1 52EOT_EOT 53# 1 <;> nextstate(main 51 optree.t:56) v:>,<,% 54# 2 <$> gvsv(*a) s/OURINTR 55# 3 <1> leavesub[1 ref] K/REFC,1 56EONT_EONT 57 58checkOptree ( name => 'sub {local $a}', 59 bcopts => '-exec', 60 code => sub {local $a}, 61 strip_open_hints => 1, 62 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 631 <;> nextstate(main 23 optree.t:57) v:>,<,%,{ 642 <#> gvsv[*a] s/LVINTRO 653 <1> leavesub[1 ref] K/REFC,1 66EOT_EOT 67# 1 <;> nextstate(main 53 optree.t:67) v:>,<,%,{ 68# 2 <$> gvsv(*a) s/LVINTRO 69# 3 <1> leavesub[1 ref] K/REFC,1 70EONT_EONT 71 72checkOptree ( name => 'my $a', 73 prog => 'my $a', 74 bcopts => '-basic', 75 strip_open_hints => 1, 76 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 77# 4 <@> leave[1 ref] vKP/REFC ->(end) 78# 1 <0> enter v ->2 79# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3 80# 3 <0> padsv[$a:1,2] vM/LVINTRO ->4 81EOT_EOT 82# 4 <@> leave[1 ref] vKP/REFC ->(end) 83# 1 <0> enter v ->2 84# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3 85# 3 <0> padsv[$a:1,2] vM/LVINTRO ->4 86EONT_EONT 87 88checkOptree ( name => 'our $a', 89 prog => 'our $a', 90 bcopts => '-basic', 91 strip_open_hints => 1, 92 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 933 <@> leave[1 ref] vKP/REFC ->(end) 941 <0> enter v ->2 952 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3 96- <1> rv2sv vK/OURINTR,1 ->3 97- <#> gv[*a] s ->- 98EOT_EOT 99# 3 <@> leave[1 ref] vKP/REFC ->(end) 100# 1 <0> enter v ->2 101# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3 102# - <1> rv2sv vK/OURINTR,1 ->3 103# - <$> gv(*a) s ->- 104EONT_EONT 105 106checkOptree ( name => 'local $c', 107 prog => 'local $c', 108 errs => ['Name "main::c" used only once: possible typo at -e line 1.'], 109 bcopts => '-basic', 110 strip_open_hints => 1, 111 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 1124 <@> leave[1 ref] vKP/REFC ->(end) 1131 <0> enter v ->2 1142 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3 115- <1> ex-rv2sv vKM/LVINTRO,1 ->4 1163 <#> gvsv[*c] s/LVINTRO ->4 117EOT_EOT 118# 4 <@> leave[1 ref] vKP/REFC ->(end) 119# 1 <0> enter v ->2 120# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3 121# - <1> ex-rv2sv vKM/LVINTRO,1 ->4 122# 3 <$> gvsv(*c) s/LVINTRO ->4 123EONT_EONT 124 125pass("MY, OUR, LOCAL, BOTH SUB AND MAIN, = undef"); 126 127checkOptree ( name => 'sub {my $a=undef}', 128 code => sub {my $a=undef}, 129 bcopts => '-basic', 130 strip_open_hints => 1, 131 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 1323 <1> leavesub[1 ref] K/REFC,1 ->(end) 133- <@> lineseq KP ->3 1341 <;> nextstate(main 1517 optree_varinit.t:128) v ->2 135- <1> ex-sassign sKS/2 ->- 1362 <0> undef[$a:1517,1518] s/LVINTRO,KEEP_PV,TARGMY ->3 137- <0> ex-padsv sRM*/LVINTRO ->- 138EOT_EOT 139# 3 <1> leavesub[1 ref] K/REFC,1 ->(end) 140# - <@> lineseq KP ->3 141# 1 <;> nextstate(main 1517 optree_varinit.t:128) v ->2 142# - <1> ex-sassign sKS/2 ->- 143# 2 <0> undef[$a:1517,1518] s/LVINTRO,KEEP_PV,TARGMY ->3 144# - <0> ex-padsv sRM*/LVINTRO ->- 145EONT_EONT 146 147checkOptree ( name => 'sub {our $a=undef}', 148 code => sub {our $a=undef}, 149 note => 'the global must be reset', 150 bcopts => '-basic', 151 strip_open_hints => 1, 152 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 1535 <1> leavesub[1 ref] K/REFC,1 ->(end) 154- <@> lineseq KP ->5 1551 <;> nextstate(main 1520 optree_varinit.t:148) v:{ ->2 1564 <2> sassign sKS/2 ->5 1572 <0> undef s ->3 158- <1> ex-rv2sv sKRM*/OURINTR,1 ->4 1593 <#> gvsv[*a] s/OURINTR ->4 160EOT_EOT 161# 5 <1> leavesub[1 ref] K/REFC,1 ->(end) 162# - <@> lineseq KP ->5 163# 1 <;> nextstate(main 1520 optree_varinit.t:148) v:{ ->2 164# 4 <2> sassign sKS/2 ->5 165# 2 <0> undef s ->3 166# - <1> ex-rv2sv sKRM*/OURINTR,1 ->4 167# 3 <$> gvsv(*a) s/OURINTR ->4 168EONT_EONT 169 170checkOptree ( name => 'sub {local $a=undef}', 171 code => sub {local $a=undef}, 172 note => 'local not used enough to bother', 173 bcopts => '-basic', 174 strip_open_hints => 1, 175 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 1765 <1> leavesub[1 ref] K/REFC,1 ->(end) 177- <@> lineseq KP ->5 1781 <;> nextstate(main 1523 optree_varinit.t:171) v:{ ->2 1794 <2> sassign sKS/2 ->5 1802 <0> undef s ->3 181- <1> ex-rv2sv sKRM*/LVINTRO,1 ->4 1823 <#> gvsv[*a] s/LVINTRO ->4 183EOT_EOT 184# 5 <1> leavesub[1 ref] K/REFC,1 ->(end) 185# - <@> lineseq KP ->5 186# 1 <;> nextstate(main 1523 optree_varinit.t:171) v:{ ->2 187# 4 <2> sassign sKS/2 ->5 188# 2 <0> undef s ->3 189# - <1> ex-rv2sv sKRM*/LVINTRO,1 ->4 190# 3 <$> gvsv(*a) s/LVINTRO ->4 191EONT_EONT 192 193checkOptree ( name => 'my $a=undef', 194 prog => 'my $a=undef', 195 bcopts => '-basic', 196 strip_open_hints => 1, 197 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 1984 <@> leave[1 ref] vKP/REFC ->(end) 1991 <0> enter v ->2 2002 <;> nextstate(main 1 -e:1) v:{ ->3 201- <1> ex-sassign vKS/2 ->4 2023 <0> undef[$a:1,2] s/LVINTRO,KEEP_PV,TARGMY ->4 203- <0> ex-padsv sRM*/LVINTRO ->- 204EOT_EOT 205# 4 <@> leave[1 ref] vKP/REFC ->(end) 206# 1 <0> enter v ->2 207# 2 <;> nextstate(main 1 -e:1) v:{ ->3 208# - <1> ex-sassign vKS/2 ->4 209# 3 <0> undef[$a:1,2] s/LVINTRO,KEEP_PV,TARGMY ->4 210# - <0> ex-padsv sRM*/LVINTRO ->- 211EONT_EONT 212 213checkOptree ( name => 'our $a=undef', 214 prog => 'our $a=undef', 215 note => 'global must be reassigned', 216 bcopts => '-basic', 217 strip_open_hints => 1, 218 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 2196 <@> leave[1 ref] vKP/REFC ->(end) 2201 <0> enter v ->2 2212 <;> nextstate(main 1 -e:1) v:{ ->3 2225 <2> sassign vKS/2 ->6 2233 <0> undef s ->4 224- <1> ex-rv2sv sKRM*/OURINTR,1 ->5 2254 <#> gvsv[*a] s/OURINTR ->5 226EOT_EOT 227# 6 <@> leave[1 ref] vKP/REFC ->(end) 228# 1 <0> enter v ->2 229# 2 <;> nextstate(main 1 -e:1) v:{ ->3 230# 5 <2> sassign vKS/2 ->6 231# 3 <0> undef s ->4 232# - <1> ex-rv2sv sKRM*/OURINTR,1 ->5 233# 4 <$> gvsv(*a) s/OURINTR ->5 234EONT_EONT 235 236checkOptree ( name => 'local $c=undef', 237 prog => 'local $c=undef', 238 errs => ['Name "main::c" used only once: possible typo at -e line 1.'], 239 note => 'locals are rare, probably not worth doing', 240 bcopts => '-basic', 241 strip_open_hints => 1, 242 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 2436 <@> leave[1 ref] vKP/REFC ->(end) 2441 <0> enter v ->2 2452 <;> nextstate(main 1 -e:1) v:{ ->3 2465 <2> sassign vKS/2 ->6 2473 <0> undef s ->4 248- <1> ex-rv2sv sKRM*/LVINTRO,1 ->5 2494 <#> gvsv[*c] s/LVINTRO ->5 250EOT_EOT 251# 6 <@> leave[1 ref] vKP/REFC ->(end) 252# 1 <0> enter v ->2 253# 2 <;> nextstate(main 1 -e:1) v:{ ->3 254# 5 <2> sassign vKS/2 ->6 255# 3 <0> undef s ->4 256# - <1> ex-rv2sv sKRM*/LVINTRO,1 ->5 257# 4 <$> gvsv(*c) s/LVINTRO ->5 258EONT_EONT 259 260checkOptree ( name => 'sub {my $a=()}', 261 code => sub {my $a=()}, 262 bcopts => '-exec', 263 strip_open_hints => 1, 264 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 2651 <;> nextstate(main -439 optree.t:105) v:>,<,% 2662 <0> stub sP 2673 <1> padsv_store[$a:1516,1517] sKS/LVINTRO 2684 <1> leavesub[1 ref] K/REFC,1 269EOT_EOT 270# 1 <;> nextstate(main 438 optree_varinit.t:247) v:>,<,% 271# 2 <0> stub sP 272# 3 <1> padsv_store[$a:1516,1517] sKS/LVINTRO 273# 4 <1> leavesub[1 ref] K/REFC,1 274EONT_EONT 275 276checkOptree ( name => 'sub {our $a=()}', 277 code => sub {our $a=()}, 278 #todo => 'probly not worth doing', 279 bcopts => '-exec', 280 strip_open_hints => 1, 281 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 2821 <;> nextstate(main 31 optree.t:177) v:>,<,%,{ 2832 <0> stub sP 2843 <#> gvsv[*a] s/OURINTR 2854 <2> sassign sKS/2 2865 <1> leavesub[1 ref] K/REFC,1 287EOT_EOT 288# 1 <;> nextstate(main 440 optree_varinit.t:262) v:>,<,%,{ 289# 2 <0> stub sP 290# 3 <$> gvsv(*a) s/OURINTR 291# 4 <2> sassign sKS/2 292# 5 <1> leavesub[1 ref] K/REFC,1 293EONT_EONT 294 295checkOptree ( name => 'sub {local $a=()}', 296 code => sub {local $a=()}, 297 #todo => 'probly not worth doing', 298 bcopts => '-exec', 299 strip_open_hints => 1, 300 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 3011 <;> nextstate(main 33 optree.t:190) v:>,<,%,{ 3022 <0> stub sP 3033 <#> gvsv[*a] s/LVINTRO 3044 <2> sassign sKS/2 3055 <1> leavesub[1 ref] K/REFC,1 306EOT_EOT 307# 1 <;> nextstate(main 63 optree.t:225) v:>,<,%,{ 308# 2 <0> stub sP 309# 3 <$> gvsv(*a) s/LVINTRO 310# 4 <2> sassign sKS/2 311# 5 <1> leavesub[1 ref] K/REFC,1 312EONT_EONT 313 314checkOptree ( name => 'my $a=()', 315 prog => 'my $a=()', 316 bcopts => '-exec', 317 strip_open_hints => 1, 318 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 3191 <0> enter v 3202 <;> nextstate(main 1 -e:1) v:>,<,%,{ 3213 <0> stub sP 3224 <1> padsv_store[$a:1516,1517] vKS/LVINTRO 3235 <@> leave[1 ref] vKP/REFC 324EOT_EOT 325# 1 <0> enter v 326# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ 327# 3 <0> stub sP 328# 4 <1> padsv_store[$a:1516,1517] vKS/LVINTRO 329# 5 <@> leave[1 ref] vKP/REFC 330EONT_EONT 331 332checkOptree ( name => 'our $a=()', 333 prog => 'our $a=()', 334 #todo => 'probly not worth doing', 335 bcopts => '-exec', 336 strip_open_hints => 1, 337 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 3381 <0> enter v 3392 <;> nextstate(main 1 -e:1) v:>,<,%,{ 3403 <0> stub sP 3414 <#> gvsv[*a] s/OURINTR 3425 <2> sassign vKS/2 3436 <@> leave[1 ref] vKP/REFC 344EOT_EOT 345# 1 <0> enter v 346# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ 347# 3 <0> stub sP 348# 4 <$> gvsv(*a) s/OURINTR 349# 5 <2> sassign vKS/2 350# 6 <@> leave[1 ref] vKP/REFC 351EONT_EONT 352 353checkOptree ( name => 'local $c=()', 354 prog => 'local $c=()', 355 errs => ['Name "main::c" used only once: possible typo at -e line 1.'], 356 #todo => 'probly not worth doing', 357 bcopts => '-exec', 358 strip_open_hints => 1, 359 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 3601 <0> enter v 3612 <;> nextstate(main 1 -e:1) v:>,<,%,{ 3623 <0> stub sP 3634 <#> gvsv[*c] s/LVINTRO 3645 <2> sassign vKS/2 3656 <@> leave[1 ref] vKP/REFC 366EOT_EOT 367# 1 <0> enter v 368# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ 369# 3 <0> stub sP 370# 4 <$> gvsv(*c) s/LVINTRO 371# 5 <2> sassign vKS/2 372# 6 <@> leave[1 ref] vKP/REFC 373EONT_EONT 374 375checkOptree ( name => 'my ($a,$b)=()', 376 prog => 'my ($a,$b)=()', 377 #todo => 'probly not worth doing', 378 bcopts => '-exec', 379 strip_open_hints => 1, 380 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 381# 1 <0> enter v 382# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ 383# 3 <0> pushmark s 384# 4 <0> padrange[$a:1,2; $b:1,2] RM/LVINTRO,range=2 385# 5 <2> aassign[t3] vKS 386# 6 <@> leave[1 ref] vKP/REFC 387EOT_EOT 388# 1 <0> enter v 389# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ 390# 3 <0> pushmark s 391# 4 <0> padrange[$a:1,2; $b:1,2] RM/LVINTRO,range=2 392# 5 <2> aassign[t3] vKS 393# 6 <@> leave[1 ref] vKP/REFC 394EONT_EONT 395 396checkOptree ( name => 'void context state', 397 prog => 'use feature qw(state); state $x = 1; 1', 398 bcopts => '-exec', 399 strip_open_hints => 1, 400 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 401# 1 <0> enter v 402# 2 <;> nextstate(main 2 -e:1) v:%,{,fea=15 403# 3 <|> once(other->4)[$:2,3] vK/1 404# 4 <$> const[IV 1] s 405# 5 <1> padsv_store[$x:2,3] vKS/LVINTRO,STATE 406# goto 6 407# 8 <0> padsv[$x:2,3] vRM*/STATE 408# 6 <;> nextstate(main 3 -e:1) v:%,{,fea=15 409# 7 <@> leave[1 ref] vKP/REFC 410EOT_EOT 411# 1 <0> enter v 412# 2 <;> nextstate(main 2 -e:1) v:%,{,fea=15 413# 3 <|> once(other->4)[$:2,3] vK/1 414# 4 <$> const(IV 1) s 415# 5 <1> padsv_store[$x:2,3] vKS/LVINTRO,STATE 416# goto 6 417# 8 <0> padsv[$x:2,3] vRM*/STATE 418# 6 <;> nextstate(main 3 -e:1) v:%,{,fea=15 419# 7 <@> leave[1 ref] vKP/REFC 420EONT_EONT 421 422checkOptree ( name => 'scalar context state', 423 prog => 'use feature qw(state); my $y = state $x = 1; 1', 424 bcopts => '-exec', 425 strip_open_hints => 1, 426 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 427# 1 <0> enter v 428# 2 <;> nextstate(main 2 -e:1) v:%,{,fea=15 429# 3 <|> once(other->4)[$:2,3] sK/1 430# 4 <$> const[IV 1] s 431# 5 <1> padsv_store[$x:2,3] sKS/LVINTRO,STATE 432# goto 6 433# 9 <0> padsv[$x:2,3] sRM*/STATE 434# 6 <1> padsv_store[$y:2,3] vKS/LVINTRO 435# 7 <;> nextstate(main 3 -e:1) v:%,{,fea=15 436# 8 <@> leave[1 ref] vKP/REFC 437EOT_EOT 438# 1 <0> enter v 439# 2 <;> nextstate(main 2 -e:1) v:%,{,fea=15 440# 3 <|> once(other->4)[$:2,3] sK/1 441# 4 <$> const(IV 1) s 442# 5 <1> padsv_store[$x:2,3] sKS/LVINTRO,STATE 443# goto 6 444# 9 <0> padsv[$x:2,3] sRM*/STATE 445# 6 <1> padsv_store[$y:2,3] vKS/LVINTRO 446# 7 <;> nextstate(main 3 -e:1) v:%,{,fea=15 447# 8 <@> leave[1 ref] vKP/REFC 448EONT_EONT 449