summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-04-27 09:22:35 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-04-27 09:22:35 +0900
commitbbc237044d0fb1792dff8c5d2466f4e644821239 (patch)
treea8481231d1fe17d1ac09251b8e75bae34ddf6001
parent26758d89bd1bd05b5fbf2ac38a26aaf88009b57b (diff)
downloadmruby-bbc237044d0fb1792dff8c5d2466f4e644821239.tar.gz
mruby-bbc237044d0fb1792dff8c5d2466f4e644821239.zip
NODE_SUPER should preserve stack region for block; ref #2136
-rw-r--r--src/codegen.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/src/codegen.c b/src/codegen.c
index 6c2ed41c9..0cecc8d28 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -1688,6 +1688,7 @@ codegen(codegen_scope *s, node *tree, int val)
}
else {
genop(s, MKOP_A(OP_LOADNIL, cursp()));
+ push(); pop();
}
pop_n(n+1);
if (sendv) n = CALL_MAXARGS;
@@ -1709,12 +1710,12 @@ codegen(codegen_scope *s, node *tree, int val)
}
if (s2) ainfo = s2->ainfo;
genop(s, MKOP_ABx(OP_ARGARY, cursp(), (ainfo<<4)|(lv & 0xf)));
+ push(); push(); pop(); /* ARGARY pushes two values */
if (tree && tree->cdr) {
- push();
codegen(s, tree->cdr, VAL);
- pop_n(2);
+ pop();
}
- pop();
+ pop(); pop();
genop(s, MKOP_ABC(OP_SUPER, cursp(), 0, CALL_MAXARGS));
if (val) push();
}