summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c
index d4031f6fd..f4dbe63a1 100644
--- a/mrbgems/mruby-compiler/core/codegen.c
+++ b/mrbgems/mruby-compiler/core/codegen.c
@@ -1578,18 +1578,17 @@ codegen(codegen_scope *s, node *tree, int val)
}
codegen(s, tree->car, VAL);
pop();
- pos1 = genjmp2(s, OP_JMPNOT, cursp(), 0, val);
-
- codegen(s, tree->cdr->car, val);
- if (elsepart) {
- if (val) pop();
- pos2 = genjmp(s, OP_JMP, 0);
- dispatch(s, pos1);
- codegen(s, elsepart, val);
- dispatch(s, pos2);
- }
- else {
- if (val) {
+ if (tree->cdr->car) {
+ pos1 = genjmp2(s, OP_JMPNOT, cursp(), 0, val);
+ codegen(s, tree->cdr->car, val);
+ if (elsepart) {
+ if (val) pop();
+ pos2 = genjmp(s, OP_JMP, 0);
+ dispatch(s, pos1);
+ codegen(s, elsepart, val);
+ dispatch(s, pos2);
+ }
+ else if (val) {
pop();
pos2 = genjmp(s, OP_JMP, 0);
dispatch(s, pos1);
@@ -1601,6 +1600,17 @@ codegen(codegen_scope *s, node *tree, int val)
dispatch(s, pos1);
}
}
+ else { /* empty then-part */
+ if (elsepart) {
+ pos1 = genjmp2(s, OP_JMPIF, cursp(), 0, val);
+ codegen(s, elsepart, val);
+ dispatch(s, pos1);
+ }
+ else if (val) {
+ genop_1(s, OP_LOADNIL, cursp());
+ push();
+ }
+ }
}
break;