CodeLabelSymbol *ProcedureWalker::create_new_label() { CodeLabelSymbol *label = new_anonymous_label(get_symbol_table()); return label; }
Statement* if_statement_walker::dismantle_if_statement(IfStatement* the_if){ Statement *result = 0; ProcedureDefinition* proc_def = get_procedure_definition(the_if); Expression *condition = the_if->get_condition(); // we are going to reuse the condition so we must remove it // from the if statement first to avoid ownership conflicts remove_suif_object(condition); // the_if->set_condition(SourceOp()); // remove_source_op(condition); Statement *then_part = the_if->get_then_part(); Statement *else_part = the_if->get_else_part(); // likewise of these parts - remove from if. the_if->set_then_part(0); the_if->set_else_part(0); remove_suif_object(then_part); remove_suif_object(else_part); if (then_part != 0) { StatementList *replacement = create_statement_list( the_if->get_suif_env() ); result = replacement; UnaryExpression* negated_condition = create_unary_expression( the_if->get_suif_env(), condition->get_result_type(), k_logical_not, condition ); if (else_part != 0) { CodeLabelSymbol *else_label = new_anonymous_label(proc_def->get_symbol_table()); CodeLabelSymbol *done_label = new_anonymous_label(proc_def->get_symbol_table()); replacement->append_statement(create_branch_statement(the_if->get_suif_env(), negated_condition, else_label)); replacement->append_statement(then_part); replacement->append_statement(create_jump_statement(the_if->get_suif_env(),done_label)); replacement->append_statement(create_label_location_statement(the_if->get_suif_env(), else_label)); replacement->append_statement(else_part); replacement->append_statement(create_label_location_statement(the_if->get_suif_env(), done_label)); } else { CodeLabelSymbol *done_label = create_new_label(get_procedure_definition(the_if)); replacement-> append_statement(create_branch_statement(the_if->get_suif_env(), negated_condition, done_label)); replacement->append_statement(then_part); replacement-> append_statement(create_label_location_statement(the_if->get_suif_env(), done_label)); } } else { if (else_part != 0) { StatementList *replacement = create_statement_list(the_if->get_suif_env()); result = replacement; CodeLabelSymbol *done_label = create_new_label(proc_def); replacement->append_statement(create_branch_statement(the_if->get_suif_env(), condition, done_label)); replacement->append_statement(else_part); replacement-> append_statement(create_label_location_statement(the_if->get_suif_env(), done_label)); } else { EvalStatement *replacement = create_eval_statement(the_if->get_suif_env()); result = replacement; replacement->append_expression(condition); } } the_if->get_parent()->replace(the_if, result); return result; }
CodeLabelSymbol *ProcedureWalker::create_new_label(ProcedureDefinition* proc_def) { CodeLabelSymbol *label = new_anonymous_label(proc_def->get_symbol_table()); return label; }