summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-compiler/core/codegen.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-07-23 15:48:54 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2021-07-28 23:08:57 +0900
commit2910af0010c90f30906e44a91b24c6bc2c545a7d (patch)
tree6812336bebeb4eee9b885f13f6b886e1ed2a4a67 /mrbgems/mruby-compiler/core/codegen.c
parent9dd3e23fc9301749b2750dc71235f3ebea449ad3 (diff)
downloadmruby-2910af0010c90f30906e44a91b24c6bc2c545a7d.tar.gz
mruby-2910af0010c90f30906e44a91b24c6bc2c545a7d.zip
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`.
Diffstat (limited to 'mrbgems/mruby-compiler/core/codegen.c')
-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;