diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-09-24 11:36:27 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-09-24 11:36:27 +0900 |
| commit | 863671c89f4450c7bccad69a88f2ca0a8859693a (patch) | |
| tree | 713f08c6cd6d19a6d1f01b74b594bed2482616bf /mrbgems/mruby-compiler/core/codegen.c | |
| parent | a844f8965584c0737c436cfaf98bdccdf8d8b39e (diff) | |
| download | mruby-863671c89f4450c7bccad69a88f2ca0a8859693a.tar.gz mruby-863671c89f4450c7bccad69a88f2ca0a8859693a.zip | |
codegen.c: refactor `NODE_IF` generation for boolean constants.
In addition, add `NODE_SYM` for always true expression.
Diffstat (limited to 'mrbgems/mruby-compiler/core/codegen.c')
| -rw-r--r-- | mrbgems/mruby-compiler/core/codegen.c | 53 |
1 files changed, 37 insertions, 16 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index 3e9a153c2..7b636650c 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -1942,6 +1942,32 @@ gen_retval(codegen_scope *s, node *tree) } } +static mrb_bool +true_always(node *tree) +{ + switch (nint(tree->car)) { + case NODE_TRUE: + case NODE_INT: + case NODE_STR: + case NODE_SYM: + return TRUE; + default: + return FALSE; + } +} + +static mrb_bool +false_always(node *tree) +{ + switch (nint(tree->car)) { + case NODE_FALSE: + case NODE_NIL: + return TRUE; + default: + return FALSE; + } +} + static void codegen(codegen_scope *s, node *tree, int val) { @@ -2133,27 +2159,22 @@ codegen(codegen_scope *s, node *tree, int val) codegen(s, elsepart, val); goto exit; } - switch (nint(tree->car->car)) { - case NODE_TRUE: - case NODE_INT: - case NODE_STR: + if (true_always(tree->car)) { codegen(s, tree->cdr->car, val); goto exit; - case NODE_FALSE: - case NODE_NIL: + } + if (false_always(tree->car)) { codegen(s, elsepart, val); goto exit; - case NODE_CALL: - { - node *n = tree->car->cdr; - mrb_sym mid = nsym(n->cdr->car); - mrb_sym mnil = MRB_SYM_Q_2(s->mrb, nil); - if (mid == mnil && n->cdr->cdr->car == NULL) { - nil_p = TRUE; - codegen(s, n->car, VAL); - } + } + if (nint(tree->car->car) == NODE_CALL) { + node *n = tree->car->cdr; + mrb_sym mid = nsym(n->cdr->car); + mrb_sym sym_nil_p = MRB_SYM_Q_2(s->mrb, nil); + if (mid == sym_nil_p && n->cdr->cdr->car == NULL) { + nil_p = TRUE; + codegen(s, n->car, VAL); } - break; } if (!nil_p) { codegen(s, tree->car, VAL); |
