Refactor local variables addition in optional/keyword arguments.

parent d4e9de84
...@@ -747,6 +747,15 @@ local_add_margs(parser_state *p, node *n) ...@@ -747,6 +747,15 @@ local_add_margs(parser_state *p, node *n)
} }
} }
static void
local_add_lv(parser_state *p, node *lv)
{
while (lv) {
local_add_f(p, sym(lv->car));
lv = lv->cdr;
}
}
/* (m o r m2 tail) */ /* (m o r m2 tail) */
/* m: (a b c) */ /* m: (a b c) */
/* o: ((a . e1) (b . e2)) */ /* o: ((a . e1) (b . e2)) */
...@@ -765,11 +774,7 @@ new_args(parser_state *p, node *m, node *opt, mrb_sym rest, node *m2, node *tail ...@@ -765,11 +774,7 @@ new_args(parser_state *p, node *m, node *opt, mrb_sym rest, node *m2, node *tail
n = cons(opt, n); n = cons(opt, n);
while (opt) { while (opt) {
/* opt: (sym . (opt . lv)) -> (sym . opt) */ /* opt: (sym . (opt . lv)) -> (sym . opt) */
node *lv = opt->car->cdr->cdr; local_add_lv(p, opt->car->cdr->cdr);
while (lv) {
local_add_f(p, sym(lv->car));
lv = lv->cdr;
}
opt->car->cdr = opt->car->cdr->car; opt->car->cdr = opt->car->cdr->car;
opt = opt->cdr; opt = opt->cdr;
} }
...@@ -797,11 +802,7 @@ new_args_tail(parser_state *p, node *kws, node *kwrest, mrb_sym blk) ...@@ -797,11 +802,7 @@ new_args_tail(parser_state *p, node *kws, node *kwrest, mrb_sym blk)
} }
for (k = kws; k; k = k->cdr) { for (k = kws; k; k = k->cdr) {
if (k->car->cdr->cdr->car) { // allocate keywords with default if (k->car->cdr->cdr->car) { // allocate keywords with default
node *lv = k->car->cdr->cdr->car->cdr; local_add_lv(p, 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; k->car->cdr->cdr->car = k->car->cdr->cdr->car->car;
local_add_f(p, sym(k->car->cdr->car)); local_add_f(p, sym(k->car->cdr->car));
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment