summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-compiler/core/codegen.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-09-24 11:38:02 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2021-09-24 11:38:02 +0900
commit7c6c4ebb56a17c291806c7961f6ca2abc7da4546 (patch)
treec5bf3621df46e4b7162136028226ae3d03281517 /mrbgems/mruby-compiler/core/codegen.c
parent863671c89f4450c7bccad69a88f2ca0a8859693a (diff)
downloadmruby-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.c16
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);