diff options
author | Zefram <zefram@fysh.org> | 2010-09-08 09:51:29 +0200 |
---|---|---|
committer | Rafael Garcia-Suarez <rgs@consttype.org> | 2010-09-08 10:15:44 +0200 |
commit | ea25a9b2cf73948b1e8c5675de027e0ad13277bd (patch) | |
tree | 2b8bc87185e0e9e01b643752f911cdf4eeac0f85 /toke.c | |
parent | c99cfaa7c4ced6145d9642cd15da5bb2ea4ad19e (diff) | |
download | perl-ea25a9b2cf73948b1e8c5675de027e0ad13277bd.tar.gz |
make qw(...) first-class syntax
This makes a qw(...) list literal a distinct token type for the
parser, where previously it was munged into a "(",THING,")" sequence.
The change means that qw(...) can't accidentally supply parens to parts
of the grammar that want real parens. Due to many bits of code taking
advantage of that by "foreach my $x qw(...) {}", this patch also includes
a hack to coerce qw(...) to the old-style parenthesised THING, emitting
a deprecation warning along the way.
Diffstat (limited to 'toke.c')
-rw-r--r-- | toke.c | 34 |
1 files changed, 24 insertions, 10 deletions
@@ -7319,14 +7319,13 @@ Perl_yylex(pTHX) case KEY_quotemeta: UNI(OP_QUOTEMETA); - case KEY_qw: + case KEY_qw: { + OP *words = NULL; s = scan_str(s,!!PL_madskills,FALSE); if (!s) missingterm(NULL); PL_expect = XOPERATOR; - force_next(')'); if (SvCUR(PL_lex_stuff)) { - OP *words = NULL; int warned = 0; d = SvPV_force(PL_lex_stuff, len); while (len) { @@ -7358,18 +7357,17 @@ Perl_yylex(pTHX) newSVOP(OP_CONST, 0, tokeq(sv))); } } - if (words) { - start_force(PL_curforce); - NEXTVAL_NEXTTOKE.opval = words; - force_next(THING); - } } + if (!words) + words = newNULLLIST(); if (PL_lex_stuff) { SvREFCNT_dec(PL_lex_stuff); PL_lex_stuff = NULL; } - PL_expect = XTERM; - TOKEN('('); + PL_expect = XOPERATOR; + pl_yylval.opval = sawparens(words); + TOKEN(QWLIST); + } case KEY_qq: s = scan_str(s,!!PL_madskills,FALSE); @@ -13985,6 +13983,22 @@ Perl_parse_fullstmt(pTHX_ U32 flags) return fullstmtop; } +void +Perl_coerce_qwlist_to_paren_list(pTHX_ OP *qwlist) +{ + PERL_ARGS_ASSERT_COERCE_QWLIST_TO_PAREN_LIST; + deprecate("qw(...) as parentheses"); + force_next(')'); + if (qwlist->op_type == OP_STUB) { + op_free(qwlist); + } + else { + NEXTVAL_NEXTTOKE.opval = qwlist; + force_next(THING); + } + force_next('('); +} + /* * Local variables: * c-indentation-style: bsd |