diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2019-10-03 09:17:37 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2019-10-03 09:17:37 +0900 |
| commit | ec6c8b2a3c5c499d8832ef82a2ad941cbac4a80a (patch) | |
| tree | 000ee6bbe80a057d5ec5bb0a4356f37fec31df10 /mrbgems/mruby-compiler/core | |
| parent | 47cdda370e55debe40d72c21fa520e32a3d00ac2 (diff) | |
| download | mruby-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.y | 13 |
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); } ; |
