diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-03-19 03:16:40 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-03-19 03:16:40 +0000 |
commit | 62182eb0a40ca1bb78bed01714a4abed1accefb7 (patch) | |
tree | 791e765dc7e3fba8d67f6817d6b6b3738193ddd2 /parse.y | |
parent | c6e50e513c9e2270beab92c204db9bec6e9f7e69 (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
Diffstat (limited to 'parse.y')
-rw-r--r-- | parse.y | 12 |
1 files changed, 6 insertions, 6 deletions
@@ -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); } |