diff options
Diffstat (limited to 'ext/B/t/f_map.t')
-rw-r--r-- | ext/B/t/f_map.t | 517 |
1 files changed, 517 insertions, 0 deletions
diff --git a/ext/B/t/f_map.t b/ext/B/t/f_map.t new file mode 100644 index 0000000000..df7d91cd8b --- /dev/null +++ b/ext/B/t/f_map.t @@ -0,0 +1,517 @@ +#!perl + +BEGIN { + chdir q(t); + @INC = qw(../lib ../ext/B/t); + require q(./test.pl); +} +use OptreeCheck; +plan tests => 9; + + +=for gentest + +# chunk: #!perl +# examples shamelessly snatched from perldoc -f map + +=cut + +=for gentest + +# chunk: # translates a list of numbers to the corresponding characters. +@chars = map(chr, @nums); + +=cut + +checkOptree(note => q{}, + bcopts => q{-exec}, + code => q{@chars = map(chr, @nums); }, + expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); +# 1 <;> nextstate(main 475 (eval 10):1) v +# 2 <0> pushmark s +# 3 <0> pushmark s +# 4 <#> gv[*nums] s +# 5 <1> rv2av[t7] lKM/1 +# 6 <@> mapstart lK +# 7 <|> mapwhile(other->8)[t8] lK +# 8 <#> gvsv[*_] s +# 9 <1> chr[t5] sK/1 +# goto 7 +# a <0> pushmark s +# b <#> gv[*chars] s +# c <1> rv2av[t2] lKRM*/1 +# d <2> aassign[t9] KS/COMMON +# e <1> leavesub[1 ref] K/REFC,1 +EOT_EOT +# 1 <;> nextstate(main 559 (eval 15):1) v +# 2 <0> pushmark s +# 3 <0> pushmark s +# 4 <$> gv(*nums) s +# 5 <1> rv2av[t4] lKM/1 +# 6 <@> mapstart lK +# 7 <|> mapwhile(other->8)[t5] lK +# 8 <$> gvsv(*_) s +# 9 <1> chr[t3] sK/1 +# goto 7 +# a <0> pushmark s +# b <$> gv(*chars) s +# c <1> rv2av[t1] lKRM*/1 +# d <2> aassign[t6] KS/COMMON +# e <1> leavesub[1 ref] K/REFC,1 +EONT_EONT + + +=for gentest + +# chunk: %hash = map { getkey($_) => $_ } @array; + +=cut + +checkOptree(note => q{}, + bcopts => q{-exec}, + code => q{%hash = map { getkey($_) => $_ } @array; }, + expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); +# 1 <;> nextstate(main 476 (eval 10):1) v +# 2 <0> pushmark s +# 3 <0> pushmark s +# 4 <#> gv[*array] s +# 5 <1> rv2av[t8] lKM/1 +# 6 <@> mapstart lK* +# 7 <|> mapwhile(other->8)[t9] lK +# 8 <0> enter l +# 9 <;> nextstate(main 475 (eval 10):1) v +# a <0> pushmark s +# b <0> pushmark s +# c <#> gvsv[*_] s +# d <#> gv[*getkey] s/EARLYCV +# e <1> entersub[t5] lKS/TARG,1 +# f <#> gvsv[*_] s +# g <@> list lK +# h <@> leave lKP +# goto 7 +# i <0> pushmark s +# j <#> gv[*hash] s +# k <1> rv2hv[t2] lKRM*/1 +# l <2> aassign[t10] KS/COMMON +# m <1> leavesub[1 ref] K/REFC,1 +EOT_EOT +# 1 <;> nextstate(main 560 (eval 15):1) v +# 2 <0> pushmark s +# 3 <0> pushmark s +# 4 <$> gv(*array) s +# 5 <1> rv2av[t3] lKM/1 +# 6 <@> mapstart lK* +# 7 <|> mapwhile(other->8)[t4] lK +# 8 <0> enter l +# 9 <;> nextstate(main 559 (eval 15):1) v +# a <0> pushmark s +# b <0> pushmark s +# c <$> gvsv(*_) s +# d <$> gv(*getkey) s/EARLYCV +# e <1> entersub[t2] lKS/TARG,1 +# f <$> gvsv(*_) s +# g <@> list lK +# h <@> leave lKP +# goto 7 +# i <0> pushmark s +# j <$> gv(*hash) s +# k <1> rv2hv[t1] lKRM*/1 +# l <2> aassign[t5] KS/COMMON +# m <1> leavesub[1 ref] K/REFC,1 +EONT_EONT + + +=for gentest + +# chunk: { + %hash = (); + foreach $_ (@array) { + $hash{getkey($_)} = $_; + } +} + +=cut + +checkOptree(note => q{}, + bcopts => q{-exec}, + code => q{{ %hash = (); foreach $_ (@array) { $hash{getkey($_)} = $_; } } }, + expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); +# 1 <;> nextstate(main 478 (eval 10):1) v +# 2 <{> enterloop(next->u last->u redo->3) +# 3 <;> nextstate(main 475 (eval 10):1) v +# 4 <0> pushmark s +# 5 <0> pushmark s +# 6 <#> gv[*hash] s +# 7 <1> rv2hv[t2] lKRM*/1 +# 8 <2> aassign[t3] vKS +# 9 <;> nextstate(main 476 (eval 10):1) v +# a <0> pushmark sM +# b <#> gv[*array] s +# c <1> rv2av[t6] sKRM/1 +# d <#> gv[*_] s +# e <1> rv2gv sKRM/1 +# f <{> enteriter(next->q last->t redo->g) lKS +# r <0> iter s +# s <|> and(other->g) K/1 +# g <;> nextstate(main 475 (eval 10):1) v +# h <#> gvsv[*_] s +# i <#> gv[*hash] s +# j <1> rv2hv sKR/1 +# k <0> pushmark s +# l <#> gvsv[*_] s +# m <#> gv[*getkey] s/EARLYCV +# n <1> entersub[t10] sKS/TARG,1 +# o <2> helem sKRM*/2 +# p <2> sassign vKS/2 +# q <0> unstack s +# goto r +# t <2> leaveloop K/2 +# u <2> leaveloop K/2 +# v <1> leavesub[1 ref] K/REFC,1 +EOT_EOT +# 1 <;> nextstate(main 562 (eval 15):1) v +# 2 <{> enterloop(next->u last->u redo->3) +# 3 <;> nextstate(main 559 (eval 15):1) v +# 4 <0> pushmark s +# 5 <0> pushmark s +# 6 <$> gv(*hash) s +# 7 <1> rv2hv[t1] lKRM*/1 +# 8 <2> aassign[t2] vKS +# 9 <;> nextstate(main 560 (eval 15):1) v +# a <0> pushmark sM +# b <$> gv(*array) s +# c <1> rv2av[t3] sKRM/1 +# d <$> gv(*_) s +# e <1> rv2gv sKRM/1 +# f <{> enteriter(next->q last->t redo->g) lKS +# r <0> iter s +# s <|> and(other->g) K/1 +# g <;> nextstate(main 559 (eval 15):1) v +# h <$> gvsv(*_) s +# i <$> gv(*hash) s +# j <1> rv2hv sKR/1 +# k <0> pushmark s +# l <$> gvsv(*_) s +# m <$> gv(*getkey) s/EARLYCV +# n <1> entersub[t4] sKS/TARG,1 +# o <2> helem sKRM*/2 +# p <2> sassign vKS/2 +# q <0> unstack s +# goto r +# t <2> leaveloop K/2 +# u <2> leaveloop K/2 +# v <1> leavesub[1 ref] K/REFC,1 +EONT_EONT + + +=for gentest + +# chunk: #%hash = map { "\L$_", 1 } @array; # perl guesses EXPR. wrong +%hash = map { +"\L$_", 1 } @array; # perl guesses BLOCK. right + +=cut + +checkOptree(note => q{}, + bcopts => q{-exec}, + code => q{%hash = map { +"\L$_", 1 } @array; }, + expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); +# 1 <;> nextstate(main 476 (eval 10):1) v +# 2 <0> pushmark s +# 3 <0> pushmark s +# 4 <#> gv[*array] s +# 5 <1> rv2av[t7] lKM/1 +# 6 <@> mapstart lK* +# 7 <|> mapwhile(other->8)[t9] lK +# 8 <0> pushmark s +# 9 <#> gvsv[*_] s +# a <1> lc[t4] sK/1 +# b <@> stringify[t5] sK/1 +# c <$> const[IV 1] s +# d <@> list lK +# - <@> scope lK +# goto 7 +# e <0> pushmark s +# f <#> gv[*hash] s +# g <1> rv2hv[t2] lKRM*/1 +# h <2> aassign[t10] KS/COMMON +# i <1> leavesub[1 ref] K/REFC,1 +EOT_EOT +# 1 <;> nextstate(main 560 (eval 15):1) v +# 2 <0> pushmark s +# 3 <0> pushmark s +# 4 <$> gv(*array) s +# 5 <1> rv2av[t4] lKM/1 +# 6 <@> mapstart lK* +# 7 <|> mapwhile(other->8)[t5] lK +# 8 <0> pushmark s +# 9 <$> gvsv(*_) s +# a <1> lc[t2] sK/1 +# b <@> stringify[t3] sK/1 +# c <$> const(IV 1) s +# d <@> list lK +# - <@> scope lK +# goto 7 +# e <0> pushmark s +# f <$> gv(*hash) s +# g <1> rv2hv[t1] lKRM*/1 +# h <2> aassign[t6] KS/COMMON +# i <1> leavesub[1 ref] K/REFC,1 +EONT_EONT + + +=for gentest + +# chunk: %hash = map { ("\L$_", 1) } @array; # this also works + +=cut + +checkOptree(note => q{}, + bcopts => q{-exec}, + code => q{%hash = map { ("\L$_", 1) } @array; }, + expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); +# 1 <;> nextstate(main 476 (eval 10):1) v +# 2 <0> pushmark s +# 3 <0> pushmark s +# 4 <#> gv[*array] s +# 5 <1> rv2av[t7] lKM/1 +# 6 <@> mapstart lK* +# 7 <|> mapwhile(other->8)[t9] lK +# 8 <0> pushmark s +# 9 <#> gvsv[*_] s +# a <1> lc[t4] sK/1 +# b <@> stringify[t5] sK/1 +# c <$> const[IV 1] s +# d <@> list lKP +# - <@> scope lK +# goto 7 +# e <0> pushmark s +# f <#> gv[*hash] s +# g <1> rv2hv[t2] lKRM*/1 +# h <2> aassign[t10] KS/COMMON +# i <1> leavesub[1 ref] K/REFC,1 +EOT_EOT +# 1 <;> nextstate(main 560 (eval 15):1) v +# 2 <0> pushmark s +# 3 <0> pushmark s +# 4 <$> gv(*array) s +# 5 <1> rv2av[t4] lKM/1 +# 6 <@> mapstart lK* +# 7 <|> mapwhile(other->8)[t5] lK +# 8 <0> pushmark s +# 9 <$> gvsv(*_) s +# a <1> lc[t2] sK/1 +# b <@> stringify[t3] sK/1 +# c <$> const(IV 1) s +# d <@> list lKP +# - <@> scope lK +# goto 7 +# e <0> pushmark s +# f <$> gv(*hash) s +# g <1> rv2hv[t1] lKRM*/1 +# h <2> aassign[t6] KS/COMMON +# i <1> leavesub[1 ref] K/REFC,1 +EONT_EONT + + +=for gentest + +# chunk: %hash = map { lc($_), 1 } @array; # as does this. + +=cut + +checkOptree(note => q{}, + bcopts => q{-exec}, + code => q{%hash = map { lc($_), 1 } @array; }, + expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); +# 1 <;> nextstate(main 476 (eval 10):1) v +# 2 <0> pushmark s +# 3 <0> pushmark s +# 4 <#> gv[*array] s +# 5 <1> rv2av[t6] lKM/1 +# 6 <@> mapstart lK* +# 7 <|> mapwhile(other->8)[t8] lK +# 8 <0> pushmark s +# 9 <#> gvsv[*_] s +# a <1> lc[t4] sK/1 +# b <$> const[IV 1] s +# c <@> list lK +# - <@> scope lK +# goto 7 +# d <0> pushmark s +# e <#> gv[*hash] s +# f <1> rv2hv[t2] lKRM*/1 +# g <2> aassign[t9] KS/COMMON +# h <1> leavesub[1 ref] K/REFC,1 +EOT_EOT +# 1 <;> nextstate(main 589 (eval 26):1) v +# 2 <0> pushmark s +# 3 <0> pushmark s +# 4 <$> gv(*array) s +# 5 <1> rv2av[t3] lKM/1 +# 6 <@> mapstart lK* +# 7 <|> mapwhile(other->8)[t4] lK +# 8 <0> pushmark s +# 9 <$> gvsv(*_) s +# a <1> lc[t2] sK/1 +# b <$> const(IV 1) s +# c <@> list lK +# - <@> scope lK +# goto 7 +# d <0> pushmark s +# e <$> gv(*hash) s +# f <1> rv2hv[t1] lKRM*/1 +# g <2> aassign[t5] KS/COMMON +# h <1> leavesub[1 ref] K/REFC,1 +EONT_EONT + + +=for gentest + +# chunk: %hash = map +( lc($_), 1 ), @array; # this is EXPR and works! + +=cut + +checkOptree(note => q{}, + bcopts => q{-exec}, + code => q{%hash = map +( lc($_), 1 ), @array; }, + expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); +# 1 <;> nextstate(main 475 (eval 10):1) v +# 2 <0> pushmark s +# 3 <0> pushmark s +# 4 <#> gv[*array] s +# 5 <1> rv2av[t6] lKM/1 +# 6 <@> mapstart lK +# 7 <|> mapwhile(other->8)[t7] lK +# 8 <0> pushmark s +# 9 <#> gvsv[*_] s +# a <1> lc[t4] sK/1 +# b <$> const[IV 1] s +# c <@> list lKP +# goto 7 +# d <0> pushmark s +# e <#> gv[*hash] s +# f <1> rv2hv[t2] lKRM*/1 +# g <2> aassign[t8] KS/COMMON +# h <1> leavesub[1 ref] K/REFC,1 +EOT_EOT +# 1 <;> nextstate(main 593 (eval 28):1) v +# 2 <0> pushmark s +# 3 <0> pushmark s +# 4 <$> gv(*array) s +# 5 <1> rv2av[t3] lKM/1 +# 6 <@> mapstart lK +# 7 <|> mapwhile(other->8)[t4] lK +# 8 <0> pushmark s +# 9 <$> gvsv(*_) s +# a <1> lc[t2] sK/1 +# b <$> const(IV 1) s +# c <@> list lKP +# goto 7 +# d <0> pushmark s +# e <$> gv(*hash) s +# f <1> rv2hv[t1] lKRM*/1 +# g <2> aassign[t5] KS/COMMON +# h <1> leavesub[1 ref] K/REFC,1 +EONT_EONT + + +=for gentest + +# chunk: %hash = map ( lc($_), 1 ), @array; # evaluates to (1, @array) + +=cut + +checkOptree(note => q{}, + bcopts => q{-exec}, + code => q{%hash = map ( lc($_), 1 ), @array; }, + expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); +# 1 <;> nextstate(main 475 (eval 10):1) v +# 2 <0> pushmark s +# 3 <0> pushmark s +# 4 <0> pushmark s +# 5 <$> const[IV 1] sM +# 6 <@> mapstart lK +# 7 <|> mapwhile(other->8)[t5] lK +# 8 <#> gvsv[*_] s +# 9 <1> lc[t4] sK/1 +# goto 7 +# a <0> pushmark s +# b <#> gv[*hash] s +# c <1> rv2hv[t2] lKRM*/1 +# d <2> aassign[t6] KS/COMMON +# e <#> gv[*array] s +# f <1> rv2av[t8] K/1 +# g <@> list K +# h <1> leavesub[1 ref] K/REFC,1 +EOT_EOT +# 1 <;> nextstate(main 597 (eval 30):1) v +# 2 <0> pushmark s +# 3 <0> pushmark s +# 4 <0> pushmark s +# 5 <$> const(IV 1) sM +# 6 <@> mapstart lK +# 7 <|> mapwhile(other->8)[t3] lK +# 8 <$> gvsv(*_) s +# 9 <1> lc[t2] sK/1 +# goto 7 +# a <0> pushmark s +# b <$> gv(*hash) s +# c <1> rv2hv[t1] lKRM*/1 +# d <2> aassign[t4] KS/COMMON +# e <$> gv(*array) s +# f <1> rv2av[t5] K/1 +# g <@> list K +# h <1> leavesub[1 ref] K/REFC,1 +EONT_EONT + + +=for gentest + +# chunk: @hashes = map +{ lc($_), 1 }, @array # EXPR, so needs , at end + +=cut + +checkOptree(note => q{}, + bcopts => q{-exec}, + code => q{@hashes = map +{ lc($_), 1 }, @array }, + expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); +# 1 <;> nextstate(main 475 (eval 10):1) v +# 2 <0> pushmark s +# 3 <0> pushmark s +# 4 <#> gv[*array] s +# 5 <1> rv2av[t6] lKM/1 +# 6 <@> mapstart lK +# 7 <|> mapwhile(other->8)[t7] lK +# 8 <0> pushmark s +# 9 <#> gvsv[*_] s +# a <1> lc[t4] sK/1 +# b <$> const[IV 1] s +# c <@> anonhash sKRM/1 +# d <1> srefgen sK/1 +# goto 7 +# e <0> pushmark s +# f <#> gv[*hashes] s +# g <1> rv2av[t2] lKRM*/1 +# h <2> aassign[t8] KS/COMMON +# i <1> leavesub[1 ref] K/REFC,1 +EOT_EOT +# 1 <;> nextstate(main 601 (eval 32):1) v +# 2 <0> pushmark s +# 3 <0> pushmark s +# 4 <$> gv(*array) s +# 5 <1> rv2av[t3] lKM/1 +# 6 <@> mapstart lK +# 7 <|> mapwhile(other->8)[t4] lK +# 8 <0> pushmark s +# 9 <$> gvsv(*_) s +# a <1> lc[t2] sK/1 +# b <$> const(IV 1) s +# c <@> anonhash sKRM/1 +# d <1> srefgen sK/1 +# goto 7 +# e <0> pushmark s +# f <$> gv(*hashes) s +# g <1> rv2av[t1] lKRM*/1 +# h <2> aassign[t5] KS/COMMON +# i <1> leavesub[1 ref] K/REFC,1 +EONT_EONT |