From a1a9fc797d140449f7e1b815ecabbb84af7c0ba1 Mon Sep 17 00:00:00 2001 From: "Wolfgang (Blub) Bumiller" Date: Thu, 3 May 2012 22:07:58 +0200 Subject: [PATCH] Same for ternary: reordered a bit, and fixing ontrue->onfalse at the jump back to the merge block --- ast.c | 59 ++++++++++++++++++++++++++++++----------------------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/ast.c b/ast.c index 6a6abe5..de2c315 100644 --- a/ast.c +++ b/ast.c @@ -837,54 +837,55 @@ bool ast_ternary_codegen(ast_ternary *self, ast_function *func, bool lvalue, ir_ return false; /* In the following, contraty to ast_ifthen, we assume both paths exist. */ + + /* generate the condition */ + func->curblock = cond; + cgen = self->cond->expression.codegen; + if (!(*cgen)((ast_expression*)(self->cond), func, false, &condval)) + return false; /* create on-true block */ ontrue = ir_function_create_block(func->ir_func, ast_function_label(func, "tern_T")); if (!ontrue) return false; + else + { + /* enter the block */ + func->curblock = ontrue; + + /* generate */ + cgen = self->on_true->expression.codegen; + if (!(*cgen)((ast_expression*)(self->on_true), func, false, &trueval)) + return false; + } /* create on-false block */ onfalse = ir_function_create_block(func->ir_func, ast_function_label(func, "tern_F")); if (!onfalse) return false; + else + { + /* enter the block */ + func->curblock = onfalse; + + /* generate */ + cgen = self->on_false->expression.codegen; + if (!(*cgen)((ast_expression*)(self->on_false), func, false, &falseval)) + return false; + } + /* create merge block */ merge = ir_function_create_block(func->ir_func, ast_function_label(func, "tern_out")); if (!merge) return NULL; - - /* generate the condition */ - func->curblock = cond; - cgen = self->cond->expression.codegen; - if (!(*cgen)((ast_expression*)(self->cond), func, false, &condval)) - return false; - - if (!ir_block_create_if(cond, condval, ontrue, onfalse)) - return false; - - /* on-true path */ - /* enter the block */ - func->curblock = ontrue; - - /* generate */ - cgen = self->on_true->expression.codegen; - if (!(*cgen)((ast_expression*)(self->on_true), func, false, &trueval)) - return false; - /* jump to merge block */ if (!ir_block_create_jump(ontrue, merge)) return false; - - /* on-false path */ - /* enter the block */ - func->curblock = onfalse; - - /* generate */ - cgen = self->on_false->expression.codegen; - if (!(*cgen)((ast_expression*)(self->on_false), func, false, &falseval)) + if (!ir_block_create_jump(onfalse, merge)) return false; - /* jump to merge block */ - if (!ir_block_create_jump(ontrue, merge)) + /* create if instruction */ + if (!ir_block_create_if(cond, condval, ontrue, onfalse)) return false; /* Now enter the merge block */ -- 2.39.2