From 62182eb0a40ca1bb78bed01714a4abed1accefb7 Mon Sep 17 00:00:00 2001 From: nobu Date: Mon, 19 Mar 2018 03:16:40 +0000 Subject: 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 --- parse.y | 12 ++++++------ 1 file 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; itbl[i]); for (i=0; itbl[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); } -- cgit v1.2.3