diff options
| -rw-r--r-- | mrbgems/mruby-compiler/core/codegen.c | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index b7a9c2666..e7aa9c5b0 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -2853,18 +2853,30 @@ codegen(codegen_scope *s, node *tree, int val) if (s2 && s2->ainfo > 0) { ainfo = s2->ainfo; } - genop_2S(s, OP_ARGARY, cursp(), (ainfo<<4)|(lv & 0xf)); - push(); push(); push(); /* ARGARY pushes 3 values at most */ - pop(); pop(); pop(); - /* keyword arguments */ - if (ainfo & 0x1) { - n |= CALL_MAXARGS<<4; - push(); + if (ainfo > 0) { + genop_2S(s, OP_ARGARY, cursp(), (ainfo<<4)|(lv & 0xf)); + push(); push(); push(); /* ARGARY pushes 3 values at most */ + pop(); pop(); pop(); + /* keyword arguments */ + if (ainfo & 0x1) { + n |= CALL_MAXARGS<<4; + push(); + } + /* block argument */ + if (tree && tree->cdr && tree->cdr->cdr) { + push(); + codegen(s, tree->cdr->cdr, VAL); + } } - /* block argument */ - if (tree && tree->cdr && tree->cdr->cdr) { - push(); - codegen(s, tree->cdr->cdr, VAL); + else { + /* block argument */ + if (tree && tree->cdr && tree->cdr->cdr) { + codegen(s, tree->cdr->cdr, VAL); + } + else { + gen_blkmove(s, 0, lv); + } + n = 0; } s->sp = sp; genop_2(s, OP_SUPER, cursp(), n); |
