summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-02-22 12:51:41 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-02-22 12:51:41 +0000
commit1727c8358498054428a376b52869983549f62399 (patch)
tree21406199fa36091ee53fd96e2e947575652c9c07 /parse.y
parent95208d59ca4f444f4c9ca3dff42b783e382d4c82 (diff)
Fix CMDARG manipulation
* parse.y: Fix CMDARG manipulation. Use CMDARG_P to identify keyword_do/keyword_do_block. [Feature #14506] [Fix GH-1823] From: Ilya Bylich <ibylich@gmail.com> git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62528 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y40
1 files changed, 13 insertions, 27 deletions
diff --git a/parse.y b/parse.y
index 10d6d2f08c..0e5d9454ad 100644
--- a/parse.y
+++ b/parse.y
@@ -2159,14 +2159,12 @@ command_args : {
lookahead = 1;
}
if (lookahead) CMDARG_POP();
- $<val>$ = p->cmdarg_stack;
CMDARG_PUSH(1);
if (lookahead) CMDARG_PUSH(0);
}
call_args
{
- /* CMDARG_POP() */
- CMDARG_SET($<val>1);
+ CMDARG_POP();
$$ = $2;
}
;
@@ -2287,18 +2285,12 @@ primary : literal
/*% %*/
/*% ripper: paren!(0) %*/
}
- | tLPAREN_ARG
+ | tLPAREN_ARG stmt {SET_LEX_STATE(EXPR_ENDARG);} rparen
{
- $<val>1 = p->cmdarg_stack;
- CMDARG_SET(0);
- }
- stmt {SET_LEX_STATE(EXPR_ENDARG);} rparen
- {
- CMDARG_SET($<val>1);
/*%%%*/
- $$ = $3;
+ $$ = $2;
/*% %*/
- /*% ripper: paren!($3) %*/
+ /*% ripper: paren!($2) %*/
}
| tLPAREN compstmt ')'
{
@@ -3034,13 +3026,11 @@ lambda : {
}
f_larglist
{
- $<val>$ = p->cmdarg_stack;
- CMDARG_SET(0);
+ CMDARG_PUSH(0);
}
lambda_body
{
p->lex.lpar_beg = $<num>2;
- CMDARG_SET($<val>4);
CMDARG_POP();
/*%%%*/
$$ = NEW_LAMBDA($3, $5, &@$);
@@ -3217,14 +3207,12 @@ brace_block : '{' brace_body '}'
;
brace_body : {$<vars>$ = dyna_push(p);}
- {$<val>$ = p->cmdarg_stack >> 1; CMDARG_SET(0);}
opt_block_param compstmt
{
/*%%%*/
- $$ = NEW_ITER($3, $4, &@$);
+ $$ = NEW_ITER($2, $3, &@$);
/*% %*/
- /*% ripper: brace_block!(escape_Qundef($3), $4) %*/
- CMDARG_SET($<val>2);
+ /*% ripper: brace_block!(escape_Qundef($2), $3) %*/
dyna_pop(p, $<vars>1);
}
;
@@ -3649,7 +3637,7 @@ string_dvar : tGVAR
symbol : tSYMBEG sym
{
- SET_LEX_STATE(EXPR_END|EXPR_ENDARG);
+ SET_LEX_STATE(EXPR_END);
/*%%%*/
$$ = $2;
/*% %*/
@@ -3665,7 +3653,7 @@ sym : fname
dsym : tSYMBEG xstring_contents tSTRING_END
{
- SET_LEX_STATE(EXPR_END|EXPR_ENDARG);
+ SET_LEX_STATE(EXPR_END);
/*%%%*/
$$ = dsym_node(p, $2, &@$);
/*% %*/
@@ -5792,7 +5780,7 @@ parser_string_term(struct parser_params *p, int func)
if (func & STR_FUNC_REGEXP) {
set_yylval_num(regx_options(p));
dispatch_scan_event(p, tREGEXP_END);
- SET_LEX_STATE(EXPR_END|EXPR_ENDARG);
+ SET_LEX_STATE(EXPR_END);
return tREGEXP_END;
}
if ((func & STR_FUNC_LABEL) && IS_LABEL_SUFFIX(0)) {
@@ -5800,7 +5788,7 @@ parser_string_term(struct parser_params *p, int func)
SET_LEX_STATE(EXPR_BEG|EXPR_LABEL);
return tLABEL_END;
}
- SET_LEX_STATE(EXPR_END|EXPR_ENDARG);
+ SET_LEX_STATE(EXPR_END);
return tSTRING_END;
}
@@ -5816,7 +5804,7 @@ parse_string(struct parser_params *p, rb_strterm_literal_t *quote)
if (func & STR_FUNC_TERM) {
if (func & STR_FUNC_QWORDS) nextc(p); /* delayed term */
- SET_LEX_STATE(EXPR_END|EXPR_ENDARG);
+ SET_LEX_STATE(EXPR_END);
p->lex.strterm = 0;
return func & STR_FUNC_REGEXP ? tREGEXP_END : tSTRING_END;
}
@@ -6163,7 +6151,7 @@ set_number_literal(struct parser_params *p, VALUE v,
}
set_yylval_literal(v);
add_mark_object(p, v);
- SET_LEX_STATE(EXPR_END|EXPR_ENDARG);
+ SET_LEX_STATE(EXPR_END);
return type;
}
@@ -7434,8 +7422,6 @@ parse_ident(struct parser_params *p, int c, int cmd_state)
if (COND_P()) return keyword_do_cond;
if (CMDARG_P() && !IS_lex_state_for(state, EXPR_CMDARG))
return keyword_do_block;
- if (IS_lex_state_for(state, (EXPR_BEG | EXPR_ENDARG)))
- return keyword_do_block;
return keyword_do;
}
if (IS_lex_state_for(state, (EXPR_BEG | EXPR_LABELED)))