diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-09-24 11:38:02 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-09-24 11:38:02 +0900 |
| commit | 7c6c4ebb56a17c291806c7961f6ca2abc7da4546 (patch) | |
| tree | c5bf3621df46e4b7162136028226ae3d03281517 /mrbgems/mruby-compiler/core/codegen.c | |
| parent | 863671c89f4450c7bccad69a88f2ca0a8859693a (diff) | |
| download | mruby-7c6c4ebb56a17c291806c7961f6ca2abc7da4546.tar.gz mruby-7c6c4ebb56a17c291806c7961f6ca2abc7da4546.zip | |
codegen.c: add short circuit constant folding for `NODE_AND`, `NODE_OR`.
Diffstat (limited to 'mrbgems/mruby-compiler/core/codegen.c')
| -rw-r--r-- | mrbgems/mruby-compiler/core/codegen.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index 7b636650c..24d23c1be 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -2224,6 +2224,14 @@ codegen(codegen_scope *s, node *tree, int val) { uint32_t pos; + if (true_always(tree->car)) { + codegen(s, tree->cdr, val); + goto exit; + } + if (false_always(tree->car)) { + codegen(s, tree->car, val); + goto exit; + } codegen(s, tree->car, VAL); pop(); pos = genjmp2_0(s, OP_JMPNOT, cursp(), val); @@ -2236,6 +2244,14 @@ codegen(codegen_scope *s, node *tree, int val) { uint32_t pos; + if (true_always(tree->car)) { + codegen(s, tree->car, val); + goto exit; + } + if (false_always(tree->car)) { + codegen(s, tree->cdr, val); + goto exit; + } codegen(s, tree->car, VAL); pop(); pos = genjmp2_0(s, OP_JMPIF, cursp(), val); |
