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("GENERAL OPTREE EXAMPLES"); 15 16pass("IF,THEN,ELSE, ?:"); 17 18checkOptree ( name => '-basic sub {if shift print then,else}', 19 bcopts => '-basic', 20 code => sub { if (shift) { print "then" } 21 else { print "else" } 22 }, 23 strip_open_hints => 1, 24 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 25# 7 <1> leavesub[1 ref] K/REFC,1 ->(end) 26# - <@> lineseq KP ->7 27# 1 <;> nextstate(main 665 optree_samples.t:24) v:>,<,% ->2 28# - <1> null K/1 ->- 29# 3 <|> cond_expr(other->4) K/1 ->8 30# 2 <0> shift s* ->3 31# - <@> scope K ->- 32# - <;> ex-nextstate(main 1594 optree_samples.t:25) v:>,<,% ->4 33# 6 <@> print sK ->7 34# 4 <0> pushmark s ->5 35# 5 <$> const[PV "then"] s ->6 36# d <@> leave KP ->7 37# 8 <0> enter ->9 38# 9 <;> nextstate(main 663 optree_samples.t:25) v:>,<,% ->a 39# c <@> print sK ->d 40# a <0> pushmark s ->b 41# b <$> const[PV "else"] s ->c 42EOT_EOT 43# 7 <1> leavesub[1 ref] K/REFC,1 ->(end) 44# - <@> lineseq KP ->7 45# 1 <;> nextstate(main 665 optree_samples.t:24) v:>,<,% ->2 46# - <1> null K/1 ->- 47# 3 <|> cond_expr(other->4) K/1 ->8 48# 2 <0> shift s* ->3 49# - <@> scope K ->- 50# - <;> ex-nextstate(main 1594 optree_samples.t:25) v:>,<,% ->4 51# 6 <@> print sK ->7 52# 4 <0> pushmark s ->5 53# 5 <$> const(PV "then") s ->6 54# d <@> leave KP ->7 55# 8 <0> enter ->9 56# 9 <;> nextstate(main 663 optree_samples.t:25) v:>,<,% ->a 57# c <@> print sK ->d 58# a <0> pushmark s ->b 59# b <$> const(PV "else") s ->c 60EONT_EONT 61 62checkOptree ( name => '-basic (see above, with my $a = shift)', 63 bcopts => '-basic', 64 code => sub { my $a = shift; 65 if ($a) { print "foo" } 66 else { print "bar" } 67 }, 68 strip_open_hints => 1, 69 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 70# b <1> leavesub[1 ref] K/REFC,1 ->(end) 71# - <@> lineseq KP ->b 72# 1 <;> nextstate(main 666 optree_samples.t:70) v:>,<,% ->2 73# 4 <2> sassign vKS/2 ->5 74# 2 <0> shift s* ->3 75# 3 <0> padsv[$a:666,670] sRM*/LVINTRO ->4 76# 5 <;> nextstate(main 670 optree_samples.t:71) v:>,<,% ->6 77# - <1> null K/1 ->- 78# 7 <|> cond_expr(other->8) K/1 ->c 79# 6 <0> padsv[$a:666,670] s ->7 80# - <@> scope K ->- 81# - <;> ex-nextstate(main 1603 optree_samples.t:70) v:>,<,% ->8 82# a <@> print sK ->b 83# 8 <0> pushmark s ->9 84# 9 <$> const[PV "foo"] s ->a 85# h <@> leave KP ->b 86# c <0> enter ->d 87# d <;> nextstate(main 668 optree_samples.t:72) v:>,<,% ->e 88# g <@> print sK ->h 89# e <0> pushmark s ->f 90# f <$> const[PV "bar"] s ->g 91EOT_EOT 92# b <1> leavesub[1 ref] K/REFC,1 ->(end) 93# - <@> lineseq KP ->b 94# 1 <;> nextstate(main 666 optree_samples.t:72) v:>,<,% ->2 95# 4 <2> sassign vKS/2 ->5 96# 2 <0> shift s* ->3 97# 3 <0> padsv[$a:666,670] sRM*/LVINTRO ->4 98# 5 <;> nextstate(main 670 optree_samples.t:73) v:>,<,% ->6 99# - <1> null K/1 ->- 100# 7 <|> cond_expr(other->8) K/1 ->c 101# 6 <0> padsv[$a:666,670] s ->7 102# - <@> scope K ->- 103# - <;> ex-nextstate(main 1603 optree_samples.t:70) v:>,<,% ->8 104# a <@> print sK ->b 105# 8 <0> pushmark s ->9 106# 9 <$> const(PV "foo") s ->a 107# h <@> leave KP ->b 108# c <0> enter ->d 109# d <;> nextstate(main 668 optree_samples.t:74) v:>,<,% ->e 110# g <@> print sK ->h 111# e <0> pushmark s ->f 112# f <$> const(PV "bar") s ->g 113EONT_EONT 114 115checkOptree ( name => '-exec sub {if shift print then,else}', 116 bcopts => '-exec', 117 code => sub { if (shift) { print "then" } 118 else { print "else" } 119 }, 120 strip_open_hints => 1, 121 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 122# 1 <;> nextstate(main 674 optree_samples.t:125) v:>,<,% 123# 2 <0> shift s* 124# 3 <|> cond_expr(other->4) K/1 125# 4 <0> pushmark s 126# 5 <$> const[PV "then"] s 127# 6 <@> print sK 128# goto 7 129# 8 <0> enter 130# 9 <;> nextstate(main 672 optree_samples.t:126) v:>,<,% 131# a <0> pushmark s 132# b <$> const[PV "else"] s 133# c <@> print sK 134# d <@> leave KP 135# 7 <1> leavesub[1 ref] K/REFC,1 136EOT_EOT 137# 1 <;> nextstate(main 674 optree_samples.t:129) v:>,<,% 138# 2 <0> shift s* 139# 3 <|> cond_expr(other->4) K/1 140# 4 <0> pushmark s 141# 5 <$> const(PV "then") s 142# 6 <@> print sK 143# goto 7 144# 8 <0> enter 145# 9 <;> nextstate(main 672 optree_samples.t:130) v:>,<,% 146# a <0> pushmark s 147# b <$> const(PV "else") s 148# c <@> print sK 149# d <@> leave KP 150# 7 <1> leavesub[1 ref] K/REFC,1 151EONT_EONT 152 153checkOptree ( name => '-exec (see above, with my $a = shift)', 154 bcopts => '-exec', 155 code => sub { my $a = shift; 156 if ($a) { print "foo" } 157 else { print "bar" } 158 }, 159 strip_open_hints => 1, 160 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 161# 1 <;> nextstate(main 675 optree_samples.t:165) v:>,<,% 162# 2 <0> shift s* 163# 3 <0> padsv[$a:675,679] sRM*/LVINTRO 164# 4 <2> sassign vKS/2 165# 5 <;> nextstate(main 679 optree_samples.t:166) v:>,<,% 166# 6 <0> padsv[$a:675,679] s 167# 7 <|> cond_expr(other->8) K/1 168# 8 <0> pushmark s 169# 9 <$> const[PV "foo"] s 170# a <@> print sK 171# goto b 172# c <0> enter 173# d <;> nextstate(main 677 optree_samples.t:167) v:>,<,% 174# e <0> pushmark s 175# f <$> const[PV "bar"] s 176# g <@> print sK 177# h <@> leave KP 178# b <1> leavesub[1 ref] K/REFC,1 179EOT_EOT 180# 1 <;> nextstate(main 675 optree_samples.t:171) v:>,<,% 181# 2 <0> shift s* 182# 3 <0> padsv[$a:675,679] sRM*/LVINTRO 183# 4 <2> sassign vKS/2 184# 5 <;> nextstate(main 679 optree_samples.t:172) v:>,<,% 185# 6 <0> padsv[$a:675,679] s 186# 7 <|> cond_expr(other->8) K/1 187# 8 <0> pushmark s 188# 9 <$> const(PV "foo") s 189# a <@> print sK 190# goto b 191# c <0> enter 192# d <;> nextstate(main 677 optree_samples.t:173) v:>,<,% 193# e <0> pushmark s 194# f <$> const(PV "bar") s 195# g <@> print sK 196# h <@> leave KP 197# b <1> leavesub[1 ref] K/REFC,1 198EONT_EONT 199 200checkOptree ( name => '-exec sub { print (shift) ? "foo" : "bar" }', 201 code => sub { print (shift) ? "foo" : "bar" }, 202 bcopts => '-exec', 203 strip_open_hints => 1, 204 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 205# 1 <;> nextstate(main 680 optree_samples.t:213) v:>,<,% 206# 2 <0> pushmark s 207# 3 <0> shift s* 208# 4 <@> print sK 209# 5 <|> cond_expr(other->6) K/1 210# 6 <$> const[PV "foo"] s 211# goto 7 212# 8 <$> const[PV "bar"] s 213# 7 <1> leavesub[1 ref] K/REFC,1 214EOT_EOT 215# 1 <;> nextstate(main 680 optree_samples.t:221) v:>,<,% 216# 2 <0> pushmark s 217# 3 <0> shift s* 218# 4 <@> print sK 219# 5 <|> cond_expr(other->6) K/1 220# 6 <$> const(PV "foo") s 221# goto 7 222# 8 <$> const(PV "bar") s 223# 7 <1> leavesub[1 ref] K/REFC,1 224EONT_EONT 225 226pass ("FOREACH"); 227 228checkOptree ( name => '-exec sub { foreach (1..10) {print "foo $_"} }', 229 code => sub { foreach (1..10) {print "foo $_"} }, 230 bcopts => '-exec', 231 strip_open_hints => 1, 232 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 233# 1 <;> nextstate(main 443 optree.t:158) v:>,<,% 234# 2 <0> pushmark s 235# 3 <$> const[IV 1] s 236# 4 <$> const[IV 10] s 237# 5 <#> gv[*_] s 238# 6 <{> enteriter(next->c last->f redo->7) KS/DEF 239# d <0> iter s 240# e <|> and(other->7) K/1 241# 7 <;> nextstate(main 1659 optree_samples.t:234) v:>,<,% 242# 8 <0> pushmark s 243# 9 <#> gvsv[*_] s 244# a <+> multiconcat("foo ",4,-1)[t5] sK/STRINGIFY 245# b <@> print vK 246# c <0> unstack s 247# goto d 248# f <2> leaveloop K/2 249# g <1> leavesub[1 ref] K/REFC,1 250EOT_EOT 251# 1 <;> nextstate(main 444 optree_samples.t:182) v:>,<,% 252# 2 <0> pushmark s 253# 3 <$> const(IV 1) s 254# 4 <$> const(IV 10) s 255# 5 <$> gv(*_) s 256# 6 <{> enteriter(next->c last->f redo->7) KS/DEF 257# d <0> iter s 258# e <|> and(other->7) K/1 259# 7 <;> nextstate(main 443 optree_samples.t:182) v:>,<,% 260# 8 <0> pushmark s 261# 9 <$> gvsv(*_) s 262# a <+> multiconcat("foo ",4,-1)[t4] sK/STRINGIFY 263# b <@> print vK 264# c <0> unstack s 265# goto d 266# f <2> leaveloop K/2 267# g <1> leavesub[1 ref] K/REFC,1 268EONT_EONT 269 270checkOptree ( name => '-basic sub { print "foo $_" foreach (1..10) }', 271 code => sub { print "foo $_" foreach (1..10) }, 272 bcopts => '-basic', 273 strip_open_hints => 1, 274 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 275# f <1> leavesub[1 ref] K/REFC,1 ->(end) 276# - <@> lineseq KP ->f 277# 1 <;> nextstate(main 445 optree.t:167) v:>,<,% ->2 278# e <2> leaveloop K/2 ->f 279# 6 <{> enteriter(next->b last->e redo->7) KS/DEF ->c 280# - <0> ex-pushmark s ->2 281# - <1> ex-list lK ->5 282# 2 <0> pushmark s ->3 283# 3 <$> const[IV 1] s ->4 284# 4 <$> const[IV 10] s ->5 285# 5 <#> gv[*_] s ->6 286# - <1> null K/1 ->e 287# d <|> and(other->7) K/1 ->e 288# c <0> iter s ->d 289# - <@> lineseq sK ->- 290# a <@> print vK ->b 291# 7 <0> pushmark s ->8 292# 9 <+> multiconcat("foo ",4,-1)[t3] sK/STRINGIFY ->a 293# - <0> ex-pushmark s ->- 294# - <0> ex-const s ->8 295# - <1> ex-rv2sv sK/1 ->9 296# 8 <#> gvsv[*_] s ->9 297# b <0> unstack s ->c 298EOT_EOT 299# f <1> leavesub[1 ref] K/REFC,1 ->(end) 300# - <@> lineseq KP ->f 301# 1 <;> nextstate(main 446 optree_samples.t:192) v:>,<,% ->2 302# e <2> leaveloop K/2 ->f 303# 6 <{> enteriter(next->b last->e redo->7) KS/DEF ->c 304# - <0> ex-pushmark s ->2 305# - <1> ex-list lK ->5 306# 2 <0> pushmark s ->3 307# 3 <$> const(IV 1) s ->4 308# 4 <$> const(IV 10) s ->5 309# 5 <$> gv(*_) s ->6 310# - <1> null K/1 ->e 311# d <|> and(other->7) K/1 ->e 312# c <0> iter s ->d 313# - <@> lineseq sK ->- 314# a <@> print vK ->b 315# 7 <0> pushmark s ->8 316# 9 <+> multiconcat("foo ",4,-1)[t2] sK/STRINGIFY ->a 317# - <0> ex-pushmark s ->- 318# - <0> ex-const s ->8 319# - <1> ex-rv2sv sK/1 ->9 320# 8 <$> gvsv(*_) s ->9 321# b <0> unstack s ->c 322EONT_EONT 323 324checkOptree ( name => '-exec -e foreach (1..10) {print qq{foo $_}}', 325 prog => 'foreach (1..10) {print qq{foo $_}}', 326 bcopts => '-exec', 327 strip_open_hints => 1, 328 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 329# 1 <0> enter v 330# 2 <;> nextstate(main 2 -e:1) v:>,<,%,{ 331# 3 <0> pushmark s 332# 4 <$> const[IV 1] s 333# 5 <$> const[IV 10] s 334# 6 <#> gv[*_] s 335# 7 <{> enteriter(next->d last->g redo->8) vKS/DEF 336# e <0> iter s 337# f <|> and(other->8) vK/1 338# 8 <;> nextstate(main 1 -e:1) v:>,<,% 339# 9 <0> pushmark s 340# a <#> gvsv[*_] s 341# b <+> multiconcat("foo ",4,-1)[t5] sK/STRINGIFY 342# c <@> print vK 343# d <0> unstack v 344# goto e 345# g <2> leaveloop vK/2 346# h <@> leave[1 ref] vKP/REFC 347EOT_EOT 348# 1 <0> enter v 349# 2 <;> nextstate(main 2 -e:1) v:>,<,%,{ 350# 3 <0> pushmark s 351# 4 <$> const(IV 1) s 352# 5 <$> const(IV 10) s 353# 6 <$> gv(*_) s 354# 7 <{> enteriter(next->d last->g redo->8) vKS/DEF 355# e <0> iter s 356# f <|> and(other->8) vK/1 357# 8 <;> nextstate(main 1 -e:1) v:>,<,% 358# 9 <0> pushmark s 359# a <$> gvsv(*_) s 360# b <+> multiconcat("foo ",4,-1)[t4] sK/STRINGIFY 361# c <@> print vK 362# d <0> unstack v 363# goto e 364# g <2> leaveloop vK/2 365# h <@> leave[1 ref] vKP/REFC 366EONT_EONT 367 368checkOptree ( name => '-exec sub { print "foo $_" foreach (1..10) }', 369 code => sub { print "foo $_" foreach (1..10) }, 370 bcopts => '-exec', 371 strip_open_hints => 1, 372 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 373# 1 <;> nextstate(main 445 optree.t:167) v:>,<,% 374# 2 <0> pushmark s 375# 3 <$> const[IV 1] s 376# 4 <$> const[IV 10] s 377# 5 <#> gv[*_] s 378# 6 <{> enteriter(next->b last->e redo->7) KS/DEF 379# c <0> iter s 380# d <|> and(other->7) K/1 381# 7 <0> pushmark s 382# 8 <#> gvsv[*_] s 383# 9 <+> multiconcat("foo ",4,-1)[t3] sK/STRINGIFY 384# a <@> print vK 385# b <0> unstack s 386# goto c 387# e <2> leaveloop K/2 388# f <1> leavesub[1 ref] K/REFC,1 389EOT_EOT 390# 1 <;> nextstate(main 447 optree_samples.t:252) v:>,<,% 391# 2 <0> pushmark s 392# 3 <$> const(IV 1) s 393# 4 <$> const(IV 10) s 394# 5 <$> gv(*_) s 395# 6 <{> enteriter(next->b last->e redo->7) KS/DEF 396# c <0> iter s 397# d <|> and(other->7) K/1 398# 7 <0> pushmark s 399# 8 <$> gvsv(*_) s 400# 9 <+> multiconcat("foo ",4,-1)[t2] sK/STRINGIFY 401# a <@> print vK 402# b <0> unstack s 403# goto c 404# e <2> leaveloop K/2 405# f <1> leavesub[1 ref] K/REFC,1 406EONT_EONT 407 408pass("GREP: SAMPLES FROM PERLDOC -F GREP"); 409 410checkOptree ( name => '@foo = grep(!/^\#/, @bar)', 411 code => '@foo = grep(!/^\#/, @bar)', 412 bcopts => '-exec', 413 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 414# 1 <;> nextstate(main 496 (eval 20):1) v:{ 415# 2 <0> pushmark s 416# 3 <0> pushmark s 417# 4 <#> gv[*bar] s 418# 5 <1> rv2av[t4] lKM/1 419# 6 <@> grepstart lK 420# 7 <|> grepwhile(other->8)[t5] lK 421# 8 </> match(/"^#"/) s 422# 9 <1> not sK/1 423# goto 7 424# a <0> pushmark s 425# b <#> gv[*foo] s 426# c <1> rv2av[t2] lKRM*/1 427# d <2> aassign[t6] KS/COM_AGG 428# e <1> leavesub[1 ref] K/REFC,1 429EOT_EOT 430# 1 <;> nextstate(main 496 (eval 20):1) v:{ 431# 2 <0> pushmark s 432# 3 <0> pushmark s 433# 4 <$> gv(*bar) s 434# 5 <1> rv2av[t2] lKM/1 435# 6 <@> grepstart lK 436# 7 <|> grepwhile(other->8)[t3] lK 437# 8 </> match(/"^\\#"/) s 438# 9 <1> not sK/1 439# goto 7 440# a <0> pushmark s 441# b <$> gv(*foo) s 442# c <1> rv2av[t1] lKRM*/1 443# d <2> aassign[t4] KS/COM_AGG 444# e <1> leavesub[1 ref] K/REFC,1 445EONT_EONT 446 447 448pass("MAP: SAMPLES FROM PERLDOC -F MAP"); 449 450checkOptree ( name => '%h = map { getkey($_) => $_ } @a', 451 code => '%h = map { getkey($_) => $_ } @a', 452 bcopts => '-exec', 453 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 454# 1 <;> nextstate(main 501 (eval 22):1) v:{ 455# 2 <0> pushmark s 456# 3 <0> pushmark s 457# 4 <#> gv[*a] s 458# 5 <1> rv2av[t8] lKM/1 459# 6 <@> mapstart lK 460# 7 <|> mapwhile(other->8)[t9] lK 461# 8 <0> enter l 462# 9 <;> nextstate(main 500 (eval 22):1) v:{ 463# a <0> pushmark s 464# b <#> gvsv[*_] s 465# c <#> gv[*getkey] s/EARLYCV 466# d <1> entersub[t5] lKS/TARG 467# e <#> gvsv[*_] s 468# f <@> leave lKP 469# goto 7 470# g <0> pushmark s 471# h <#> gv[*h] s 472# i <1> rv2hv[t2] lKRM* 473# j <2> aassign[t10] KS/COM_AGG 474# k <1> leavesub[1 ref] K/REFC,1 475EOT_EOT 476# 1 <;> nextstate(main 501 (eval 22):1) v:{ 477# 2 <0> pushmark s 478# 3 <0> pushmark s 479# 4 <$> gv(*a) s 480# 5 <1> rv2av[t3] lKM/1 481# 6 <@> mapstart lK 482# 7 <|> mapwhile(other->8)[t4] lK 483# 8 <0> enter l 484# 9 <;> nextstate(main 500 (eval 22):1) v:{ 485# a <0> pushmark s 486# b <$> gvsv(*_) s 487# c <$> gv(*getkey) s/EARLYCV 488# d <1> entersub[t2] lKS/TARG 489# e <$> gvsv(*_) s 490# f <@> leave lKP 491# goto 7 492# g <0> pushmark s 493# h <$> gv(*h) s 494# i <1> rv2hv[t1] lKRM* 495# j <2> aassign[t5] KS/COM_AGG 496# k <1> leavesub[1 ref] K/REFC,1 497EONT_EONT 498 499checkOptree ( name => '%h=(); for $_(@a){$h{getkey($_)} = $_}', 500 code => '%h=(); for $_(@a){$h{getkey($_)} = $_}', 501 bcopts => '-exec', 502 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 503# 1 <;> nextstate(main 505 (eval 24):1) v 504# 2 <0> pushmark s 505# 3 <0> pushmark s 506# 4 <#> gv[*h] s 507# 5 <1> rv2hv[t2] lKRM* 508# 6 <2> aassign[t3] vKS 509# 7 <;> nextstate(main 506 (eval 24):1) v:{ 510# 8 <0> pushmark sM 511# 9 <#> gv[*a] s 512# a <1> rv2av[t6] sKRM/1 513# b <#> gv[*_] s 514# c <1> rv2gv sKRM/1 515# d <{> enteriter(next->o last->r redo->e) KS/DEF 516# p <0> iter s 517# q <|> and(other->e) K/1 518# e <;> nextstate(main 505 (eval 24):1) v:{ 519# f <#> gvsv[*_] s 520# g <#> gv[*h] s 521# h <1> rv2hv sKR 522# i <0> pushmark s 523# j <#> gvsv[*_] s 524# k <#> gv[*getkey] s/EARLYCV 525# l <1> entersub[t10] sKS/TARG 526# m <2> helem sKRM*/2 527# n <2> sassign vKS/2 528# o <0> unstack s 529# goto p 530# r <2> leaveloop KP/2 531# s <1> leavesub[1 ref] K/REFC,1 532EOT_EOT 533# 1 <;> nextstate(main 505 (eval 24):1) v 534# 2 <0> pushmark s 535# 3 <0> pushmark s 536# 4 <$> gv(*h) s 537# 5 <1> rv2hv[t1] lKRM* 538# 6 <2> aassign[t2] vKS 539# 7 <;> nextstate(main 506 (eval 24):1) v:{ 540# 8 <0> pushmark sM 541# 9 <$> gv(*a) s 542# a <1> rv2av[t3] sKRM/1 543# b <$> gv(*_) s 544# c <1> rv2gv sKRM/1 545# d <{> enteriter(next->o last->r redo->e) KS/DEF 546# p <0> iter s 547# q <|> and(other->e) K/1 548# e <;> nextstate(main 505 (eval 24):1) v:{ 549# f <$> gvsv(*_) s 550# g <$> gv(*h) s 551# h <1> rv2hv sKR 552# i <0> pushmark s 553# j <$> gvsv(*_) s 554# k <$> gv(*getkey) s/EARLYCV 555# l <1> entersub[t4] sKS/TARG 556# m <2> helem sKRM*/2 557# n <2> sassign vKS/2 558# o <0> unstack s 559# goto p 560# r <2> leaveloop KP/2 561# s <1> leavesub[1 ref] K/REFC,1 562EONT_EONT 563 564checkOptree ( name => 'map $_+42, 10..20', 565 code => 'map $_+42, 10..20', 566 bcopts => '-exec', 567 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 568# 1 <;> nextstate(main 497 (eval 20):1) v 569# 2 <0> pushmark s 570# 3 <$> const[AV ARRAY] s 571# 4 <1> rv2av lKPM/1 572# 5 <@> mapstart K 573# 6 <|> mapwhile(other->7)[t5] K 574# 7 <#> gvsv[*_] s 575# 8 <$> const[IV 42] s 576# 9 <2> add[t2] sK/2 577# goto 6 578# a <1> leavesub[1 ref] K/REFC,1 579EOT_EOT 580# 1 <;> nextstate(main 511 (eval 26):1) v 581# 2 <0> pushmark s 582# 3 <$> const(AV ARRAY) s 583# 4 <1> rv2av lKPM/1 584# 5 <@> mapstart K 585# 6 <|> mapwhile(other->7)[t4] K 586# 7 <$> gvsv(*_) s 587# 8 <$> const(IV 42) s 588# 9 <2> add[t1] sK/2 589# goto 6 590# a <1> leavesub[1 ref] K/REFC,1 591EONT_EONT 592 593pass("CONSTANTS"); 594 595checkOptree ( name => '-e use constant j => qq{junk}; print j', 596 prog => 'use constant j => qq{junk}; print j', 597 bcopts => '-exec', 598 strip_open_hints => 1, 599 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 600# 1 <0> enter v 601# 2 <;> nextstate(main 71 -e:1) v:>,<,%,{ 602# 3 <0> pushmark s 603# 4 <$> const[PV "junk"] s*/FOLD 604# 5 <@> print vK 605# 6 <@> leave[1 ref] vKP/REFC 606EOT_EOT 607# 1 <0> enter v 608# 2 <;> nextstate(main 71 -e:1) v:>,<,%,{ 609# 3 <0> pushmark s 610# 4 <$> const(PV "junk") s*/FOLD 611# 5 <@> print vK 612# 6 <@> leave[1 ref] vKP/REFC 613EONT_EONT 614 615pass("rpeep - return \$x at end of sub"); 616 617checkOptree ( name => '-exec sub { return 1 }', 618 code => sub { return 1 }, 619 bcopts => '-exec', 620 strip_open_hints => 1, 621 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 622# 1 <;> nextstate(main 1 -e:1) v:>,<,% 623# 2 <$> const[IV 1] s 624# 3 <1> leavesub[1 ref] K/REFC,1 625EOT_EOT 626# 1 <;> nextstate(main 1 -e:1) v:>,<,% 627# 2 <$> const(IV 1) s 628# 3 <1> leavesub[1 ref] K/REFC,1 629EONT_EONT 630 631pass("rpeep - if ($a || $b)"); 632 633checkOptree ( name => 'if ($a || $b) { } return 1', 634 code => 'if ($a || $b) { } return 1', 635 bcopts => '-exec', 636 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 637# 1 <;> nextstate(main 997 (eval 15):1) v 638# 2 <#> gvsv[*a] s 639# 3 <|> or(other->4) sK/1 640# 4 <#> gvsv[*b] s 641# 5 <|> and(other->6) vK/1 642# 6 <0> stub v 643# 7 <;> nextstate(main 997 (eval 15):1) v 644# 8 <$> const[IV 1] s 645# 9 <1> leavesub[1 ref] K/REFC,1 646EOT_EOT 647# 1 <;> nextstate(main 997 (eval 15):1) v 648# 2 <$> gvsv(*a) s 649# 3 <|> or(other->4) sK/1 650# 4 <$> gvsv(*b) s 651# 5 <|> and(other->6) vK/1 652# 6 <0> stub v 653# 7 <;> nextstate(main 3 (eval 3):1) v 654# 8 <$> const(IV 1) s 655# 9 <1> leavesub[1 ref] K/REFC,1 656EONT_EONT 657 658pass("rpeep - unless ($a && $b)"); 659 660checkOptree ( name => 'unless ($a && $b) { } return 1', 661 code => 'unless ($a && $b) { } return 1', 662 bcopts => '-exec', 663 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 664# 1 <;> nextstate(main 997 (eval 15):1) v 665# 2 <#> gvsv[*a] s 666# 3 <|> and(other->4) sK/1 667# 4 <#> gvsv[*b] s 668# 5 <|> or(other->6) vK/1 669# 6 <0> stub v 670# 7 <;> nextstate(main 997 (eval 15):1) v 671# 8 <$> const[IV 1] s 672# 9 <1> leavesub[1 ref] K/REFC,1 673EOT_EOT 674# 1 <;> nextstate(main 997 (eval 15):1) v 675# 2 <$> gvsv(*a) s 676# 3 <|> and(other->4) sK/1 677# 4 <$> gvsv(*b) s 678# 5 <|> or(other->6) vK/1 679# 6 <0> stub v 680# 7 <;> nextstate(main 3 (eval 3):1) v 681# 8 <$> const(IV 1) s 682# 9 <1> leavesub[1 ref] K/REFC,1 683EONT_EONT 684 685pass("rpeep - my $a; my @b; my %c; print 'f'"); 686 687checkOptree ( name => 'my $a; my @b; my %c; return 1', 688 code => 'my $a; my @b; my %c; return 1', 689 bcopts => '-exec', 690 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 691# 1 <;> nextstate(main 991 (eval 17):1) v 692# 2 <0> padrange[$a:991,994; @b:992,994; %c:993,994] vM/LVINTRO,range=3 693# 3 <;> nextstate(main 994 (eval 17):1) v:{ 694# 4 <$> const[IV 1] s 695# 5 <1> leavesub[1 ref] K/REFC,1 696EOT_EOT 697# 1 <;> nextstate(main 991 (eval 17):1) v 698# 2 <0> padrange[$a:991,994; @b:992,994; %c:993,994] vM/LVINTRO,range=3 699# 3 <;> nextstate(main 994 (eval 17):1) v:{ 700# 4 <$> const(IV 1) s 701# 5 <1> leavesub[1 ref] K/REFC,1 702EONT_EONT 703 704__END__ 705 706####################################################################### 707 708checkOptree ( name => '-exec sub a { print (shift) ? "foo" : "bar" }', 709 code => sub { print (shift) ? "foo" : "bar" }, 710 bcopts => '-exec', 711 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 712 insert threaded reference here 713EOT_EOT 714 insert non-threaded reference here 715EONT_EONT 716 717