diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2019-08-17 12:29:04 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2019-08-17 12:29:04 +0900 |
| commit | 13eaff4f9f20955441612fd605ae1932039ec03e (patch) | |
| tree | 5dc79c0796fe381827e698d508426d46c115ed93 | |
| parent | e76c5aad3600a669583d5197783fd89de64f0378 (diff) | |
| download | mruby-13eaff4f9f20955441612fd605ae1932039ec03e.tar.gz mruby-13eaff4f9f20955441612fd605ae1932039ec03e.zip | |
Remove unnecessary `OP_JMPNOT` for `unless` statement.
| -rw-r--r-- | mrbgems/mruby-compiler/core/codegen.c | 34 |
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; |
