From 6b3b1012ca480f1e930c4ddeeaebed55e5df4144 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 13 Oct 2021 07:06:17 +0900 Subject: codegen.c: skip `OP_ARGARY` before `super` if the method has no arguments. --- mrbgems/mruby-compiler/core/codegen.c | 34 +++++++++++++++++++++++----------- 1 file 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); -- cgit v1.2.3