summaryrefslogtreecommitdiffhomepage
path: root/mrbgems
diff options
context:
space:
mode:
Diffstat (limited to 'mrbgems')
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c53
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);