summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2019-03-18 12:48:18 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2019-03-18 12:48:18 +0000
commit964bbc1686c7dd42d58da504a6968c90d5a428fd (patch)
treec7ff4d314551e17971152c47d8c380db159605ae /parse.y
parentf9e5b8d09cafc2c91137d293b1458f1b0432a12a (diff)
parse.y: numbered parameter in lambda
* parse.y (lambda): support numbered parameters, only when no argument list including empty parentheses, like empty vertical bars. [ruby-core:91859] [Bug #15672] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67295 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y34
1 files changed, 29 insertions, 5 deletions
diff --git a/parse.y b/parse.y
index 6f8b01b56c..7c51806ab7 100644
--- a/parse.y
+++ b/parse.y
@@ -414,6 +414,7 @@ static NODE *new_qcall(struct parser_params* p, ID atype, NODE *recv, ID mid, NO
static NODE *new_command_qcall(struct parser_params* p, ID atype, NODE *recv, ID mid, NODE *args, NODE *block, const YYLTYPE *op_loc, const YYLTYPE *loc);
static NODE *method_add_block(struct parser_params*p, NODE *m, NODE *b, const YYLTYPE *loc) {b->nd_iter = m; b->nd_loc = *loc; return b;}
+static bool args_info_empty_p(struct rb_args_info *args);
static NODE *new_args(struct parser_params*,NODE*,NODE*,ID,NODE*,NODE*,const YYLTYPE*);
static NODE *new_args_tail(struct parser_params*,NODE*,ID,ID,const YYLTYPE*);
static NODE *new_kw_arg(struct parser_params *p, NODE *k, const YYLTYPE *loc);
@@ -3186,23 +3187,29 @@ lambda : {
$<num>$ = p->lex.lpar_beg;
p->lex.lpar_beg = p->lex.paren_nest;
}
+ {
+ $<num>$ = p->max_numparam;
+ }
f_larglist
{
CMDARG_PUSH(0);
}
lambda_body
{
+ int max_numparam = p->max_numparam;
p->lex.lpar_beg = $<num>2;
+ p->max_numparam = $<num>3;
CMDARG_POP();
+ $4 = args_with_numbered(p, $4, max_numparam);
/*%%%*/
{
- YYLTYPE loc = code_loc_gen(&@3, &@5);
- $$ = NEW_LAMBDA($3, $5, &loc);
- nd_set_line($$->nd_body, @5.end_pos.lineno);
- nd_set_line($$, @3.end_pos.lineno);
+ YYLTYPE loc = code_loc_gen(&@4, &@6);
+ $$ = NEW_LAMBDA($4, $6, &loc);
+ nd_set_line($$->nd_body, @6.end_pos.lineno);
+ nd_set_line($$, @4.end_pos.lineno);
}
/*% %*/
- /*% ripper: lambda!($3, $5) %*/
+ /*% ripper: lambda!($4, $6) %*/
dyna_pop(p, $<vars>1);
}
;
@@ -3211,11 +3218,16 @@ f_larglist : '(' f_args opt_bv_decl ')'
{
/*%%%*/
$$ = $2;
+ p->max_numparam = -1;
/*% %*/
/*% ripper: paren!($2) %*/
}
| f_args
{
+ /*%%%*/
+ if (!args_info_empty_p($1->nd_ainfo))
+ p->max_numparam = -1;
+ /*% %*/
$$ = $1;
}
;
@@ -10253,6 +10265,18 @@ arg_blk_pass(NODE *node1, NODE *node2)
return node1;
}
+static bool
+args_info_empty_p(struct rb_args_info *args)
+{
+ if (args->pre_args_num) return false;
+ if (args->post_args_num) return false;
+ if (args->rest_arg) return false;
+ if (args->opt_args) return false;
+ if (args->block_arg) return false;
+ if (args->kw_args) return false;
+ if (args->kw_rest_arg) return false;
+ return true;
+}
static NODE*
new_args(struct parser_params *p, NODE *pre_args, NODE *opt_args, ID rest_arg, NODE *post_args, NODE *tail, const YYLTYPE *loc)