Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #3
0
 inline type make_tuple() { return make_empty_tuple(); }