EXPRESSION *atomise_expression(MODULE *module, FUNCTION *func, BLOCK *block, EXPRESSION *expr, STATEMENT *before) { if (is_atomic(expr)) return expr; if (tree_is_type(expr, EXPR_TUPLE)) { EXPRESSION *new_temp = make_empty_tuple(CAST_TO_AST(expr)->source_line); int i; for (i = 0; i < tree_num_children(expr); i++) tree_add_child(new_temp, atomise_expression(module, func, block, tree_get_child(expr, i), before)); return new_temp; } EXPRESSION *new_temp = make_new_temp(module, func, expr->type, CAST_TO_AST(expr)->source_line); STATEMENT *new_assign = make_assignment(new_temp, expr, CAST_TO_AST(expr)->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)); return new_temp; }
EXPRESSION *get_input_tuple(FUNCTION *func) { int source_line = CAST_TO_AST(func)->source_line; EXPRESSION *tuple = create_ast_node(EXPR_TUPLE, source_line); DECLARATION *args = tree_get_child(func, 1); if (!args) return make_empty_tuple(source_line); int i; for (i = 0; i < tree_num_children(args); i++) { DECLARATION *v = tree_get_child(args, i); EXPRESSION *arg = make_variable(v->name, CAST_TO_AST(v)->source_line); arg->type = v->type; ((VARIABLE *) arg)->decl = v; tree_add_child(tuple, arg); } if (tree_num_children(tuple) == 1) return tree_get_child(tuple, 0); return tuple; }
inline type make_tuple() { return make_empty_tuple(); }