summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-proc-ext/src/proc.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-04-02 23:54:30 +0900
committerGitHub <[email protected]>2017-04-02 23:54:30 +0900
commit081535bf02107691c2cfd1a01adbee64cba53f69 (patch)
treea0eead1a4dc6c68c2fef6b5cae7ce0cf64fe002d /mrbgems/mruby-proc-ext/src/proc.c
parent5d00e853143016128bd54a3d09dae5cc488b7b2b (diff)
parent7f983928b938b25ca24439686bfa88fdfbe06f67 (diff)
downloadmruby-081535bf02107691c2cfd1a01adbee64cba53f69.tar.gz
mruby-081535bf02107691c2cfd1a01adbee64cba53f69.zip
Merge pull request #3573 from ksss/parameters
Fix parameters when noname rest
Diffstat (limited to 'mrbgems/mruby-proc-ext/src/proc.c')
-rw-r--r--mrbgems/mruby-proc-ext/src/proc.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/mrbgems/mruby-proc-ext/src/proc.c b/mrbgems/mruby-proc-ext/src/proc.c
index 8c9e300dc..f7f031e7b 100644
--- a/mrbgems/mruby-proc-ext/src/proc.c
+++ b/mrbgems/mruby-proc-ext/src/proc.c
@@ -110,7 +110,7 @@ mrb_proc_parameters(mrb_state *mrb, mrb_value self)
const struct RProc *proc = mrb_proc_ptr(self);
const struct mrb_irep *irep = proc->body.irep;
mrb_aspec aspec;
- mrb_value parameters;
+ mrb_value sname, parameters;
int i, j;
if (MRB_PROC_CFUNC_P(proc)) {
@@ -140,14 +140,17 @@ mrb_proc_parameters(mrb_state *mrb, mrb_value self)
parameters_list[4].size = MRB_ASPEC_BLOCK(aspec);
parameters = mrb_ary_new_capa(mrb, irep->nlocals-1);
+
for (i = 0, p = parameters_list; p->name; p++) {
- mrb_value sname = mrb_symbol_value(mrb_intern_cstr(mrb, p->name));
+ if (p->size <= 0) continue;
+ sname = mrb_symbol_value(mrb_intern_cstr(mrb, p->name));
for (j = 0; j < p->size; i++, j++) {
- mrb_assert(i < (irep->nlocals-1));
- mrb_ary_push(mrb, parameters, mrb_assoc_new(mrb,
- sname,
- mrb_symbol_value(irep->lv[i].name)
- ));
+ mrb_value a = mrb_ary_new(mrb);
+ mrb_ary_push(mrb, a, sname);
+ if (irep->lv[i].name) {
+ mrb_ary_push(mrb, a, mrb_symbol_value(irep->lv[i].name));
+ }
+ mrb_ary_push(mrb, parameters, a);
}
}
return parameters;