summaryrefslogtreecommitdiff
path: root/toke.c
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2013-06-30 00:20:33 -0700
committerFather Chrysostomos <sprout@cpan.org>2013-07-25 23:48:02 -0700
commitf815dc14d7c5540dfb5d02d001e0101c6266f281 (patch)
treeeb687c5d627e4bee3aaacc3678bb570ac04e26ad /toke.c
parent15635cbfaf61c4ea7f360fd74037b2f34a1fe3b7 (diff)
downloadperl-f815dc14d7c5540dfb5d02d001e0101c6266f281.tar.gz
Inline list constants
These are inlined the same way as 1..5. We have two ops: rv2av | `-- const The const op returns an AV, which is stored in the op tree, and then rv2av flattens it.
Diffstat (limited to 'toke.c')
-rw-r--r--toke.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/toke.c b/toke.c
index 1781899fcf..c030aec9e6 100644
--- a/toke.c
+++ b/toke.c
@@ -7323,7 +7323,7 @@ Perl_yylex(pTHX)
d = s + 1;
while (SPACE_OR_TAB(*d))
d++;
- if (*d == ')' && (sv = cv_const_sv(cv))) {
+ if (*d == ')' && (sv = cv_const_sv_or_av(cv))) {
s = d + 1;
goto its_constant;
}
@@ -7387,14 +7387,19 @@ Perl_yylex(pTHX)
UTF8fARG(UTF, l, PL_tokenbuf));
}
/* Check for a constant sub */
- if ((sv = cv_const_sv(cv))) {
+ if ((sv = cv_const_sv_or_av(cv))) {
its_constant:
op_free(rv2cv_op);
SvREFCNT_dec(((SVOP*)pl_yylval.opval)->op_sv);
((SVOP*)pl_yylval.opval)->op_sv = SvREFCNT_inc_simple(sv);
- pl_yylval.opval->op_private = OPpCONST_FOLDED;
- pl_yylval.opval->op_folded = 1;
- pl_yylval.opval->op_flags |= OPf_SPECIAL;
+ if (SvTYPE(sv) == SVt_PVAV)
+ pl_yylval.opval = newUNOP(OP_RV2AV, OPf_PARENS,
+ pl_yylval.opval);
+ else {
+ pl_yylval.opval->op_private = OPpCONST_FOLDED;
+ pl_yylval.opval->op_folded = 1;
+ pl_yylval.opval->op_flags |= OPf_SPECIAL;
+ }
TOKEN(WORD);
}