summaryrefslogtreecommitdiffhomepage
path: root/src/codegen.c
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-07-16 11:54:35 +0900
committerYukihiro Matsumoto <[email protected]>2012-07-16 11:54:35 +0900
commit49cac5f97db1398776e99573a62a300e3ab12ce7 (patch)
tree59de07b364c12f040ee348d275ee2be5272af289 /src/codegen.c
parenta9247f723abf401fcf940fffaa984b516cc61052 (diff)
downloadmruby-49cac5f97db1398776e99573a62a300e3ab12ce7.tar.gz
mruby-49cac5f97db1398776e99573a62a300e3ab12ce7.zip
case should care about return value; close #372
Diffstat (limited to 'src/codegen.c')
-rw-r--r--src/codegen.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/src/codegen.c b/src/codegen.c
index 9166b7144..daa521130 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -479,10 +479,10 @@ lambda_body(codegen_scope *s, node *tree, int blk)
pos = new_label(s);
for (i=0; i<oa; i++) {
new_label(s);
- genop(s, MKOP_Ax(OP_JMP, 0));
+ genop(s, MKOP_sBx(OP_JMP, 0));
}
if (oa > 0) {
- genop(s, MKOP_Ax(OP_JMP, 0));
+ genop(s, MKOP_sBx(OP_JMP, 0));
}
opt = tree->car->cdr->car;
i = 0;
@@ -1086,21 +1086,23 @@ codegen(codegen_scope *s, node *tree, int val)
}
if (tree->car->car) {
pos1 = new_label(s);
- genop(s, MKOP_AsBx(OP_JMP, cursp(), 0));
+ genop(s, MKOP_sBx(OP_JMP, 0));
dispatch_linked(s, pos2);
}
- pop(); pop();
+ pop();
codegen(s, tree->car->cdr, val);
+ pop();
tmp = new_label(s);
- genop(s, MKOP_AsBx(OP_JMP, cursp(), pos3));
+ genop(s, MKOP_sBx(OP_JMP, pos3));
pos3 = tmp;
if (pos1) dispatch(s, pos1);
tree = tree->cdr;
- push(); push();
+ push();
}
pop();
- if (pos3) dispatch_linked(s, pos3);
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
if (val) push();
+ if (pos3) dispatch_linked(s, pos3);
}
break;