From 2910af0010c90f30906e44a91b24c6bc2c545a7d Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Fri, 23 Jul 2021 15:48:54 +0900 Subject: codegen.c: fixed a bug when value is taken from `while` and `until`. ```ruby p ((while true; p 1; break; end)) ``` should print `1 nil` but was `1`. --- mrbgems/mruby-compiler/core/codegen.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) (limited to 'mrbgems/mruby-compiler/core') 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; -- cgit v1.2.3