summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c
index 026745e39..6ea37f255 100644
--- a/mrbgems/mruby-compiler/core/codegen.c
+++ b/mrbgems/mruby-compiler/core/codegen.c
@@ -1932,6 +1932,7 @@ codegen(codegen_scope *s, node *tree, int val)
{
struct loopinfo *lp = loop_push(s, LOOP_NORMAL);
+ if (!val) lp->acc = -1;
lp->pc0 = new_label(s);
lp->pc1 = genjmp_0(s, OP_JMP);
lp->pc2 = new_label(s);
@@ -1949,6 +1950,7 @@ codegen(codegen_scope *s, node *tree, int val)
{
struct loopinfo *lp = loop_push(s, LOOP_NORMAL);
+ if (!val) lp->acc = -1;
lp->pc0 = new_label(s);
lp->pc1 = genjmp_0(s, OP_JMP);
lp->pc2 = new_label(s);
@@ -3338,11 +3340,16 @@ loop_break(codegen_scope *s, node *tree)
else {
struct loopinfo *loop;
- if (tree) {
- gen_retval(s, tree);
- }
loop = s->loop;
+ if (tree) {
+ if (loop->acc < 0) {
+ codegen(s, tree, NOVAL);
+ }
+ else {
+ gen_retval(s, tree);
+ }
+ }
while (loop) {
if (loop->type == LOOP_BEGIN) {
loop = loop->prev;
@@ -3362,8 +3369,13 @@ loop_break(codegen_scope *s, node *tree)
if (loop->type == LOOP_NORMAL) {
int tmp;
- if (tree) {
- gen_move(s, loop->acc, cursp(), 0);
+ if (loop->acc >= 0) {
+ if (tree) {
+ gen_move(s, loop->acc, cursp(), 0);
+ }
+ else {
+ genop_1(s, OP_LOADNIL, loop->acc);
+ }
}
tmp = genjmp(s, OP_JMPUW, loop->pc3);
loop->pc3 = tmp;