summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-03-19 03:16:40 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-03-19 03:16:40 +0000
commit62182eb0a40ca1bb78bed01714a4abed1accefb7 (patch)
tree791e765dc7e3fba8d67f6817d6b6b3738193ddd2
parentc6e50e513c9e2270beab92c204db9bec6e9f7e69 (diff)
parse.y: fix duplicate kwrest
* parse.y (f_kwrest): add the variable name as an argument, as well as an internal variable. * parse.y (new_args_tail): now keyword rest argument variable is always placed between keyword arguments and block argument, so so just reorder required and optional keyword arguments. no longer kwrest duplicates. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62832 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--parse.y12
1 files changed, 6 insertions, 6 deletions
diff --git a/parse.y b/parse.y
index d0f900c7f1..19a4189264 100644
--- a/parse.y
+++ b/parse.y
@@ -4053,7 +4053,7 @@ kwrest_mark : tPOW
f_kwrest : kwrest_mark tIDENTIFIER
{
- shadowing_lvar(p, get_id($2));
+ arg_var(p, shadowing_lvar(p, get_id($2)));
/*%%%*/
$$ = $2;
/*% %*/
@@ -9919,8 +9919,11 @@ new_args_tail(struct parser_params *p, NODE *kw_args, ID kw_rest_arg, ID block,
}
kw_bits = internal_id(p);
- if (kw_rest_arg && is_junk_id(kw_rest_arg)) vtable_pop(p->lvtbl->args, 1);
- vtable_pop(p->lvtbl->args, vtable_size(required_kw_vars) + vtable_size(kw_vars) + (block != 0));
+
+ /* reorder */
+ vtable_pop(p->lvtbl->args,
+ vtable_size(required_kw_vars) + vtable_size(kw_vars)
+ + (block != 0) + (kw_rest_arg != 0));
for (i=0; i<vtable_size(required_kw_vars); i++) arg_var(p, required_kw_vars->tbl[i]);
for (i=0; i<vtable_size(kw_vars); i++) arg_var(p, kw_vars->tbl[i]);
@@ -9935,9 +9938,6 @@ new_args_tail(struct parser_params *p, NODE *kw_args, ID kw_rest_arg, ID block,
args->kw_rest_arg->nd_cflag = kw_bits;
}
else if (kw_rest_arg) {
- if (block) vtable_pop(p->lvtbl->args, 1); /* reorder */
- arg_var(p, kw_rest_arg);
- if (block) arg_var(p, block);
args->kw_rest_arg = NEW_DVAR(kw_rest_arg, loc);
}