summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2019-10-04 14:39:53 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2019-10-04 14:39:53 +0900
commit264239f78fb9ec8047cf04b82f547fc41d65ab28 (patch)
treef1fce8c7ad9f91ad5944057149cd961c0a62843d
parentd4e9de84c543001cb805d903650a80a9a31f880e (diff)
downloadmruby-264239f78fb9ec8047cf04b82f547fc41d65ab28.tar.gz
mruby-264239f78fb9ec8047cf04b82f547fc41d65ab28.zip
Refactor local variables addition in optional/keyword arguments.
-rw-r--r--mrbgems/mruby-compiler/core/parse.y21
1 files changed, 11 insertions, 10 deletions
diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y
index 8f2ee4e92..6afc3f8fe 100644
--- a/mrbgems/mruby-compiler/core/parse.y
+++ b/mrbgems/mruby-compiler/core/parse.y
@@ -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: (a b c) */
/* 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
n = cons(opt, n);
while (opt) {
/* opt: (sym . (opt . lv)) -> (sym . opt) */
- node *lv = opt->car->cdr->cdr;
- while (lv) {
- local_add_f(p, sym(lv->car));
- lv = lv->cdr;
- }
+ local_add_lv(p, opt->car->cdr->cdr);
opt->car->cdr = opt->car->cdr->car;
opt = opt->cdr;
}
@@ -797,11 +802,7 @@ 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;
- }
+ local_add_lv(p, k->car->cdr->cdr->car->cdr);
k->car->cdr->cdr->car = k->car->cdr->cdr->car->car;
local_add_f(p, sym(k->car->cdr->car));
}