diff options
| -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); } ; |
