int dummy() { if (make_test()) { return CODE_ONE; } else { return CODE_TWO; } }
int main() { my_function( 1, 2 ); make_test( 42 ); }
/*----------------------------------------------------------------------------*/ YT_PLOT * make_plot_test_3 () { YT_PLOT *plot = make_test (10, 100, 0, 2*G_PI); // начальная инициация (обнуление) списка фреймов: plot_frames_init0 (plot); // в 1-м фрейме: plot->fr[0][0] = 0/*fi*/; // "Sinus" plot->fr[0][1] = 1/*fi*/; // "Cosin" // во 2-м фрейме: plot->fr[1][0] = 0/*fi*/; // "Sinus" return (plot); }
static EXPRESSION *simplify_expression(MODULE *module, FUNCTION *func, BLOCK *block, EXPRESSION *expr, STATEMENT *before) { int i; int source_line = CAST_TO_AST(expr)->source_line; if (!has_graph(func) && is_short_circuit(expr)) { TYPE *new_temp_type = CAST_TO_EXPRESSION(tree_get_child(expr, 0))->type; EXPRESSION *new_temp = make_new_temp(module, func, new_temp_type, source_line); STATEMENT *new_assign = make_assignment(new_temp, tree_get_child(expr, 0), source_line); tree_add_before(CAST_TO_NODE(block), CAST_TO_NODE(new_assign), CAST_TO_NODE(before)); STATEMENT *new_assign2 = make_assignment(new_temp, tree_get_child(expr, 1), source_line); EXPRESSION *new_cond = new_temp; if (tree_is_type(expr, EXPR_OR)) new_cond = make_unary_expression(EXPR_NOT, new_cond, source_line); STATEMENT *new_if = make_if(new_cond, make_block(NULL, new_assign2, 0), NULL, 0); tree_add_before(CAST_TO_NODE(block), CAST_TO_NODE(new_if), CAST_TO_NODE(before)); return new_temp; } if (has_graph(func) && is_short_circuit(expr)) { GRAPH *graph = func->graph; EXPRESSION *sub0 = tree_get_child(expr, 0); EXPRESSION *sub1 = tree_get_child(expr, 1); STATEMENT *new_test = make_test(sub0, source_line); EDGE_TYPE inner_type = tree_is_type(expr, EXPR_OR) ? EDGE_NO : EDGE_YES; EDGE_TYPE outer_type = tree_is_type(expr, EXPR_OR) ? EDGE_YES : EDGE_NO; add_vertex(graph, CAST_TO_NODE(new_test)); HASH *subhash = get_from_hash(graph->forward, before, sizeof(void *)); HASH_ITERATOR iter; for (hash_iterator(subhash, &iter); hash_iterator_valid(&iter); hash_iterator_next(&iter)) { EDGE_TYPE type = (EDGE_TYPE) iter.entry->data; if (outer_type & type) add_edge(graph, CAST_TO_NODE(new_test), iter.entry->key, type); if (inner_type & type) inner_type = type; } inject_before(graph, CAST_TO_NODE(new_test), CAST_TO_NODE(before), inner_type); return sub1; } if (is_simple(expr)) return expr; if (tree_is_type(expr, EXPR_CALL)) { EXPRESSION *args = CAST_TO_EXPRESSION(tree_get_child(expr, 1)); args = atomise_expression(module, func, block, args, before); tree_get_child(expr, 1) = args; return expr; } for (i = 0; i < tree_num_children(expr); i++) { EXPRESSION *child = tree_get_child(expr, i); if (!is_atomic(child)) { TYPE *new_temp_type = CAST_TO_EXPRESSION(child)->type; EXPRESSION *new_temp = make_new_temp(module, func, new_temp_type, CAST_TO_AST(child)->source_line); STATEMENT *new_assign = make_assignment(new_temp, child, CAST_TO_AST(child)->source_line); if (has_graph(func)) { GRAPH *graph = func->graph; add_vertex(graph, CAST_TO_NODE(new_assign)); inject_before(graph, CAST_TO_NODE(new_assign), CAST_TO_NODE(before), 0); } else tree_add_before(CAST_TO_NODE(block), CAST_TO_NODE(new_assign), CAST_TO_NODE(before)); tree_get_child(expr, i) = new_temp; } } return expr; }