diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-07-23 15:48:54 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-07-28 23:08:57 +0900 |
| commit | 2910af0010c90f30906e44a91b24c6bc2c545a7d (patch) | |
| tree | 6812336bebeb4eee9b885f13f6b886e1ed2a4a67 /mrbgems/mruby-compiler/core/codegen.c | |
| parent | 9dd3e23fc9301749b2750dc71235f3ebea449ad3 (diff) | |
| download | mruby-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.c | 22 |
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; |
