summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-compiler/core
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2019-10-03 09:17:37 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2019-10-03 09:17:37 +0900
commitec6c8b2a3c5c499d8832ef82a2ad941cbac4a80a (patch)
tree000ee6bbe80a057d5ec5bb0a4356f37fec31df10 /mrbgems/mruby-compiler/core
parent47cdda370e55debe40d72c21fa520e32a3d00ac2 (diff)
downloadmruby-ec6c8b2a3c5c499d8832ef82a2ad941cbac4a80a.tar.gz
mruby-ec6c8b2a3c5c499d8832ef82a2ad941cbac4a80a.zip
Add local variable reordering to `kwargs`; ref #4746
Diffstat (limited to 'mrbgems/mruby-compiler/core')
-rw-r--r--mrbgems/mruby-compiler/core/parse.y13
1 files changed, 12 insertions, 1 deletions
diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y
index f7ae3913f..8f2ee4e92 100644
--- a/mrbgems/mruby-compiler/core/parse.y
+++ b/mrbgems/mruby-compiler/core/parse.y
@@ -797,6 +797,12 @@ new_args_tail(parser_state *p, node *kws, node *kwrest, mrb_sym blk)
}
for (k = kws; k; k = k->cdr) {
if (k->car->cdr->cdr->car) { // allocate keywords with default
+ node *lv = k->car->cdr->cdr->car->cdr;
+ while (lv) {
+ local_add_f(p, sym(lv->car));
+ lv = lv->cdr;
+ }
+ k->car->cdr->cdr->car = k->car->cdr->cdr->car->car;
local_add_f(p, sym(k->car->cdr->car));
}
}
@@ -3302,16 +3308,21 @@ f_arglist : '(' f_args rparen
;
f_label : tIDENTIFIER tLABEL_TAG
+ {
+ local_nest(p);
+ }
;
f_kw : f_label arg
{
void_expr_error(p, $2);
- $$ = new_kw_arg(p, $1, $2);
+ $$ = new_kw_arg(p, $1, cons($2, locals_node(p)));
+ local_unnest(p);
}
| f_label
{
$$ = new_kw_arg(p, $1, 0);
+ local_unnest(p);
}
;