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 => 18; 13 14 15=head1 f_map.t 16 17Code test snippets here are adapted from `perldoc -f map` 18 19=for gentest 20 21# chunk: #!perl 22# examples shamelessly snatched from perldoc -f map 23 24=cut 25 26=for gentest 27 28# chunk: # translates a list of numbers to the corresponding characters. 29@chars = map(chr, @nums); 30 31=cut 32 33checkOptree(note => q{}, 34 bcopts => q{-exec}, 35 code => q{@chars = map(chr, @nums); }, 36 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 37# 1 <;> nextstate(main 475 (eval 10):1) v 38# 2 <0> pushmark s 39# 3 <0> pushmark s 40# 4 <#> gv[*nums] s 41# 5 <1> rv2av[t7] lKM/1 42# 6 <@> mapstart lK 43# 7 <|> mapwhile(other->8)[t8] lK 44# 8 <#> gvsv[*_] s 45# 9 <1> chr[t5] sK/1 46# goto 7 47# a <0> pushmark s 48# b <#> gv[*chars] s 49# c <1> rv2av[t2] lKRM*/1 50# d <2> aassign[t9] KS/COM_AGG 51# e <1> leavesub[1 ref] K/REFC,1 52EOT_EOT 53# 1 <;> nextstate(main 559 (eval 15):1) v 54# 2 <0> pushmark s 55# 3 <0> pushmark s 56# 4 <$> gv(*nums) s 57# 5 <1> rv2av[t4] lKM/1 58# 6 <@> mapstart lK 59# 7 <|> mapwhile(other->8)[t5] lK 60# 8 <$> gvsv(*_) s 61# 9 <1> chr[t3] sK/1 62# goto 7 63# a <0> pushmark s 64# b <$> gv(*chars) s 65# c <1> rv2av[t1] lKRM*/1 66# d <2> aassign[t6] KS/COM_AGG 67# e <1> leavesub[1 ref] K/REFC,1 68EONT_EONT 69 70 71=for gentest 72 73# chunk: %hash = map { getkey($_) => $_ } @array; 74 75=cut 76 77checkOptree(note => q{}, 78 bcopts => q{-exec}, 79 code => q{%hash = map { getkey($_) => $_ } @array; }, 80 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 81# 1 <;> nextstate(main 476 (eval 10):1) v:{ 82# 2 <0> pushmark s 83# 3 <0> pushmark s 84# 4 <#> gv[*array] s 85# 5 <1> rv2av[t8] lKM/1 86# 6 <@> mapstart lK 87# 7 <|> mapwhile(other->8)[t9] lK 88# 8 <0> enter l 89# 9 <;> nextstate(main 475 (eval 10):1) v:{ 90# a <0> pushmark s 91# b <#> gvsv[*_] s 92# c <#> gv[*getkey] s/EARLYCV 93# d <1> entersub[t5] lKS/TARG 94# e <#> gvsv[*_] s 95# f <@> leave lKP 96# goto 7 97# g <0> pushmark s 98# h <#> gv[*hash] s 99# i <1> rv2hv[t2] lKRM* 100# j <2> aassign[t10] KS/COM_AGG 101# k <1> leavesub[1 ref] K/REFC,1 102EOT_EOT 103# 1 <;> nextstate(main 560 (eval 15):1) v:{ 104# 2 <0> pushmark s 105# 3 <0> pushmark s 106# 4 <$> gv(*array) s 107# 5 <1> rv2av[t3] lKM/1 108# 6 <@> mapstart lK 109# 7 <|> mapwhile(other->8)[t4] lK 110# 8 <0> enter l 111# 9 <;> nextstate(main 559 (eval 15):1) v:{ 112# a <0> pushmark s 113# b <$> gvsv(*_) s 114# c <$> gv(*getkey) s/EARLYCV 115# d <1> entersub[t2] lKS/TARG 116# e <$> gvsv(*_) s 117# f <@> leave lKP 118# goto 7 119# g <0> pushmark s 120# h <$> gv(*hash) s 121# i <1> rv2hv[t1] lKRM* 122# j <2> aassign[t5] KS/COM_AGG 123# k <1> leavesub[1 ref] K/REFC,1 124EONT_EONT 125 126 127=for gentest 128 129# chunk: { 130 %hash = (); 131 foreach $_ (@array) { 132 $hash{getkey($_)} = $_; 133 } 134} 135 136=cut 137 138checkOptree(note => q{}, 139 bcopts => q{-exec}, 140 code => q{{ %hash = (); foreach $_ (@array) { $hash{getkey($_)} = $_; } } }, 141 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 142# 1 <;> nextstate(main 478 (eval 10):1) v:{ 143# 2 <{> enterloop(next->u last->u redo->3) 144# 3 <;> nextstate(main 475 (eval 10):1) v 145# 4 <0> pushmark s 146# 5 <0> pushmark s 147# 6 <#> gv[*hash] s 148# 7 <1> rv2hv[t2] lKRM* 149# 8 <2> aassign[t3] vKS 150# 9 <;> nextstate(main 476 (eval 10):1) v:{ 151# a <0> pushmark sM 152# b <#> gv[*array] s 153# c <1> rv2av[t6] sKRM/1 154# d <#> gv[*_] s 155# e <1> rv2gv sKRM/1 156# f <{> enteriter(next->q last->t redo->g) KS/DEF 157# r <0> iter s 158# s <|> and(other->g) K/1 159# g <;> nextstate(main 475 (eval 10):1) v:{ 160# h <#> gvsv[*_] s 161# i <#> gv[*hash] s 162# j <1> rv2hv sKR 163# k <0> pushmark s 164# l <#> gvsv[*_] s 165# m <#> gv[*getkey] s/EARLYCV 166# n <1> entersub[t10] sKS/TARG 167# o <2> helem sKRM*/2 168# p <2> sassign vKS/2 169# q <0> unstack s 170# goto r 171# t <2> leaveloop KP/2 172# u <2> leaveloop K/2 173# v <1> leavesub[1 ref] K/REFC,1 174EOT_EOT 175# 1 <;> nextstate(main 562 (eval 15):1) v:{ 176# 2 <{> enterloop(next->u last->u redo->3) 177# 3 <;> nextstate(main 559 (eval 15):1) v 178# 4 <0> pushmark s 179# 5 <0> pushmark s 180# 6 <$> gv(*hash) s 181# 7 <1> rv2hv[t1] lKRM* 182# 8 <2> aassign[t2] vKS 183# 9 <;> nextstate(main 560 (eval 15):1) v:{ 184# a <0> pushmark sM 185# b <$> gv(*array) s 186# c <1> rv2av[t3] sKRM/1 187# d <$> gv(*_) s 188# e <1> rv2gv sKRM/1 189# f <{> enteriter(next->q last->t redo->g) KS/DEF 190# r <0> iter s 191# s <|> and(other->g) K/1 192# g <;> nextstate(main 559 (eval 15):1) v:{ 193# h <$> gvsv(*_) s 194# i <$> gv(*hash) s 195# j <1> rv2hv sKR 196# k <0> pushmark s 197# l <$> gvsv(*_) s 198# m <$> gv(*getkey) s/EARLYCV 199# n <1> entersub[t4] sKS/TARG 200# o <2> helem sKRM*/2 201# p <2> sassign vKS/2 202# q <0> unstack s 203# goto r 204# t <2> leaveloop KP/2 205# u <2> leaveloop K/2 206# v <1> leavesub[1 ref] K/REFC,1 207EONT_EONT 208 209 210=for gentest 211 212# chunk: #%hash = map { "\L$_", 1 } @array; # perl guesses EXPR. wrong 213%hash = map { +"\L$_", 1 } @array; # perl guesses BLOCK. right 214 215=cut 216 217checkOptree(note => q{}, 218 bcopts => q{-exec}, 219 code => q{%hash = map { +"\L$_", 1 } @array; }, 220 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 221# 1 <;> nextstate(main 476 (eval 10):1) v 222# 2 <0> pushmark s 223# 3 <0> pushmark s 224# 4 <#> gv[*array] s 225# 5 <1> rv2av[t7] lKM/1 226# 6 <@> mapstart lK 227# 7 <|> mapwhile(other->8)[t9] lK 228# 8 <#> gvsv[*_] s 229# 9 <1> lc[t4] sK/1 230# a <$> const[IV 1] s 231# goto 7 232# b <0> pushmark s 233# c <#> gv[*hash] s 234# d <1> rv2hv[t2] lKRM* 235# e <2> aassign[t10] KS/COM_AGG 236# f <1> leavesub[1 ref] K/REFC,1 237EOT_EOT 238# 1 <;> nextstate(main 560 (eval 15):1) v 239# 2 <0> pushmark s 240# 3 <0> pushmark s 241# 4 <$> gv(*array) s 242# 5 <1> rv2av[t4] lKM/1 243# 6 <@> mapstart lK 244# 7 <|> mapwhile(other->8)[t5] lK 245# 8 <$> gvsv(*_) s 246# 9 <1> lc[t2] sK/1 247# a <$> const(IV 1) s 248# goto 7 249# b <0> pushmark s 250# c <$> gv(*hash) s 251# d <1> rv2hv[t1] lKRM* 252# e <2> aassign[t6] KS/COM_AGG 253# f <1> leavesub[1 ref] K/REFC,1 254EONT_EONT 255 256 257=for gentest 258 259# chunk: %hash = map { ("\L$_", 1) } @array; # this also works 260 261=cut 262 263checkOptree(note => q{}, 264 bcopts => q{-exec}, 265 code => q{%hash = map { ("\L$_", 1) } @array; }, 266 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 267# 1 <;> nextstate(main 476 (eval 10):1) v 268# 2 <0> pushmark s 269# 3 <0> pushmark s 270# 4 <#> gv[*array] s 271# 5 <1> rv2av[t7] lKM/1 272# 6 <@> mapstart lK 273# 7 <|> mapwhile(other->8)[t9] lK 274# 8 <#> gvsv[*_] s 275# 9 <1> lc[t4] sK/1 276# a <$> const[IV 1] s 277# goto 7 278# b <0> pushmark s 279# c <#> gv[*hash] s 280# d <1> rv2hv[t2] lKRM* 281# e <2> aassign[t10] KS/COM_AGG 282# f <1> leavesub[1 ref] K/REFC,1 283EOT_EOT 284# 1 <;> nextstate(main 560 (eval 15):1) v 285# 2 <0> pushmark s 286# 3 <0> pushmark s 287# 4 <$> gv(*array) s 288# 5 <1> rv2av[t4] lKM/1 289# 6 <@> mapstart lK 290# 7 <|> mapwhile(other->8)[t5] lK 291# 8 <$> gvsv(*_) s 292# 9 <1> lc[t2] sK/1 293# a <$> const(IV 1) s 294# goto 7 295# b <0> pushmark s 296# c <$> gv(*hash) s 297# d <1> rv2hv[t1] lKRM* 298# e <2> aassign[t6] KS/COM_AGG 299# f <1> leavesub[1 ref] K/REFC,1 300EONT_EONT 301 302 303=for gentest 304 305# chunk: %hash = map { lc($_), 1 } @array; # as does this. 306 307=cut 308 309checkOptree(note => q{}, 310 bcopts => q{-exec}, 311 code => q{%hash = map { lc($_), 1 } @array; }, 312 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 313# 1 <;> nextstate(main 476 (eval 10):1) v 314# 2 <0> pushmark s 315# 3 <0> pushmark s 316# 4 <#> gv[*array] s 317# 5 <1> rv2av[t6] lKM/1 318# 6 <@> mapstart lK 319# 7 <|> mapwhile(other->8)[t8] lK 320# 8 <#> gvsv[*_] s 321# 9 <1> lc[t4] sK/1 322# a <$> const[IV 1] s 323# goto 7 324# b <0> pushmark s 325# c <#> gv[*hash] s 326# d <1> rv2hv[t2] lKRM* 327# e <2> aassign[t9] KS/COM_AGG 328# f <1> leavesub[1 ref] K/REFC,1 329EOT_EOT 330# 1 <;> nextstate(main 589 (eval 26):1) v 331# 2 <0> pushmark s 332# 3 <0> pushmark s 333# 4 <$> gv(*array) s 334# 5 <1> rv2av[t3] lKM/1 335# 6 <@> mapstart lK 336# 7 <|> mapwhile(other->8)[t4] lK 337# 8 <$> gvsv(*_) s 338# 9 <1> lc[t2] sK/1 339# a <$> const(IV 1) s 340# goto 7 341# b <0> pushmark s 342# c <$> gv(*hash) s 343# d <1> rv2hv[t1] lKRM* 344# e <2> aassign[t5] KS/COM_AGG 345# f <1> leavesub[1 ref] K/REFC,1 346EONT_EONT 347 348 349=for gentest 350 351# chunk: %hash = map +( lc($_), 1 ), @array; # this is EXPR and works! 352 353=cut 354 355checkOptree(note => q{}, 356 bcopts => q{-exec}, 357 code => q{%hash = map +( lc($_), 1 ), @array; }, 358 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 359# 1 <;> nextstate(main 475 (eval 10):1) v 360# 2 <0> pushmark s 361# 3 <0> pushmark s 362# 4 <#> gv[*array] s 363# 5 <1> rv2av[t6] lKM/1 364# 6 <@> mapstart lK 365# 7 <|> mapwhile(other->8)[t7] lK 366# 8 <#> gvsv[*_] s 367# 9 <1> lc[t4] sK/1 368# a <$> const[IV 1] s 369# goto 7 370# b <0> pushmark s 371# c <#> gv[*hash] s 372# d <1> rv2hv[t2] lKRM* 373# e <2> aassign[t8] KS/COM_AGG 374# f <1> leavesub[1 ref] K/REFC,1 375EOT_EOT 376# 1 <;> nextstate(main 593 (eval 28):1) v 377# 2 <0> pushmark s 378# 3 <0> pushmark s 379# 4 <$> gv(*array) s 380# 5 <1> rv2av[t3] lKM/1 381# 6 <@> mapstart lK 382# 7 <|> mapwhile(other->8)[t4] lK 383# 8 <$> gvsv(*_) s 384# 9 <1> lc[t2] sK/1 385# a <$> const(IV 1) s 386# goto 7 387# b <0> pushmark s 388# c <$> gv(*hash) s 389# d <1> rv2hv[t1] lKRM* 390# e <2> aassign[t5] KS/COM_AGG 391# f <1> leavesub[1 ref] K/REFC,1 392EONT_EONT 393 394 395=for gentest 396 397# chunk: %hash = map ( lc($_), 1 ), @array; # evaluates to (1, @array) 398 399=cut 400 401checkOptree(note => q{}, 402 bcopts => q{-exec}, 403 code => q{%hash = map ( lc($_), 1 ), @array; }, 404 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 405# 1 <;> nextstate(main 475 (eval 10):1) v 406# 2 <0> pushmark s 407# 3 <0> pushmark s 408# 4 <0> pushmark s 409# 5 <$> const[IV 1] sM 410# 6 <@> mapstart lK 411# 7 <|> mapwhile(other->8)[t5] lK 412# 8 <#> gvsv[*_] s 413# 9 <1> lc[t4] sK/1 414# goto 7 415# a <0> pushmark s 416# b <#> gv[*hash] s 417# c <1> rv2hv[t2] lKRM* 418# d <2> aassign[t6] KS/COM_AGG 419# e <#> gv[*array] s 420# f <1> rv2av[t8] K/1 421# g <@> list K 422# h <1> leavesub[1 ref] K/REFC,1 423EOT_EOT 424# 1 <;> nextstate(main 597 (eval 30):1) v 425# 2 <0> pushmark s 426# 3 <0> pushmark s 427# 4 <0> pushmark s 428# 5 <$> const(IV 1) sM 429# 6 <@> mapstart lK 430# 7 <|> mapwhile(other->8)[t3] lK 431# 8 <$> gvsv(*_) s 432# 9 <1> lc[t2] sK/1 433# goto 7 434# a <0> pushmark s 435# b <$> gv(*hash) s 436# c <1> rv2hv[t1] lKRM* 437# d <2> aassign[t4] KS/COM_AGG 438# e <$> gv(*array) s 439# f <1> rv2av[t5] K/1 440# g <@> list K 441# h <1> leavesub[1 ref] K/REFC,1 442EONT_EONT 443 444 445=for gentest 446 447# chunk: @hashes = map +{ lc($_), 1 }, @array # EXPR, so needs , at end 448 449=cut 450 451checkOptree(note => q{}, 452 bcopts => q{-exec}, 453 code => q{@hashes = map +{ lc($_), 1 }, @array }, 454 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 455# 1 <;> nextstate(main 475 (eval 10):1) v 456# 2 <0> pushmark s 457# 3 <0> pushmark s 458# 4 <#> gv[*array] s 459# 5 <1> rv2av[t6] lKM/1 460# 6 <@> mapstart lK 461# 7 <|> mapwhile(other->8)[t7] lK 462# 8 <0> pushmark s 463# 9 <#> gvsv[*_] s 464# a <1> lc[t4] sK/1 465# b <$> const[IV 1] s 466# c <@> anonhash sK*/1 467# goto 7 468# d <0> pushmark s 469# e <#> gv[*hashes] s 470# f <1> rv2av[t2] lKRM*/1 471# g <2> aassign[t8] KS/COM_AGG 472# h <1> leavesub[1 ref] K/REFC,1 473EOT_EOT 474# 1 <;> nextstate(main 601 (eval 32):1) v 475# 2 <0> pushmark s 476# 3 <0> pushmark s 477# 4 <$> gv(*array) s 478# 5 <1> rv2av[t3] lKM/1 479# 6 <@> mapstart lK 480# 7 <|> mapwhile(other->8)[t4] lK 481# 8 <0> pushmark s 482# 9 <$> gvsv(*_) s 483# a <1> lc[t2] sK/1 484# b <$> const(IV 1) s 485# c <@> anonhash sK*/1 486# goto 7 487# d <0> pushmark s 488# e <$> gv(*hashes) s 489# f <1> rv2av[t1] lKRM*/1 490# g <2> aassign[t5] KS/COM_AGG 491# h <1> leavesub[1 ref] K/REFC,1 492EONT_EONT 493