summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-10-13 07:06:17 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2021-10-13 07:06:17 +0900
commit6b3b1012ca480f1e930c4ddeeaebed55e5df4144 (patch)
treee23b66c57a3802b3178ce45377c6e708cdba7aaf
parenta1027812bd2b7b8032922dcfc70155d5a7b97e29 (diff)
downloadmruby-6b3b1012ca480f1e930c4ddeeaebed55e5df4144.tar.gz
mruby-6b3b1012ca480f1e930c4ddeeaebed55e5df4144.zip
codegen.c: skip `OP_ARGARY` before `super` if the method has no arguments.
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c34
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);