summaryrefslogtreecommitdiffhomepage
path: root/src/codegen.c
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-06-11 15:55:04 +0900
committerYukihiro Matsumoto <[email protected]>2012-06-11 15:55:04 +0900
commit13a542d48d5d86b866dbc4d6a4f0ec17bee49c12 (patch)
treeb73deac37c7cedb7f1b718a92ff71f21f97263dc /src/codegen.c
parent8f020f28c6b5b9c64cbd66db8369f89809b20d0a (diff)
downloadmruby-13a542d48d5d86b866dbc4d6a4f0ec17bee49c12.tar.gz
mruby-13a542d48d5d86b866dbc4d6a4f0ec17bee49c12.zip
zsuper should respect block given; close #185
Diffstat (limited to 'src/codegen.c')
-rw-r--r--src/codegen.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/codegen.c b/src/codegen.c
index 117588b6e..105a27cef 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -1280,7 +1280,7 @@ codegen(codegen_scope *s, node *tree, int val)
{
int n = 0;
- push();
+ push(); /* room for receiver */
if (tree) {
node *args = tree->car;
while (args) {
@@ -1307,14 +1307,19 @@ codegen(codegen_scope *s, node *tree, int val)
codegen_scope *s2 = s;
int lv = 0, ainfo = 0;
+ push(); /* room for receiver */
while (s2->ainfo < 0) {
lv++;
s2 = s2->prev;
if (!s2) break;
}
if (s2) ainfo = s2->ainfo;
- push();
genop(s, MKOP_ABx(OP_ARGARY, cursp(), (ainfo<<4)|(lv & 0xf)));
+ if (tree && tree->cdr) {
+ push();
+ codegen(s, tree->cdr, VAL);
+ pop_n(2);
+ }
pop();
genop(s, MKOP_ABC(OP_SUPER, cursp(), 0, CALL_MAXARGS));
if (val) push();