1#!perl 2 3BEGIN { 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} 18use OptreeCheck; 19use Config; 20plan tests => 22; 21SKIP: { 22skip "no perlio in this build", 22 unless $Config::Config{useperlio}; 23 24pass("OPTIMIZER TESTS - VAR INITIALIZATION"); 25 26checkOptree ( name => 'sub {my $a}', 27 bcopts => '-exec', 28 code => sub {my $a}, 29 strip_open_hints => 1, 30 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 31# 1 <;> nextstate(main 45 optree.t:23) v:>,<,% 32# 2 <0> padsv[$a:45,46] M/LVINTRO 33# 3 <1> leavesub[1 ref] K/REFC,1 34EOT_EOT 35# 1 <;> nextstate(main 45 optree.t:23) v:>,<,% 36# 2 <0> padsv[$a:45,46] M/LVINTRO 37# 3 <1> leavesub[1 ref] K/REFC,1 38EONT_EONT 39 40checkOptree ( name => '-exec sub {my $a}', 41 bcopts => '-exec', 42 code => sub {my $a}, 43 strip_open_hints => 1, 44 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 45# 1 <;> nextstate(main 49 optree.t:52) v:>,<,% 46# 2 <0> padsv[$a:49,50] M/LVINTRO 47# 3 <1> leavesub[1 ref] K/REFC,1 48EOT_EOT 49# 1 <;> nextstate(main 49 optree.t:45) v:>,<,% 50# 2 <0> padsv[$a:49,50] M/LVINTRO 51# 3 <1> leavesub[1 ref] K/REFC,1 52EONT_EONT 53 54checkOptree ( name => 'sub {our $a}', 55 bcopts => '-exec', 56 code => sub {our $a}, 57 strip_open_hints => 1, 58 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 591 <;> nextstate(main 21 optree.t:47) v:>,<,% 602 <#> gvsv[*a] s/OURINTR 613 <1> leavesub[1 ref] K/REFC,1 62EOT_EOT 63# 1 <;> nextstate(main 51 optree.t:56) v:>,<,% 64# 2 <$> gvsv(*a) s/OURINTR 65# 3 <1> leavesub[1 ref] K/REFC,1 66EONT_EONT 67 68checkOptree ( name => 'sub {local $a}', 69 bcopts => '-exec', 70 code => sub {local $a}, 71 strip_open_hints => 1, 72 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 731 <;> nextstate(main 23 optree.t:57) v:>,<,%,{ 742 <#> gvsv[*a] s/LVINTRO 753 <1> leavesub[1 ref] K/REFC,1 76EOT_EOT 77# 1 <;> nextstate(main 53 optree.t:67) v:>,<,%,{ 78# 2 <$> gvsv(*a) s/LVINTRO 79# 3 <1> leavesub[1 ref] K/REFC,1 80EONT_EONT 81 82checkOptree ( name => 'my $a', 83 prog => 'my $a', 84 bcopts => '-basic', 85 strip_open_hints => 1, 86 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 87# 4 <@> leave[1 ref] vKP/REFC ->(end) 88# 1 <0> enter ->2 89# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3 90# 3 <0> padsv[$a:1,2] vM/LVINTRO ->4 91EOT_EOT 92# 4 <@> leave[1 ref] vKP/REFC ->(end) 93# 1 <0> enter ->2 94# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3 95# 3 <0> padsv[$a:1,2] vM/LVINTRO ->4 96EONT_EONT 97 98checkOptree ( name => 'our $a', 99 prog => 'our $a', 100 bcopts => '-basic', 101 strip_open_hints => 1, 102 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 1034 <@> leave[1 ref] vKP/REFC ->(end) 1041 <0> enter ->2 1052 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3 106- <1> ex-rv2sv vK/17 ->4 1073 <#> gvsv[*a] s/OURINTR ->4 108EOT_EOT 109# 4 <@> leave[1 ref] vKP/REFC ->(end) 110# 1 <0> enter ->2 111# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3 112# - <1> ex-rv2sv vK/17 ->4 113# 3 <$> gvsv(*a) s/OURINTR ->4 114EONT_EONT 115 116checkOptree ( name => 'local $a', 117 prog => 'local $a', 118 errs => ['Name "main::a" used only once: possible typo at -e line 1.'], 119 bcopts => '-basic', 120 strip_open_hints => 1, 121 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 1224 <@> leave[1 ref] vKP/REFC ->(end) 1231 <0> enter ->2 1242 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3 125- <1> ex-rv2sv vKM/129 ->4 1263 <#> gvsv[*a] s/LVINTRO ->4 127EOT_EOT 128# 4 <@> leave[1 ref] vKP/REFC ->(end) 129# 1 <0> enter ->2 130# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3 131# - <1> ex-rv2sv vKM/129 ->4 132# 3 <$> gvsv(*a) s/LVINTRO ->4 133EONT_EONT 134 135pass("MY, OUR, LOCAL, BOTH SUB AND MAIN, = undef"); 136 137checkOptree ( name => 'sub {my $a=undef}', 138 code => sub {my $a=undef}, 139 bcopts => '-basic', 140 strip_open_hints => 1, 141 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 1425 <1> leavesub[1 ref] K/REFC,1 ->(end) 143- <@> lineseq KP ->5 1441 <;> nextstate(main 641 optree_varinit.t:130) v:>,<,% ->2 1454 <2> sassign sKS/2 ->5 1462 <0> undef s ->3 1473 <0> padsv[$a:641,642] sRM*/LVINTRO ->4 148EOT_EOT 149# 5 <1> leavesub[1 ref] K/REFC,1 ->(end) 150# - <@> lineseq KP ->5 151# 1 <;> nextstate(main 641 optree_varinit.t:130) v:>,<,% ->2 152# 4 <2> sassign sKS/2 ->5 153# 2 <0> undef s ->3 154# 3 <0> padsv[$a:641,642] sRM*/LVINTRO ->4 155EONT_EONT 156 157checkOptree ( name => 'sub {our $a=undef}', 158 code => sub {our $a=undef}, 159 note => 'the global must be reset', 160 bcopts => '-basic', 161 strip_open_hints => 1, 162 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 1635 <1> leavesub[1 ref] K/REFC,1 ->(end) 164- <@> lineseq KP ->5 1651 <;> nextstate(main 26 optree.t:109) v:>,<,%,{ ->2 1664 <2> sassign sKS/2 ->5 1672 <0> undef s ->3 168- <1> ex-rv2sv sKRM*/17 ->4 1693 <#> gvsv[*a] s/OURINTR ->4 170EOT_EOT 171# 5 <1> leavesub[1 ref] K/REFC,1 ->(end) 172# - <@> lineseq KP ->5 173# 1 <;> nextstate(main 446 optree_varinit.t:137) v:>,<,%,{ ->2 174# 4 <2> sassign sKS/2 ->5 175# 2 <0> undef s ->3 176# - <1> ex-rv2sv sKRM*/17 ->4 177# 3 <$> gvsv(*a) s/OURINTR ->4 178EONT_EONT 179 180checkOptree ( name => 'sub {local $a=undef}', 181 code => sub {local $a=undef}, 182 note => 'local not used enough to bother', 183 bcopts => '-basic', 184 strip_open_hints => 1, 185 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 1865 <1> leavesub[1 ref] K/REFC,1 ->(end) 187- <@> lineseq KP ->5 1881 <;> nextstate(main 28 optree.t:122) v:>,<,%,{ ->2 1894 <2> sassign sKS/2 ->5 1902 <0> undef s ->3 191- <1> ex-rv2sv sKRM*/129 ->4 1923 <#> gvsv[*a] s/LVINTRO ->4 193EOT_EOT 194# 5 <1> leavesub[1 ref] K/REFC,1 ->(end) 195# - <@> lineseq KP ->5 196# 1 <;> nextstate(main 58 optree.t:141) v:>,<,%,{ ->2 197# 4 <2> sassign sKS/2 ->5 198# 2 <0> undef s ->3 199# - <1> ex-rv2sv sKRM*/129 ->4 200# 3 <$> gvsv(*a) s/LVINTRO ->4 201EONT_EONT 202 203checkOptree ( name => 'my $a=undef', 204 prog => 'my $a=undef', 205 bcopts => '-basic', 206 strip_open_hints => 1, 207 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 2086 <@> leave[1 ref] vKP/REFC ->(end) 2091 <0> enter ->2 2102 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3 2115 <2> sassign vKS/2 ->6 2123 <0> undef s ->4 2134 <0> padsv[$a:1,2] sRM*/LVINTRO ->5 214EOT_EOT 215# 6 <@> leave[1 ref] vKP/REFC ->(end) 216# 1 <0> enter ->2 217# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3 218# 5 <2> sassign vKS/2 ->6 219# 3 <0> undef s ->4 220# 4 <0> padsv[$a:1,2] sRM*/LVINTRO ->5 221EONT_EONT 222 223checkOptree ( name => 'our $a=undef', 224 prog => 'our $a=undef', 225 note => 'global must be reassigned', 226 bcopts => '-basic', 227 strip_open_hints => 1, 228 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 2296 <@> leave[1 ref] vKP/REFC ->(end) 2301 <0> enter ->2 2312 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3 2325 <2> sassign vKS/2 ->6 2333 <0> undef s ->4 234- <1> ex-rv2sv sKRM*/17 ->5 2354 <#> gvsv[*a] s/OURINTR ->5 236EOT_EOT 237# 6 <@> leave[1 ref] vKP/REFC ->(end) 238# 1 <0> enter ->2 239# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3 240# 5 <2> sassign vKS/2 ->6 241# 3 <0> undef s ->4 242# - <1> ex-rv2sv sKRM*/17 ->5 243# 4 <$> gvsv(*a) s/OURINTR ->5 244EONT_EONT 245 246checkOptree ( name => 'local $a=undef', 247 prog => 'local $a=undef', 248 errs => ['Name "main::a" used only once: possible typo at -e line 1.'], 249 note => 'locals are rare, probly not worth doing', 250 bcopts => '-basic', 251 strip_open_hints => 1, 252 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 2536 <@> leave[1 ref] vKP/REFC ->(end) 2541 <0> enter ->2 2552 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3 2565 <2> sassign vKS/2 ->6 2573 <0> undef s ->4 258- <1> ex-rv2sv sKRM*/129 ->5 2594 <#> gvsv[*a] s/LVINTRO ->5 260EOT_EOT 261# 6 <@> leave[1 ref] vKP/REFC ->(end) 262# 1 <0> enter ->2 263# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3 264# 5 <2> sassign vKS/2 ->6 265# 3 <0> undef s ->4 266# - <1> ex-rv2sv sKRM*/129 ->5 267# 4 <$> gvsv(*a) s/LVINTRO ->5 268EONT_EONT 269 270checkOptree ( name => 'sub {my $a=()}', 271 code => sub {my $a=()}, 272 bcopts => '-exec', 273 strip_open_hints => 1, 274 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 2751 <;> nextstate(main -439 optree.t:105) v:>,<,% 2762 <0> stub sP 2773 <0> padsv[$a:-439,-438] sRM*/LVINTRO 2784 <2> sassign sKS/2 2795 <1> leavesub[1 ref] K/REFC,1 280EOT_EOT 281# 1 <;> nextstate(main 438 optree_varinit.t:247) v:>,<,% 282# 2 <0> stub sP 283# 3 <0> padsv[$a:438,439] sRM*/LVINTRO 284# 4 <2> sassign sKS/2 285# 5 <1> leavesub[1 ref] K/REFC,1 286EONT_EONT 287 288checkOptree ( name => 'sub {our $a=()}', 289 code => sub {our $a=()}, 290 #todo => 'probly not worth doing', 291 bcopts => '-exec', 292 strip_open_hints => 1, 293 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 2941 <;> nextstate(main 31 optree.t:177) v:>,<,%,{ 2952 <0> stub sP 2963 <#> gvsv[*a] s/OURINTR 2974 <2> sassign sKS/2 2985 <1> leavesub[1 ref] K/REFC,1 299EOT_EOT 300# 1 <;> nextstate(main 440 optree_varinit.t:262) v:>,<,%,{ 301# 2 <0> stub sP 302# 3 <$> gvsv(*a) s/OURINTR 303# 4 <2> sassign sKS/2 304# 5 <1> leavesub[1 ref] K/REFC,1 305EONT_EONT 306 307checkOptree ( name => 'sub {local $a=()}', 308 code => sub {local $a=()}, 309 #todo => 'probly not worth doing', 310 bcopts => '-exec', 311 strip_open_hints => 1, 312 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 3131 <;> nextstate(main 33 optree.t:190) v:>,<,%,{ 3142 <0> stub sP 3153 <#> gvsv[*a] s/LVINTRO 3164 <2> sassign sKS/2 3175 <1> leavesub[1 ref] K/REFC,1 318EOT_EOT 319# 1 <;> nextstate(main 63 optree.t:225) v:>,<,%,{ 320# 2 <0> stub sP 321# 3 <$> gvsv(*a) s/LVINTRO 322# 4 <2> sassign sKS/2 323# 5 <1> leavesub[1 ref] K/REFC,1 324EONT_EONT 325 326checkOptree ( name => 'my $a=()', 327 prog => 'my $a=()', 328 bcopts => '-exec', 329 strip_open_hints => 1, 330 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 3311 <0> enter 3322 <;> nextstate(main 1 -e:1) v:>,<,%,{ 3333 <0> stub sP 3344 <0> padsv[$a:1,2] sRM*/LVINTRO 3355 <2> sassign vKS/2 3366 <@> leave[1 ref] vKP/REFC 337EOT_EOT 338# 1 <0> enter 339# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ 340# 3 <0> stub sP 341# 4 <0> padsv[$a:1,2] sRM*/LVINTRO 342# 5 <2> sassign vKS/2 343# 6 <@> leave[1 ref] vKP/REFC 344EONT_EONT 345 346checkOptree ( name => 'our $a=()', 347 prog => 'our $a=()', 348 #todo => 'probly not worth doing', 349 bcopts => '-exec', 350 strip_open_hints => 1, 351 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 3521 <0> enter 3532 <;> nextstate(main 1 -e:1) v:>,<,%,{ 3543 <0> stub sP 3554 <#> gvsv[*a] s/OURINTR 3565 <2> sassign vKS/2 3576 <@> leave[1 ref] vKP/REFC 358EOT_EOT 359# 1 <0> enter 360# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ 361# 3 <0> stub sP 362# 4 <$> gvsv(*a) s/OURINTR 363# 5 <2> sassign vKS/2 364# 6 <@> leave[1 ref] vKP/REFC 365EONT_EONT 366 367checkOptree ( name => 'local $a=()', 368 prog => 'local $a=()', 369 errs => ['Name "main::a" used only once: possible typo at -e line 1.'], 370 #todo => 'probly not worth doing', 371 bcopts => '-exec', 372 strip_open_hints => 1, 373 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 3741 <0> enter 3752 <;> nextstate(main 1 -e:1) v:>,<,%,{ 3763 <0> stub sP 3774 <#> gvsv[*a] s/LVINTRO 3785 <2> sassign vKS/2 3796 <@> leave[1 ref] vKP/REFC 380EOT_EOT 381# 1 <0> enter 382# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ 383# 3 <0> stub sP 384# 4 <$> gvsv(*a) s/LVINTRO 385# 5 <2> sassign vKS/2 386# 6 <@> leave[1 ref] vKP/REFC 387EONT_EONT 388 389checkOptree ( name => 'my ($a,$b)=()', 390 prog => 'my ($a,$b)=()', 391 #todo => 'probly not worth doing', 392 bcopts => '-exec', 393 strip_open_hints => 1, 394 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 395# 1 <0> enter 396# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ 397# 3 <0> pushmark s 398# 4 <0> pushmark sRM*/128 399# 5 <0> padsv[$a:1,2] lRM*/LVINTRO 400# 6 <0> padsv[$b:1,2] lRM*/LVINTRO 401# 7 <2> aassign[t3] vKS 402# 8 <@> leave[1 ref] vKP/REFC 403EOT_EOT 404# 1 <0> enter 405# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ 406# 3 <0> pushmark s 407# 4 <0> pushmark sRM*/128 408# 5 <0> padsv[$a:1,2] lRM*/LVINTRO 409# 6 <0> padsv[$b:1,2] lRM*/LVINTRO 410# 7 <2> aassign[t3] vKS 411# 8 <@> leave[1 ref] vKP/REFC 412EONT_EONT 413 414} #skip 415 416__END__ 417 418