]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Add get_cvalue and set_cvalue helper methods
authorJürg Billeter <j@bitron.ch>
Thu, 26 Aug 2010 10:51:15 +0000 (12:51 +0200)
committerJürg Billeter <j@bitron.ch>
Sat, 9 Oct 2010 12:33:35 +0000 (14:33 +0200)
26 files changed:
codegen/valaccodearraymodule.vala
codegen/valaccodeassignmentmodule.vala
codegen/valaccodebasemodule.vala
codegen/valaccodecontrolflowmodule.vala
codegen/valaccodememberaccessmodule.vala
codegen/valaccodemethodcallmodule.vala
codegen/valaccodemethodmodule.vala
codegen/valaccodestructmodule.vala
codegen/valadbusclientmodule.vala
codegen/valadbusservermodule.vala
codegen/valadovaarraymodule.vala
codegen/valadovaassignmentmodule.vala
codegen/valadovabasemodule.vala
codegen/valadovacontrolflowmodule.vala
codegen/valadovaerrormodule.vala
codegen/valadovamemberaccessmodule.vala
codegen/valadovamethodcallmodule.vala
codegen/valadovaobjectmodule.vala
codegen/valadovavaluemodule.vala
codegen/valagasyncmodule.vala
codegen/valagdbusclientmodule.vala
codegen/valagdbusservermodule.vala
codegen/valagerrormodule.vala
codegen/valagobjectmodule.vala
codegen/valagsignalmodule.vala
codegen/valagtypemodule.vala

index 255d2eb007fe0e31e996bc385dfb2a6f99c89538..2fb6dc401cb2d059c2008f5b503fbe580a945557 100644 (file)
@@ -32,7 +32,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                        if (rank > 1) {
                                append_initializer_list (ce, name_cnode, (InitializerList) e, rank - 1, ref i);
                        } else {
-                               ce.append_expression (new CCodeAssignment (new CCodeElementAccess (name_cnode, new CCodeConstant (i.to_string ())), (CCodeExpression) e.ccodenode));
+                               ce.append_expression (new CCodeAssignment (new CCodeElementAccess (name_cnode, new CCodeConstant (i.to_string ())), get_cvalue (e)));
                                i++;
                        }
                }
@@ -54,7 +54,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
 
                        ce.append_expression (name_cnode);
 
-                       expr.ccodenode = ce;
+                       set_cvalue (expr, ce);
 
                        return;
                }
@@ -73,12 +73,12 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
 
                // iterate over each dimension
                foreach (Expression size in expr.get_sizes ()) {
-                       CCodeExpression csize = (CCodeExpression) size.ccodenode;
+                       CCodeExpression csize = get_cvalue (size);
 
                        if (!is_pure_ccode_expression (csize)) {
                                var temp_var = get_temp_variable (int_type, false, expr);
                                var name_cnode = get_variable_cexpression (temp_var.name);
-                               size.ccodenode = name_cnode;
+                               set_cvalue (size, name_cnode);
 
                                emit_temp_var (temp_var);
 
@@ -120,9 +120,9 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                        
                        ce.append_expression (name_cnode);
                        
-                       expr.ccodenode = ce;
+                       set_cvalue (expr, ce);
                } else {
-                       expr.ccodenode = gnew;
+                       set_cvalue (expr, gnew);
                }
        }
 
@@ -405,15 +405,15 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                List<Expression> indices = expr.get_indices ();
                int rank = indices.size;
 
-               var ccontainer = (CCodeExpression) expr.container.ccodenode;
-               var cindex = (CCodeExpression) indices[0].ccodenode;
+               var ccontainer = get_cvalue (expr.container);
+               var cindex = get_cvalue (indices[0]);
                if (expr.container.symbol_reference is ArrayLengthField) {
                        /* Figure if cindex is a constant expression and calculate dim...*/
                        var lit = indices[0] as IntegerLiteral;
                        var memberaccess = expr.container as MemberAccess;
                        if (lit != null && memberaccess != null) {
                                int dim = lit.value.to_int ();
-                               expr.ccodenode = get_array_length_cexpression (memberaccess.inner, dim + 1);
+                               set_cvalue (expr, get_array_length_cexpression (memberaccess.inner, dim + 1));
                        } else {
                                Report.error (expr.source_reference, "only integer literals supported as index");
                        }
@@ -421,16 +421,16 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                        // access to element in an array
                        for (int i = 1; i < rank; i++) {
                                var cmul = new CCodeBinaryExpression (CCodeBinaryOperator.MUL, cindex, get_array_length_cexpression (expr.container, i + 1));
-                               cindex = new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, cmul, (CCodeExpression) indices[i].ccodenode);
+                               cindex = new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, cmul, get_cvalue (indices[i]));
                        }
-                       expr.ccodenode = new CCodeElementAccess (ccontainer, cindex);
+                       set_cvalue (expr, new CCodeElementAccess (ccontainer, cindex));
                }
        }
 
        public override void visit_slice_expression (SliceExpression expr) {
-               var ccontainer = (CCodeExpression) expr.container.ccodenode;
-               var cstart = (CCodeExpression) expr.start.ccodenode;
-               var cstop = (CCodeExpression) expr.stop.ccodenode;
+               var ccontainer = get_cvalue (expr.container);
+               var cstart = get_cvalue (expr.start);
+               var cstop = get_cvalue (expr.stop);
 
                var ccomma = new CCodeCommaExpression ();
 
@@ -462,7 +462,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
 
                ccomma.append_expression (get_variable_cexpression (slice_var.name));
 
-               expr.ccodenode = ccomma;
+               set_cvalue (expr, ccomma);
                expr.append_array_size (get_variable_cexpression (len_var.name));
        }
 
@@ -963,12 +963,12 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                var value_param = new FormalParameter ("value", element.target_type);
 
                var ccall = new CCodeFunctionCall (new CCodeIdentifier (generate_array_add_wrapper (array_type)));
-               ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, (CCodeExpression) array.ccodenode));
+               ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_cvalue (array)));
                ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_array_length_cexpression (array)));
                ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_array_size_cexpression (array)));
-               ccall.add_argument (handle_struct_argument (value_param, element, (CCodeExpression) element.ccodenode));
+               ccall.add_argument (handle_struct_argument (value_param, element, get_cvalue (element)));
 
-               assignment.ccodenode = ccall;
+               set_cvalue (assignment, ccall);
 
                var array_var = assignment.left.symbol_reference;
                var array_local = array_var as LocalVariable;
index a403ada796fd016a61c72a41ac9eb2c7fd7b97ad..525c8f6d911f74624ab26eb61c69a4e9776cf842 100644 (file)
@@ -45,7 +45,7 @@ public class Vala.CCodeAssignmentModule : CCodeMemberAccessModule {
                        }
                }
 
-               CCodeExpression cexpr = (CCodeExpression) assignment.right.ccodenode;
+               CCodeExpression cexpr = get_cvalue (assignment.right);
 
                if (!prop.no_accessor_method) {
                        if (prop.property_type.is_real_non_null_struct_type ()) {
@@ -96,7 +96,7 @@ public class Vala.CCodeAssignmentModule : CCodeMemberAccessModule {
        }
 
        CCodeExpression emit_simple_assignment (Assignment assignment) {
-               CCodeExpression rhs = (CCodeExpression) assignment.right.ccodenode;
+               CCodeExpression rhs = get_cvalue (assignment.right);
                CCodeExpression lhs = (CCodeExpression) get_ccodenode (assignment.left);
                CCodeCommaExpression outer_ccomma = null;
 
@@ -205,7 +205,7 @@ public class Vala.CCodeAssignmentModule : CCodeMemberAccessModule {
        }
 
        CCodeExpression emit_fixed_length_array_assignment (Assignment assignment, ArrayType array_type) {
-               CCodeExpression rhs = (CCodeExpression) assignment.right.ccodenode;
+               CCodeExpression rhs = get_cvalue (assignment.right);
                CCodeExpression lhs = (CCodeExpression) get_ccodenode (assignment.left);
 
                cfile.add_include ("string.h");
@@ -230,13 +230,13 @@ public class Vala.CCodeAssignmentModule : CCodeMemberAccessModule {
                }
 
                if (assignment.left.symbol_reference is Property) {
-                       assignment.ccodenode = emit_property_assignment (assignment);
+                       set_cvalue (assignment, emit_property_assignment (assignment));
                } else {
                        var array_type = assignment.left.value_type as ArrayType;
                        if (array_type != null && array_type.fixed_length) {
-                               assignment.ccodenode = emit_fixed_length_array_assignment (assignment, array_type);
+                               set_cvalue (assignment, emit_fixed_length_array_assignment (assignment, array_type));
                        } else {
-                               assignment.ccodenode = emit_simple_assignment (assignment);
+                               set_cvalue (assignment, emit_simple_assignment (assignment));
                        }
                }
        }
index 5c0695698e7eddac87bef02bfd1e0229220464c0..4acbaa1521ca2d5b502bc2be2fa334a5cfb7f20b 100644 (file)
@@ -674,7 +674,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                }
                        } else {
                                ev.value.emit (this);
-                               c_ev = new CCodeEnumValue (ev.get_cname (), (CCodeExpression) ev.value.ccodenode);
+                               c_ev = new CCodeEnumValue (ev.get_cname (), get_cvalue (ev.value));
                        }
                        c_ev.deprecated = ev.deprecated;
                        cenum.add_value (c_ev);
@@ -779,7 +779,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                        arr = "[%d]".printf (initializer_list.size);
                                }
 
-                               var cinitializer = (CCodeExpression) c.value.ccodenode;
+                               var cinitializer = get_cvalue (c.value);
                                if (!definition) {
                                        // never output value in header
                                        // special case needed as this method combines declaration and definition
@@ -795,7 +795,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
 
                                decl_space.add_constant_declaration (cdecl);
                        } else {
-                               var cdefine = new CCodeMacroReplacement.with_expression (c.get_cname (), (CCodeExpression) c.value.ccodenode);
+                               var cdefine = new CCodeMacroReplacement.with_expression (c.get_cname (), get_cvalue (c.value));
                                decl_space.add_type_member_declaration (cdefine);
                        }
                }
@@ -922,7 +922,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
 
                                f.initializer.emit (this);
 
-                               var rhs = (CCodeExpression) f.initializer.ccodenode;
+                               var rhs = get_cvalue (f.initializer);
 
                                ccode.add_expression (new CCodeAssignment (lhs, rhs));
 
@@ -931,7 +931,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                        var array_type = (ArrayType) f.variable_type;
                                        var this_access = new MemberAccess.simple ("this");
                                        this_access.value_type = get_data_type_for_symbol ((TypeSymbol) f.parent_symbol);
-                                       this_access.ccodenode = new CCodeIdentifier ("self");
+                                       set_cvalue (this_access, new CCodeIdentifier ("self"));
                                        var ma = new MemberAccess (this_access, f.name);
                                        ma.symbol_reference = f;
                                        
@@ -939,7 +939,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                        for (int dim = 1; dim <= array_type.rank; dim++) {
                                                var array_len_lhs = get_array_length_cexpression (ma, dim);
                                                var size = sizes[dim - 1];
-                                               ccode.add_expression (new CCodeAssignment (array_len_lhs, (CCodeExpression) size.ccodenode));
+                                               ccode.add_expression (new CCodeAssignment (array_len_lhs, get_cvalue (size)));
                                        }
 
                                        if (array_type.rank == 1 && f.is_internal_symbol ()) {
@@ -969,9 +969,9 @@ public class Vala.CCodeBaseModule : CodeGenerator {
 
                                var field_st = f.parent_symbol as Struct;
                                if (field_st != null && !field_st.is_simple_type ()) {
-                                       this_access.ccodenode = new CCodeIdentifier ("(*self)");
+                                       set_cvalue (this_access, new CCodeIdentifier ("(*self)"));
                                } else {
-                                       this_access.ccodenode = new CCodeIdentifier ("self");
+                                       set_cvalue (this_access, new CCodeIdentifier ("self"));
                                }
 
                                var ma = new MemberAccess (this_access, f.name);
@@ -1001,7 +1001,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
 
                                f.initializer.emit (this);
 
-                               var rhs = (CCodeExpression) f.initializer.ccodenode;
+                               var rhs = get_cvalue (f.initializer);
 
                                ccode.add_expression (new CCodeAssignment (lhs, rhs));
 
@@ -1040,7 +1040,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        if (f.initializer != null) {
                                f.initializer.emit (this);
 
-                               var init = (CCodeExpression) f.initializer.ccodenode;
+                               var init = get_cvalue (f.initializer);
                                if (is_constant_ccode_expression (init)) {
                                        var_decl.initializer = init;
                                }
@@ -1111,7 +1111,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        }
 
                        if (f.initializer != null) {
-                               var rhs = (CCodeExpression) f.initializer.ccodenode;
+                               var rhs = get_cvalue (f.initializer);
                                if (!is_constant_ccode_expression (rhs)) {
                                        if (f.parent_symbol is Class) {
                                                if (f.initializer is InitializerList) {
@@ -1139,7 +1139,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                                        for (int dim = 1; dim <= array_type.rank; dim++) {
                                                                var array_len_lhs = get_array_length_cexpression (ma, dim);
                                                                var size = sizes[dim - 1];
-                                                               ccode.add_expression (new CCodeAssignment (array_len_lhs, (CCodeExpression) size.ccodenode));
+                                                               ccode.add_expression (new CCodeAssignment (array_len_lhs, get_cvalue (size)));
                                                        }
                                                }
                                        } else {
@@ -1969,12 +1969,12 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                }
        
                CCodeExpression rhs = null;
-               if (local.initializer != null && local.initializer.ccodenode != null) {
+               if (local.initializer != null && get_cvalue (local.initializer) != null) {
                        var ma = new MemberAccess.simple (local.name);
                        ma.symbol_reference = local;
                        ma.value_type = local.variable_type.copy ();
 
-                       rhs = (CCodeExpression) local.initializer.ccodenode;
+                       rhs = get_cvalue (local.initializer);
 
                        if (local.variable_type is ArrayType) {
                                var array_type = (ArrayType) local.variable_type;
@@ -2122,7 +2122,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
 
                                var ccopy = new CCodeFunctionCall (new CCodeIdentifier ("memcpy"));
                                ccopy.add_argument (get_variable_cexpression (local.name));
-                               ccopy.add_argument ((CCodeExpression) local.initializer.ccodenode);
+                               ccopy.add_argument (get_cvalue (local.initializer));
                                ccopy.add_argument (size);
                                ccode.add_expression (ccopy);
                        }
@@ -2155,7 +2155,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                                }
                                        }
 
-                                       var cexpr = (CCodeExpression) expr.ccodenode;
+                                       var cexpr = get_cvalue (expr);
 
                                        string ctype = field.get_ctype ();
                                        if (ctype != null) {
@@ -2165,7 +2165,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                        clist.append (cexpr);
                                }
 
-                               list.ccodenode = clist;
+                               set_cvalue (list, clist);
                        } else {
                                // used as expression
                                var temp_decl = get_temp_variable (list.target_type, false, list);
@@ -2187,7 +2187,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                                }
                                        }
 
-                                       var cexpr = (CCodeExpression) expr.ccodenode;
+                                       var cexpr = get_cvalue (expr);
 
                                        string ctype = field.get_ctype ();
                                        if (ctype != null) {
@@ -2199,14 +2199,14 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                }
 
                                ccomma.append_expression (instance);
-                               list.ccodenode = ccomma;
+                               set_cvalue (list, ccomma);
                        }
                } else {
                        var clist = new CCodeInitializerList ();
                        foreach (Expression expr in list.get_initializers ()) {
-                               clist.append ((CCodeExpression) expr.ccodenode);
+                               clist.append (get_cvalue (expr));
                        }
-                       list.ccodenode = clist;
+                       set_cvalue (list, clist);
                }
        }
 
@@ -3006,7 +3006,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
 
                var local_decl = expr.parent_node as LocalVariable;
                if (local_decl != null && has_simple_struct_initializer (local_decl)) {
-                       expr_list.append_expression ((CCodeExpression) expr.ccodenode);
+                       expr_list.append_expression (get_cvalue (expr));
                } else {
                        var expr_type = expr.value_type;
                        if (expr.target_type != null) {
@@ -3016,7 +3016,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        full_expr_var = get_temp_variable (expr_type, true, expr, false);
                        emit_temp_var (full_expr_var);
                
-                       expr_list.append_expression (new CCodeAssignment (get_variable_cexpression (full_expr_var.name), (CCodeExpression) expr.ccodenode));
+                       expr_list.append_expression (new CCodeAssignment (get_variable_cexpression (full_expr_var.name), get_cvalue (expr)));
                }
                
                foreach (LocalVariable local in temp_ref_vars) {
@@ -3030,7 +3030,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        expr_list.append_expression (get_variable_cexpression (full_expr_var.name));
                }
 
-               expr.ccodenode = expr_list;
+               set_cvalue (expr, expr_list);
                
                temp_ref_vars.clear ();
        }
@@ -3095,7 +3095,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        return;
                }
 
-               ccode.add_expression ((CCodeExpression) stmt.expression.ccodenode);
+               ccode.add_expression (get_cvalue (stmt.expression));
 
                /* free temporary objects and handle errors */
 
@@ -3238,7 +3238,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        var return_expr_decl = get_temp_variable (stmt.return_expression.value_type, true, stmt, false);
 
                        var ccomma = new CCodeCommaExpression ();
-                       ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (return_expr_decl.name), (CCodeExpression) stmt.return_expression.ccodenode));
+                       ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (return_expr_decl.name), get_cvalue (stmt.return_expression)));
 
                        var array_type = (ArrayType) current_return_type;
 
@@ -3253,7 +3253,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
 
                        ccomma.append_expression (get_variable_cexpression (return_expr_decl.name));
 
-                       stmt.return_expression.ccodenode = ccomma;
+                       set_cvalue (stmt.return_expression, ccomma);
                        emit_temp_var (return_expr_decl);
                } else if ((current_method != null || current_property_accessor != null) && current_return_type is DelegateType) {
                        var delegate_type = (DelegateType) current_return_type;
@@ -3261,7 +3261,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                var return_expr_decl = get_temp_variable (stmt.return_expression.value_type, true, stmt, false);
 
                                var ccomma = new CCodeCommaExpression ();
-                               ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (return_expr_decl.name), (CCodeExpression) stmt.return_expression.ccodenode));
+                               ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (return_expr_decl.name), get_cvalue (stmt.return_expression)));
 
                                var target_l = get_result_cexpression (get_delegate_target_cname ("result"));
                                if (current_method == null || !current_method.coroutine) {
@@ -3280,7 +3280,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
 
                                ccomma.append_expression (get_variable_cexpression (return_expr_decl.name));
 
-                               stmt.return_expression.ccodenode = ccomma;
+                               set_cvalue (stmt.return_expression, ccomma);
                                emit_temp_var (return_expr_decl);
                        }
                }
@@ -3291,7 +3291,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        if (current_return_type.is_real_non_null_struct_type () && (current_method == null || !current_method.coroutine)) {
                                result_lhs = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, result_lhs);
                        }
-                       ccode.add_expression (new CCodeAssignment (result_lhs, (CCodeExpression) stmt.return_expression.ccodenode));
+                       ccode.add_expression (new CCodeAssignment (result_lhs, get_cvalue (stmt.return_expression)));
                }
 
                // free local variables
@@ -3333,9 +3333,9 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        if (inner_node  == null) {
                                l = new CCodeIdentifier ("self");
                        } else if (resource.symbol_reference.parent_symbol != current_type_symbol) {
-                               l = generate_instance_cast ((CCodeExpression) inner_node.ccodenode, parent);
+                               l = generate_instance_cast (get_cvalue (inner_node), parent);
                        } else {
-                               l = (CCodeExpression) inner_node.ccodenode;
+                               l = get_cvalue (inner_node);
                        }
 
                        l = new CCodeMemberAccess.pointer (new CCodeMemberAccess.pointer (l, "priv"), get_symbol_lock_name (resource.symbol_reference.name));
@@ -3388,28 +3388,28 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                }
 
                var ccall = new CCodeFunctionCall (get_destroy_func_expression (type));
-               ccall.add_argument ((CCodeExpression) stmt.expression.ccodenode);
+               ccall.add_argument (get_cvalue (stmt.expression));
                ccode.add_expression (ccall);
        }
 
        public override void visit_expression (Expression expr) {
-               if (expr.ccodenode != null && !expr.lvalue) {
+               if (get_cvalue (expr) != null && !expr.lvalue) {
                        if (expr.formal_value_type is GenericType && !(expr.value_type is GenericType)) {
                                var st = expr.formal_value_type.type_parameter.parent_symbol.parent_symbol as Struct;
                                if (expr.formal_value_type.type_parameter.parent_symbol != garray_type &&
                                    (st == null || st.get_cname () != "va_list")) {
                                        // GArray and va_list don't use pointer-based generics
-                                       expr.ccodenode = convert_from_generic_pointer ((CCodeExpression) expr.ccodenode, expr.value_type);
+                                       set_cvalue (expr, convert_from_generic_pointer (get_cvalue (expr), expr.value_type));
                                }
                        }
 
                        // memory management, implicit casts, and boxing/unboxing
-                       expr.ccodenode = transform_expression ((CCodeExpression) expr.ccodenode, expr.value_type, expr.target_type, expr);
+                       set_cvalue (expr, transform_expression (get_cvalue (expr), expr.value_type, expr.target_type, expr));
 
                        if (expr.formal_target_type is GenericType && !(expr.target_type is GenericType)) {
                                if (expr.formal_target_type.type_parameter.parent_symbol != garray_type) {
                                        // GArray doesn't use pointer-based generics
-                                       expr.ccodenode = convert_to_generic_pointer ((CCodeExpression) expr.ccodenode, expr.target_type);
+                                       set_cvalue (expr, convert_to_generic_pointer (get_cvalue (expr), expr.target_type));
                                }
                        }
                }
@@ -3417,23 +3417,23 @@ public class Vala.CCodeBaseModule : CodeGenerator {
 
        public override void visit_boolean_literal (BooleanLiteral expr) {
                if (context.profile == Profile.GOBJECT) {
-                       expr.ccodenode = new CCodeConstant (expr.value ? "TRUE" : "FALSE");
+                       set_cvalue (expr, new CCodeConstant (expr.value ? "TRUE" : "FALSE"));
                } else {
                        cfile.add_include ("stdbool.h");
-                       expr.ccodenode = new CCodeConstant (expr.value ? "true" : "false");
+                       set_cvalue (expr, new CCodeConstant (expr.value ? "true" : "false"));
                }
        }
 
        public override void visit_character_literal (CharacterLiteral expr) {
                if (expr.get_char () >= 0x20 && expr.get_char () < 0x80) {
-                       expr.ccodenode = new CCodeConstant (expr.value);
+                       set_cvalue (expr, new CCodeConstant (expr.value));
                } else {
-                       expr.ccodenode = new CCodeConstant ("%uU".printf (expr.get_char ()));
+                       set_cvalue (expr, new CCodeConstant ("%uU".printf (expr.get_char ())));
                }
        }
 
        public override void visit_integer_literal (IntegerLiteral expr) {
-               expr.ccodenode = new CCodeConstant (expr.value + expr.type_suffix);
+               set_cvalue (expr, new CCodeConstant (expr.value + expr.type_suffix));
        }
 
        public override void visit_real_literal (RealLiteral expr) {
@@ -3450,11 +3450,11 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                c_literal += ".";
                        }
                }
-               expr.ccodenode = new CCodeConstant (c_literal);
+               set_cvalue (expr, new CCodeConstant (c_literal));
        }
 
        public override void visit_string_literal (StringLiteral expr) {
-               expr.ccodenode = new CCodeConstant.string (expr.value.replace ("\n", "\\n"));
+               set_cvalue (expr, new CCodeConstant.string (expr.value.replace ("\n", "\\n")));
        }
 
        public override void visit_regex_literal (RegexLiteral expr) {
@@ -3520,14 +3520,14 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                var regex_const = new CCodeConstant ("_thread_safe_regex_init (&%s, \"%s\", %s)".printf (cname, re, flags));
 
                cfile.add_constant_declaration (cdecl);
-               expr.ccodenode = regex_const;
+               set_cvalue (expr, regex_const);
        }
 
        public override void visit_null_literal (NullLiteral expr) {
                if (context.profile != Profile.GOBJECT) {
                        cfile.add_include ("stddef.h");
                }
-               expr.ccodenode = new CCodeConstant ("NULL");
+               set_cvalue (expr, new CCodeConstant ("NULL"));
        }
 
        public virtual string get_delegate_target_cname (string delegate_cname) {
@@ -3551,7 +3551,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        this_access = new CCodeIdentifier ("self");
                }
 
-               expr.ccodenode = generate_instance_cast (this_access, expr.value_type.data_type);
+               set_cvalue (expr, generate_instance_cast (this_access, expr.value_type.data_type));
        }
 
        public override void visit_postfix_expression (PostfixExpression expr) {
@@ -3565,7 +3565,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        // assign current value to temp variable
                        var temp_decl = get_temp_variable (prop.property_type, true, expr, false);
                        emit_temp_var (temp_decl);
-                       ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_decl.name), (CCodeExpression) expr.inner.ccodenode));
+                       ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_decl.name), get_cvalue (expr.inner)));
                        
                        // increment/decrement property
                        var op = expr.increment ? CCodeBinaryOperator.PLUS : CCodeBinaryOperator.MINUS;
@@ -3576,13 +3576,13 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        // return previous value
                        ccomma.append_expression (get_variable_cexpression (temp_decl.name));
                        
-                       expr.ccodenode = ccomma;
+                       set_cvalue (expr, ccomma);
                        return;
                }
        
                var op = expr.increment ? CCodeUnaryOperator.POSTFIX_INCREMENT : CCodeUnaryOperator.POSTFIX_DECREMENT;
        
-               expr.ccodenode = new CCodeUnaryExpression (op, (CCodeExpression) expr.inner.ccodenode);
+               set_cvalue (expr, new CCodeUnaryExpression (op, get_cvalue (expr.inner)));
        }
        
        private MemberAccess? find_property_access (Expression expr) {
@@ -3770,7 +3770,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                if (!(expression_type is ArrayType) && expr != null && expr.is_non_null ()
                    && !is_ref_function_void (expression_type)) {
                        // expression is non-null
-                       ccall.add_argument ((CCodeExpression) expr.ccodenode);
+                       ccall.add_argument (get_cvalue (expr));
                        
                        return ccall;
                } else {
@@ -4019,7 +4019,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                } else if (expr.type_reference.data_type == glist_type ||
                           expr.type_reference.data_type == gslist_type) {
                        // NULL is an empty list
-                       expr.ccodenode = new CCodeConstant ("NULL");
+                       set_cvalue (expr, new CCodeConstant ("NULL"));
                } else if (expr.symbol_reference is Method) {
                        // use creation method
                        var m = (Method) expr.symbol_reference;
@@ -4078,7 +4078,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        int arg_pos;
                        Iterator<FormalParameter> params_it = params.iterator ();
                        foreach (Expression arg in expr.get_argument_list ()) {
-                               CCodeExpression cexpr = (CCodeExpression) arg.ccodenode;
+                               CCodeExpression cexpr = get_cvalue (arg);
                                FormalParameter param = null;
                                if (params_it.next ()) {
                                        param = params_it.get ();
@@ -4140,7 +4140,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                 * parameter yet */
                                param.initializer.emit (this);
                        
-                               carg_map.set (get_param_pos (param.cparameter_position), (CCodeExpression) param.initializer.ccodenode);
+                               carg_map.set (get_param_pos (param.cparameter_position), get_cvalue (param.initializer));
                                i++;
                        }
 
@@ -4204,7 +4204,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        creation_call.add_argument (new CCodeIdentifier (ecode.get_cname ()));
 
                        foreach (Expression arg in expr.get_argument_list ()) {
-                               creation_call.add_argument ((CCodeExpression) arg.ccodenode);
+                               creation_call.add_argument (get_cvalue (arg));
                        }
 
                        creation_expr = creation_call;
@@ -4215,7 +4215,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                var local = expr.parent_node as LocalVariable;
                if (local != null && has_simple_struct_initializer (local)) {
                        // no comma expression necessary
-                       expr.ccodenode = creation_expr;
+                       set_cvalue (expr, creation_expr);
                } else if (instance != null) {
                        var ccomma = new CCodeCommaExpression ();
 
@@ -4236,7 +4236,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                        } else {
                                                lhs = new CCodeMemberAccess.pointer (typed_inst, f.get_cname ());
                                        }
-                                       ccomma.append_expression (new CCodeAssignment (lhs, (CCodeExpression) init.initializer.ccodenode));
+                                       ccomma.append_expression (new CCodeAssignment (lhs, get_cvalue (init.initializer)));
 
                                        if (f.variable_type is ArrayType && !f.no_array_length) {
                                                var array_type = (ArrayType) f.variable_type;
@@ -4267,17 +4267,17 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                } else if (init.symbol_reference is Property) {
                                        var inst_ma = new MemberAccess.simple ("new");
                                        inst_ma.value_type = expr.type_reference;
-                                       inst_ma.ccodenode = instance;
+                                       set_cvalue (inst_ma, instance);
                                        var ma = new MemberAccess (inst_ma, init.name);
-                                       ccomma.append_expression (get_property_set_call ((Property) init.symbol_reference, ma, (CCodeExpression) init.initializer.ccodenode));
+                                       ccomma.append_expression (get_property_set_call ((Property) init.symbol_reference, ma, get_cvalue (init.initializer)));
                                }
                        }
 
                        ccomma.append_expression (instance);
 
-                       expr.ccodenode = ccomma;
+                       set_cvalue (expr, ccomma);
                } else if (creation_expr != null) {
-                       expr.ccodenode = creation_expr;
+                       set_cvalue (expr, creation_expr);
                }
        }
 
@@ -4323,11 +4323,11 @@ public class Vala.CCodeBaseModule : CodeGenerator {
 
                var csizeof = new CCodeFunctionCall (new CCodeIdentifier ("sizeof"));
                csizeof.add_argument (new CCodeIdentifier (expr.type_reference.get_cname ()));
-               expr.ccodenode = csizeof;
+               set_cvalue (expr, csizeof);
        }
 
        public override void visit_typeof_expression (TypeofExpression expr) {
-               expr.ccodenode = get_type_id_expression (expr.type_reference);
+               set_cvalue (expr, get_type_id_expression (expr.type_reference));
        }
 
        public override void visit_unary_expression (UnaryExpression expr) {
@@ -4351,7 +4351,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                } else {
                        assert_not_reached ();
                }
-               expr.ccodenode = new CCodeUnaryExpression (op, (CCodeExpression) expr.inner.ccodenode);
+               set_cvalue (expr, new CCodeUnaryExpression (op, get_cvalue (expr.inner)));
        }
 
        public CCodeExpression? try_cast_value_to_type (CCodeExpression ccodeexpr, DataType from, DataType to, Expression? expr = null) {
@@ -4458,15 +4458,15 @@ public class Vala.CCodeBaseModule : CodeGenerator {
        }
 
        public override void visit_cast_expression (CastExpression expr) {
-               var valuecast = try_cast_value_to_type ((CCodeExpression) expr.inner.ccodenode, expr.inner.value_type, expr.type_reference, expr);
+               var valuecast = try_cast_value_to_type (get_cvalue (expr.inner), expr.inner.value_type, expr.type_reference, expr);
                if (valuecast != null) {
-                       expr.ccodenode = valuecast;
+                       set_cvalue (expr, valuecast);
                        return;
                }
 
-               var variantcast = try_cast_variant_to_type ((CCodeExpression) expr.inner.ccodenode, expr.inner.value_type, expr.type_reference, expr);
+               var variantcast = try_cast_variant_to_type (get_cvalue (expr.inner), expr.inner.value_type, expr.type_reference, expr);
                if (variantcast != null) {
-                       expr.ccodenode = variantcast;
+                       set_cvalue (expr, variantcast);
                        return;
                }
 
@@ -4483,7 +4483,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                emit_temp_var (temp_decl);
 
                                var ctemp = get_variable_cexpression (temp_decl.name);
-                               var cinit = new CCodeAssignment (ctemp, (CCodeExpression) expr.inner.ccodenode);
+                               var cinit = new CCodeAssignment (ctemp, get_cvalue (expr.inner));
                                var ccheck = create_type_check (ctemp, expr.type_reference);
                                var ccast = new CCodeCastExpression (ctemp, expr.type_reference.get_cname ());
                                var cnull = new CCodeConstant ("NULL");
@@ -4491,9 +4491,9 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                ccomma.append_expression (cinit);
                                ccomma.append_expression (new CCodeConditionalExpression (ccheck, ccast, cnull));
        
-                               expr.ccodenode = ccomma;
+                               set_cvalue (expr, ccomma);
                        } else {
-                               expr.ccodenode = generate_instance_cast ((CCodeExpression) expr.inner.ccodenode, expr.type_reference.data_type);
+                               set_cvalue (expr, generate_instance_cast (get_cvalue (expr.inner), expr.type_reference.data_type));
                        }
                } else {
                        if (expr.is_silent_cast) {
@@ -4510,33 +4510,33 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                }
                        }
 
-                       var innercexpr = (CCodeExpression) expr.inner.ccodenode;
+                       var innercexpr = get_cvalue (expr.inner);
                        if (expr.type_reference.data_type is Struct && !expr.type_reference.nullable &&
                                expr.inner.value_type.data_type is Struct && expr.inner.value_type.nullable) {
                                // nullable integer or float or boolean or struct cast to non-nullable
                                innercexpr = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, innercexpr);
                        }
-                       expr.ccodenode = new CCodeCastExpression (innercexpr, expr.type_reference.get_cname ());
+                       set_cvalue (expr, new CCodeCastExpression (innercexpr, expr.type_reference.get_cname ()));
                }
        }
        
        public override void visit_named_argument (NamedArgument expr) {
-               expr.ccodenode = expr.inner.ccodenode;
+               set_cvalue (expr, get_cvalue (expr.inner));
        }
 
        public override void visit_pointer_indirection (PointerIndirection expr) {
-               expr.ccodenode = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, (CCodeExpression) expr.inner.ccodenode);
+               set_cvalue (expr, new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, get_cvalue (expr.inner)));
        }
 
        public override void visit_addressof_expression (AddressofExpression expr) {
-               if (expr.inner.ccodenode is CCodeCommaExpression) {
-                       var ccomma = expr.inner.ccodenode as CCodeCommaExpression;
+               if (get_cvalue (expr.inner) is CCodeCommaExpression) {
+                       var ccomma = get_cvalue (expr.inner) as CCodeCommaExpression;
                        var inner = ccomma.get_inner ();
                        var last = inner.get (inner.size - 1);
                        ccomma.set_expression (inner.size - 1, new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, (CCodeExpression) last));
-                       expr.ccodenode = ccomma;
+                       set_cvalue (expr, ccomma);
                } else {
-                       expr.ccodenode = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, (CCodeExpression) expr.inner.ccodenode);
+                       set_cvalue (expr, new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_cvalue (expr.inner)));
                }
        }
 
@@ -4547,15 +4547,15 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                emit_temp_var (temp_decl);
                var cvar = get_variable_cexpression (temp_decl.name);
 
-               ccomma.append_expression (new CCodeAssignment (cvar, (CCodeExpression) expr.inner.ccodenode));
-               ccomma.append_expression (new CCodeAssignment ((CCodeExpression) expr.inner.ccodenode, new CCodeConstant ("NULL")));
+               ccomma.append_expression (new CCodeAssignment (cvar, get_cvalue (expr.inner)));
+               ccomma.append_expression (new CCodeAssignment (get_cvalue (expr.inner), new CCodeConstant ("NULL")));
                ccomma.append_expression (cvar);
-               expr.ccodenode = ccomma;
+               set_cvalue (expr, ccomma);
        }
 
        public override void visit_binary_expression (BinaryExpression expr) {
-               var cleft = (CCodeExpression) expr.left.ccodenode;
-               var cright = (CCodeExpression) expr.right.ccodenode;
+               var cleft = get_cvalue (expr.left);
+               var cright = get_cvalue (expr.right);
 
                CCodeExpression? left_chain = null;
                if (expr.chained) {
@@ -4565,11 +4565,11 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        emit_temp_var (temp_decl);
                        var cvar = get_variable_cexpression (temp_decl.name);
                        var ccomma = new CCodeCommaExpression ();
-                       var clbe = (CCodeBinaryExpression) lbe.ccodenode;
+                       var clbe = (CCodeBinaryExpression) get_cvalue (lbe);
                        if (lbe.chained) {
                                clbe = (CCodeBinaryExpression) clbe.right;
                        }
-                       ccomma.append_expression (new CCodeAssignment (cvar, (CCodeExpression)lbe.right.ccodenode));
+                       ccomma.append_expression (new CCodeAssignment (cvar, get_cvalue (lbe.right)));
                        clbe.right = get_variable_cexpression (temp_decl.name);
                        ccomma.append_expression (cleft);
                        cleft = cvar;
@@ -4591,14 +4591,14 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                var ccall = new CCodeFunctionCall (new CCodeIdentifier ("fmod"));
                                ccall.add_argument (cleft);
                                ccall.add_argument (cright);
-                               expr.ccodenode = ccall;
+                               set_cvalue (expr, ccall);
                                return;
                        } else if (expr.value_type.equals (float_type)) {
                                cfile.add_include ("math.h");
                                var ccall = new CCodeFunctionCall (new CCodeIdentifier ("fmodf"));
                                ccall.add_argument (cleft);
                                ccall.add_argument (cright);
-                               expr.ccodenode = ccall;
+                               set_cvalue (expr, ccall);
                                return;
                        } else {
                                op = CCodeBinaryOperator.MOD;
@@ -4640,9 +4640,9 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                } else {
                                        node.add_argument (cleft);
                                }
-                               expr.ccodenode = node;
+                               set_cvalue (expr, node);
                        } else {
-                               expr.ccodenode = new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, new CCodeBinaryExpression (CCodeBinaryOperator.BITWISE_AND, cright, cleft), cleft);
+                               set_cvalue (expr, new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, new CCodeBinaryExpression (CCodeBinaryOperator.BITWISE_AND, cright, cleft), cleft));
                        }
                        return;
                } else {
@@ -4697,7 +4697,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                                assert_not_reached ();
                                        }
 
-                                       expr.ccodenode = new CCodeConstant ("%s %s".printf (left, right));
+                                       set_cvalue (expr, new CCodeConstant ("%s %s".printf (left, right)));
                                        return;
                                } else {
                                        if (context.profile == Profile.POSIX) {
@@ -4719,14 +4719,14 @@ public class Vala.CCodeBaseModule : CodeGenerator {
 
                                                strcat.add_argument(strcpy);
                                                strcat.add_argument(cright);
-                                               expr.ccodenode = strcat;
+                                               set_cvalue (expr, strcat);
                                        } else {
                                                // convert to g_strconcat (a, b, NULL)
                                                var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_strconcat"));
                                                ccall.add_argument (cleft);
                                                ccall.add_argument (cright);
                                                ccall.add_argument (new CCodeConstant("NULL"));
-                                               expr.ccodenode = ccall;
+                                               set_cvalue (expr, ccall);
                                        }
                                        return;
                                }
@@ -4745,9 +4745,9 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        }
                }
 
-               expr.ccodenode = new CCodeBinaryExpression (op, cleft, cright);
+               set_cvalue (expr, new CCodeBinaryExpression (op, cleft, cright));
                if (left_chain != null) {
-                       expr.ccodenode = new CCodeBinaryExpression (CCodeBinaryOperator.AND, left_chain, (CCodeExpression) expr.ccodenode);
+                       set_cvalue (expr, new CCodeBinaryExpression (CCodeBinaryOperator.AND, left_chain, get_cvalue (expr)));
                }
        }
 
@@ -4848,8 +4848,8 @@ public class Vala.CCodeBaseModule : CodeGenerator {
        public override void visit_type_check (TypeCheck expr) {
                generate_type_declaration (expr.type_reference, cfile);
 
-               expr.ccodenode = create_type_check (expr.expression.ccodenode, expr.type_reference);
-               if (expr.ccodenode is CCodeInvalidExpression) {
+               set_cvalue (expr, create_type_check (get_cvalue (expr.expression), expr.type_reference));
+               if (get_cvalue (expr) is CCodeInvalidExpression) {
                        Report.error (expr.source_reference, "type check expressions not supported for compact classes, structs, and enums");
                }
        }
@@ -4861,7 +4861,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
 
                l.accept_children (this);
 
-               l.ccodenode = new CCodeIdentifier (l.method.get_cname ());
+               set_cvalue (l, new CCodeIdentifier (l.method.get_cname ()));
        }
 
        public CCodeExpression convert_from_generic_pointer (CCodeExpression cexpr, DataType actual_type) {
@@ -5435,6 +5435,14 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                }
        }
 
+       public CCodeExpression? get_cvalue (Expression expr) {
+               return (CCodeExpression) expr.ccodenode;
+       }
+
+       public void set_cvalue (Expression expr, CCodeExpression? cvalue) {
+               expr.ccodenode = cvalue;
+       }
+
        public CCodeNode? get_ccodenode (CodeNode node) {
                if (node.ccodenode == null) {
                        node.emit (this);
@@ -5448,7 +5456,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
        public void create_postcondition_statement (Expression postcondition) {
                var cassert = new CCodeFunctionCall (new CCodeIdentifier ("g_warn_if_fail"));
 
-               cassert.add_argument ((CCodeExpression) postcondition.ccodenode);
+               cassert.add_argument (get_cvalue (postcondition));
 
                ccode.add_expression (cassert);
        }
@@ -5490,7 +5498,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
 
                                        var this_access = new MemberAccess.simple ("this");
                                        this_access.value_type = get_data_type_for_symbol ((TypeSymbol) f.parent_symbol);
-                                       this_access.ccodenode = new CCodeIdentifier ("(*self)");
+                                       set_cvalue (this_access, new CCodeIdentifier ("(*self)"));
 
                                        var ma = new MemberAccess (this_access, f.name);
                                        ma.symbol_reference = f;
@@ -5527,7 +5535,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                if (requires_copy (f.variable_type))  {
                                        var this_access = new MemberAccess.simple ("this");
                                        this_access.value_type = get_data_type_for_symbol ((TypeSymbol) f.parent_symbol);
-                                       this_access.ccodenode = new CCodeIdentifier ("(*self)");
+                                       set_cvalue (this_access, new CCodeIdentifier ("(*self)"));
                                        var ma = new MemberAccess (this_access, f.name);
                                        ma.symbol_reference = f;
                                        copy = get_ref_cexpression (f.variable_type, copy, ma, f);
index 0793d3374b7e149061818da98179ee491a85dc98..46a4b439718cf42697e27cad1d60e66c13da747e 100644 (file)
@@ -26,7 +26,7 @@ using GLib;
 
 public class Vala.CCodeControlFlowModule : CCodeMethodModule {
        public override void visit_if_statement (IfStatement stmt) {
-               ccode.open_if ((CCodeExpression) stmt.condition.ccodenode);
+               ccode.open_if (get_cvalue (stmt.condition));
 
                stmt.true_statement.emit (this);
 
@@ -44,7 +44,7 @@ public class Vala.CCodeControlFlowModule : CCodeMethodModule {
                emit_temp_var (temp_var);
 
                var ctemp = get_variable_cexpression (temp_var.name);
-               var cinit = new CCodeAssignment (ctemp, (CCodeExpression) stmt.expression.ccodenode);
+               var cinit = new CCodeAssignment (ctemp, get_cvalue (stmt.expression));
                var czero = new CCodeConstant ("0");
 
                var free_call = new CCodeFunctionCall (new CCodeIdentifier ("g_free"));
@@ -68,7 +68,7 @@ public class Vala.CCodeControlFlowModule : CCodeMethodModule {
 
                        foreach (SwitchLabel label in section.get_labels ()) {
                                label.expression.emit (this);
-                               var cexpr = (CCodeExpression) label.expression.ccodenode;
+                               var cexpr = get_cvalue (label.expression);
 
                                if (is_constant_ccode_expression (cexpr)) {
                                        var cname = "%s_label%d".printf (temp_var.name, label_count++);
@@ -104,7 +104,7 @@ public class Vala.CCodeControlFlowModule : CCodeMethodModule {
                        CCodeBinaryExpression cor = null;
                        foreach (SwitchLabel label in section.get_labels ()) {
                                label.expression.emit (this);
-                               var cexpr = (CCodeExpression) label.expression.ccodenode;
+                               var cexpr = get_cvalue (label.expression);
 
                                if (is_constant_ccode_expression (cexpr)) {
                                        var cname = new CCodeIdentifier ("%s_label%d".printf (temp_var.name, label_count++));
@@ -168,7 +168,7 @@ public class Vala.CCodeControlFlowModule : CCodeMethodModule {
                        return;
                }
 
-               ccode.open_switch ((CCodeExpression) stmt.expression.ccodenode);
+               ccode.open_switch (get_cvalue (stmt.expression));
 
                foreach (SwitchSection section in stmt.get_sections ()) {
                        if (section.has_default_label ()) {
@@ -190,7 +190,7 @@ public class Vala.CCodeControlFlowModule : CCodeMethodModule {
 
                        visit_end_full_expression (label.expression);
 
-                       ccode.add_case ((CCodeExpression) label.expression.ccodenode);
+                       ccode.add_case (get_cvalue (label.expression));
                }
        }
 
@@ -225,7 +225,7 @@ public class Vala.CCodeControlFlowModule : CCodeMethodModule {
                        var ccolvardecl = new CCodeVariableDeclarator (collection_backup.name);
                        ccode.add_declaration (collection_type.get_cname (), ccolvardecl);
                }
-               ccode.add_expression (new CCodeAssignment (get_variable_cexpression (collection_backup.name), (CCodeExpression) stmt.collection.ccodenode));
+               ccode.add_expression (new CCodeAssignment (get_variable_cexpression (collection_backup.name), get_cvalue (stmt.collection)));
                
                if (stmt.tree_can_fail && stmt.collection.tree_can_fail) {
                        // exception handling
index fbdbbe5a90a53986926ffe9bfb0018e3e0a0fdc5..9b20ebe9a3e74e9503653e448c35efd860a5ab51 100644 (file)
@@ -27,7 +27,7 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                CCodeExpression pub_inst = null;
        
                if (expr.inner != null) {
-                       pub_inst = (CCodeExpression) expr.inner.ccodenode;
+                       pub_inst = get_cvalue (expr.inner);
                }
 
                if (expr.symbol_reference is Method) {
@@ -51,13 +51,13 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                        var vcast = new CCodeFunctionCall (new CCodeIdentifier ("%s_CLASS".printf (base_class.get_upper_case_cname (null))));
                                        vcast.add_argument (new CCodeIdentifier ("%s_parent_class".printf (current_class.get_lower_case_cname (null))));
                                        
-                                       expr.ccodenode = new CCodeMemberAccess.pointer (vcast, m.vfunc_name);
+                                       set_cvalue (expr, new CCodeMemberAccess.pointer (vcast, m.vfunc_name));
                                        return;
                                } else if (m.base_interface_method != null) {
                                        var base_iface = (Interface) m.base_interface_method.parent_symbol;
                                        string parent_iface_var = "%s_%s_parent_iface".printf (current_class.get_lower_case_cname (null), base_iface.get_lower_case_cname (null));
 
-                                       expr.ccodenode = new CCodeMemberAccess.pointer (new CCodeIdentifier (parent_iface_var), m.vfunc_name);
+                                       set_cvalue (expr, new CCodeMemberAccess.pointer (new CCodeIdentifier (parent_iface_var), m.vfunc_name));
                                        return;
                                }
                        }
@@ -72,27 +72,27 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                                emit_temp_var (temp_var);
                                                var ctemp = get_variable_cexpression (temp_var.name);
                                                inst = new CCodeAssignment (ctemp, pub_inst);
-                                               expr.inner.ccodenode = ctemp;
+                                               set_cvalue (expr.inner, ctemp);
                                        }
                                        var base_class = (Class) m.base_method.parent_symbol;
                                        var vclass = new CCodeFunctionCall (new CCodeIdentifier ("%s_GET_CLASS".printf (base_class.get_upper_case_cname (null))));
                                        vclass.add_argument (inst);
-                                       expr.ccodenode = new CCodeMemberAccess.pointer (vclass, m.name);
+                                       set_cvalue (expr, new CCodeMemberAccess.pointer (vclass, m.name));
                                } else {
-                                       expr.ccodenode = new CCodeIdentifier (m.base_method.get_cname ());
+                                       set_cvalue (expr, new CCodeIdentifier (m.base_method.get_cname ()));
                                }
                        } else if (m.base_interface_method != null) {
-                               expr.ccodenode = new CCodeIdentifier (m.base_interface_method.get_cname ());
+                               set_cvalue (expr, new CCodeIdentifier (m.base_interface_method.get_cname ()));
                        } else if (m is CreationMethod) {
-                               expr.ccodenode = new CCodeIdentifier (m.get_real_cname ());
+                               set_cvalue (expr, new CCodeIdentifier (m.get_real_cname ()));
                        } else {
-                               expr.ccodenode = new CCodeIdentifier (m.get_cname ());
+                               set_cvalue (expr, new CCodeIdentifier (m.get_cname ()));
                        }
                } else if (expr.symbol_reference is ArrayLengthField) {
                        if (expr.value_type is ArrayType && !(expr.parent_node is ElementAccess)) {
                                Report.error (expr.source_reference, "unsupported use of length field of multi-dimensional array");
                        }
-                       expr.ccodenode = get_array_length_cexpression (expr.inner, 1);
+                       set_cvalue (expr, get_array_length_cexpression (expr.inner, 1));
                } else if (expr.symbol_reference is Field) {
                        var f = (Field) expr.symbol_reference;
                        if (f.binding == MemberBinding.INSTANCE) {
@@ -111,16 +111,16 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                        inst = pub_inst;
                                }
                                if (instance_target_type.data_type.is_reference_type () || (expr.inner != null && expr.inner.value_type is PointerType)) {
-                                       expr.ccodenode = new CCodeMemberAccess.pointer (inst, f.get_cname ());
+                                       set_cvalue (expr, new CCodeMemberAccess.pointer (inst, f.get_cname ()));
                                } else {
                                        if (inst is CCodeCommaExpression) {
                                                var ccomma = inst as CCodeCommaExpression;
                                                var inner = ccomma.get_inner ();
                                                var last = inner.get (inner.size - 1);
                                                ccomma.set_expression (inner.size - 1, new CCodeMemberAccess (last, f.get_cname ()));
-                                               expr.ccodenode = ccomma;
+                                               set_cvalue (expr, ccomma);
                                        } else {
-                                               expr.ccodenode = new CCodeMemberAccess (inst, f.get_cname ());
+                                               set_cvalue (expr, new CCodeMemberAccess (inst, f.get_cname ()));
                                        }
                                }
                        } else if (f.binding == MemberBinding.CLASS) {
@@ -141,7 +141,7 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                } else {
                                        // Accessing the field of an instance
                                        var k = new CCodeFunctionCall (new CCodeIdentifier ("G_OBJECT_GET_CLASS"));
-                                       k.add_argument ((CCodeExpression) expr.inner.ccodenode);
+                                       k.add_argument (get_cvalue (expr.inner));
                                        klass = k;
                                }
                                cast.add_argument (klass);
@@ -149,22 +149,22 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                if (f.access == SymbolAccessibility.PRIVATE) {
                                        var ccall = new CCodeFunctionCall (new CCodeIdentifier ("%s_GET_CLASS_PRIVATE".printf (cl.get_upper_case_cname ())));
                                        ccall.add_argument (klass);
-                                       expr.ccodenode = new CCodeMemberAccess.pointer (ccall, f.get_cname ());
+                                       set_cvalue (expr, new CCodeMemberAccess.pointer (ccall, f.get_cname ()));
                                } else {
-                                       expr.ccodenode = new CCodeMemberAccess.pointer (cast, f.get_cname ());
+                                       set_cvalue (expr, new CCodeMemberAccess.pointer (cast, f.get_cname ()));
                                }
 
                        } else {
                                generate_field_declaration (f, cfile);
 
-                               expr.ccodenode = new CCodeIdentifier (f.get_cname ());
+                               set_cvalue (expr, new CCodeIdentifier (f.get_cname ()));
                        }
                } else if (expr.symbol_reference is EnumValue) {
                        var ev = (EnumValue) expr.symbol_reference;
 
                        generate_enum_declaration ((Enum) ev.parent_symbol, cfile);
 
-                       expr.ccodenode = new CCodeConstant (ev.get_cname ());
+                       set_cvalue (expr, new CCodeConstant (ev.get_cname ()));
                } else if (expr.symbol_reference is Constant) {
                        var c = (Constant) expr.symbol_reference;
 
@@ -175,18 +175,18 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                        string fn = c.get_full_name ();
                        if (fn == "GLib.Log.FILE") {
                                string s = Path.get_basename (expr.source_reference.file.filename);
-                               expr.ccodenode = new CCodeConstant ("\"%s\"".printf (s));
+                               set_cvalue (expr, new CCodeConstant ("\"%s\"".printf (s)));
                        } else if (fn == "GLib.Log.LINE") {
                                int i = expr.source_reference.first_line;
-                               expr.ccodenode = new CCodeConstant ("%d".printf (i));
+                               set_cvalue (expr, new CCodeConstant ("%d".printf (i)));
                        } else if (fn == "GLib.Log.METHOD") {
                                string s = "";
                                if (current_method != null) {
                                        s = current_method.get_full_name ();
                                }
-                               expr.ccodenode = new CCodeConstant ("\"%s\"".printf (s));
+                               set_cvalue (expr, new CCodeConstant ("\"%s\"".printf (s)));
                        } else {
-                               expr.ccodenode = new CCodeIdentifier (c.get_cname ());
+                               set_cvalue (expr, new CCodeIdentifier (c.get_cname ()));
                        }
                } else if (expr.symbol_reference is Property) {
                        var prop = (Property) expr.symbol_reference;
@@ -210,16 +210,16 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                        vcast.add_argument (new CCodeIdentifier ("%s_parent_class".printf (current_class.get_lower_case_cname (null))));
                                        
                                        var ccall = new CCodeFunctionCall (new CCodeMemberAccess.pointer (vcast, "get_%s".printf (prop.name)));
-                                       ccall.add_argument ((CCodeExpression) expr.inner.ccodenode);
-                                       expr.ccodenode = ccall;
+                                       ccall.add_argument (get_cvalue (expr.inner));
+                                       set_cvalue (expr, ccall);
                                        return;
                                } else if (prop.base_interface_property != null) {
                                        var base_iface = (Interface) prop.base_interface_property.parent_symbol;
                                        string parent_iface_var = "%s_%s_parent_iface".printf (current_class.get_lower_case_cname (null), base_iface.get_lower_case_cname (null));
 
                                        var ccall = new CCodeFunctionCall (new CCodeMemberAccess.pointer (new CCodeIdentifier (parent_iface_var), "get_%s".printf (prop.name)));
-                                       ccall.add_argument ((CCodeExpression) expr.inner.ccodenode);
-                                       expr.ccodenode = ccall;
+                                       ccall.add_argument (get_cvalue (expr.inner));
+                                       set_cvalue (expr, ccall);
                                        return;
                                }
                        }
@@ -233,7 +233,7 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                            !(prop.property_type is ArrayType || prop.property_type is DelegateType)) {
                                CCodeExpression inst;
                                inst = new CCodeMemberAccess.pointer (pub_inst, "priv");
-                               expr.ccodenode = new CCodeMemberAccess.pointer (inst, prop.field.get_cname());
+                               set_cvalue (expr, new CCodeMemberAccess.pointer (inst, prop.field.get_cname()));
                        } else if (!prop.no_accessor_method) {
                                var base_property = prop;
                                if (prop.base_property != null) {
@@ -285,7 +285,7 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                        ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, ctemp));
                                        ccomma.append_expression (ccall);
                                        ccomma.append_expression (ctemp);
-                                       expr.ccodenode = ccomma;
+                                       set_cvalue (expr, ccomma);
                                } else {
                                        var array_type = base_property.property_type as ArrayType;
                                        if (array_type != null && !base_property.no_array_length) {
@@ -307,7 +307,7 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                                }
                                        }
 
-                                       expr.ccodenode = ccall;
+                                       set_cvalue (expr, ccall);
                                }
                        } else {
                                var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_object_get"));
@@ -337,7 +337,7 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                ccall.add_argument (new CCodeConstant ("NULL"));
                                ccomma.append_expression (ccall);
                                ccomma.append_expression (ctemp);
-                               expr.ccodenode = ccomma;
+                               set_cvalue (expr, ccomma);
                        }
                } else if (expr.symbol_reference is LocalVariable) {
                        var local = (LocalVariable) expr.symbol_reference;
@@ -345,16 +345,16 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                // used in postconditions
                                // structs are returned as out parameter
                                if (local.variable_type != null && local.variable_type.is_real_non_null_struct_type ()) {
-                                       expr.ccodenode = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier ("result"));
+                                       set_cvalue (expr, new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier ("result")));
                                } else {
-                                       expr.ccodenode = new CCodeIdentifier ("result");
+                                       set_cvalue (expr, new CCodeIdentifier ("result"));
                                }
                        } else if (local.captured) {
                                // captured variables are stored on the heap
                                var block = (Block) local.parent_symbol;
-                               expr.ccodenode = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_variable_cname (local.name));
+                               set_cvalue (expr, new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_variable_cname (local.name)));
                        } else {
-                               expr.ccodenode = get_variable_cexpression (local.name);
+                               set_cvalue (expr, get_variable_cexpression (local.name));
 
                                if (expr.parent_node is ReturnStatement &&
                                    current_return_type.value_owned &&
@@ -375,13 +375,13 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                        if (p.name == "this") {
                                if (current_method != null && current_method.coroutine) {
                                        // use closure
-                                       expr.ccodenode = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "self");
+                                       set_cvalue (expr, new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "self"));
                                } else {
                                        var st = current_type_symbol as Struct;
                                        if (st != null && !st.is_simple_type ()) {
-                                               expr.ccodenode = new CCodeIdentifier ("(*self)");
+                                               set_cvalue (expr, new CCodeIdentifier ("(*self)"));
                                        } else {
-                                               expr.ccodenode = new CCodeIdentifier ("self");
+                                               set_cvalue (expr, new CCodeIdentifier ("self"));
                                        }
                                }
                        } else {
@@ -391,15 +391,15 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                        if (block == null) {
                                                block = ((Method) p.parent_symbol).body;
                                        }
-                                       expr.ccodenode = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_variable_cname (p.name));
+                                       set_cvalue (expr, new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_variable_cname (p.name)));
                                } else if (current_method != null && current_method.coroutine) {
                                        // use closure
-                                       expr.ccodenode = get_variable_cexpression (p.name);
+                                       set_cvalue (expr, get_variable_cexpression (p.name));
                                } else {
                                        var type_as_struct = p.variable_type.data_type as Struct;
                                        if (p.direction != ParameterDirection.IN
                                            || (type_as_struct != null && !type_as_struct.is_simple_type () && !p.variable_type.nullable)) {
-                                               expr.ccodenode = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier (get_variable_cname (p.name)));
+                                               set_cvalue (expr, new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier (get_variable_cname (p.name))));
                                        } else {
                                                // Property setters of non simple structs shall replace all occurences
                                                // of the "value" formal parameter with a dereferencing version of that
@@ -409,9 +409,9 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                                    current_property_accessor.value_parameter == p &&
                                                    current_property_accessor.prop.property_type.is_real_struct_type () &&
                                                    !current_property_accessor.prop.property_type.nullable) {
-                                                       expr.ccodenode = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier ("value"));
+                                                       set_cvalue (expr, new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier ("value")));
                                                } else {
-                                                       expr.ccodenode = get_variable_cexpression (p.name);
+                                                       set_cvalue (expr, get_variable_cexpression (p.name));
                                                }
                                        }
                                }
index b480a718c874d115a3ddf9f32f61a4e40c7890d3..5c6d483f3baf18590a66bceb6943737cfe812f28 100644 (file)
@@ -27,7 +27,7 @@ using GLib;
 public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
        public override void visit_method_call (MethodCall expr) {
                // the bare function call
-               var ccall = new CCodeFunctionCall ((CCodeExpression) expr.call.ccodenode);
+               var ccall = new CCodeFunctionCall (get_cvalue (expr.call));
 
                CCodeFunctionCall async_call = null;
 
@@ -53,7 +53,7 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                        if (ma != null && ma.inner is BaseAccess && sig_type.signal_symbol.is_virtual) {
                                m = sig_type.signal_symbol.default_handler;
                        } else {
-                               ccall = (CCodeFunctionCall) expr.call.ccodenode;
+                               ccall = (CCodeFunctionCall) get_cvalue (expr.call);
                        }
                } else if (itype is ObjectType) {
                        // constructor
@@ -178,11 +178,11 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                        in_arg_map.set (get_param_pos (m.cinstance_parameter_position), instance);
                        out_arg_map.set (get_param_pos (m.cinstance_parameter_position), instance);
                } else if (m != null && m.binding == MemberBinding.INSTANCE && !(m is CreationMethod)) {
-                       instance = (CCodeExpression) ma.inner.ccodenode;
+                       instance = get_cvalue (ma.inner);
 
                        if ((ma.member_name == "begin" || ma.member_name == "end") && ma.inner.symbol_reference == ma.symbol_reference) {
                                var inner_ma = (MemberAccess) ma.inner;
-                               instance = (CCodeExpression) inner_ma.inner.ccodenode;
+                               instance = get_cvalue (inner_ma.inner);
                        }
 
                        var st = m.parent_symbol as Struct;
@@ -228,7 +228,7 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                        } else {
                                // Accessing the method of an instance
                                var k = new CCodeFunctionCall (new CCodeIdentifier ("G_OBJECT_GET_CLASS"));
-                               k.add_argument ((CCodeExpression) ma.inner.ccodenode);
+                               k.add_argument (get_cvalue (ma.inner));
                                klass = k;
                        }
 
@@ -327,7 +327,7 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                int arg_pos;
                Iterator<FormalParameter> params_it = params.iterator ();
                foreach (Expression arg in expr.get_argument_list ()) {
-                       CCodeExpression cexpr = (CCodeExpression) arg.ccodenode;
+                       CCodeExpression cexpr = get_cvalue (arg);
 
                        var carg_map = in_arg_map;
 
@@ -456,7 +456,7 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
 
                                                if (param.direction == ParameterDirection.REF) {
                                                        var crefcomma = new CCodeCommaExpression ();
-                                                       crefcomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_var.name), (CCodeExpression) unary.inner.ccodenode));
+                                                       crefcomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_var.name), get_cvalue (unary.inner)));
                                                        crefcomma.append_expression (cexpr);
                                                        cexpr = crefcomma;
                                                }
@@ -480,12 +480,12 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                                                cassign_comma.append_expression (new CCodeAssignment (get_variable_cexpression (assign_temp_var.name), transform_expression (get_variable_cexpression (temp_var.name), param.variable_type, unary.inner.value_type, arg)));
 
                                                // unref old value
-                                               cassign_comma.append_expression (get_unref_expression ((CCodeExpression) unary.inner.ccodenode, arg.value_type, arg));
+                                               cassign_comma.append_expression (get_unref_expression (get_cvalue (unary.inner), arg.value_type, arg));
 
                                                cassign_comma.append_expression (get_variable_cexpression (assign_temp_var.name));
 
                                                // assign new value
-                                               ccomma.append_expression (new CCodeAssignment ((CCodeExpression) unary.inner.ccodenode, cassign_comma));
+                                               ccomma.append_expression (new CCodeAssignment (get_cvalue (unary.inner), cassign_comma));
 
                                                // return value
                                                if (ret_temp_var != null) {
@@ -740,9 +740,9 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                }
 
                if (m != null && m.binding == MemberBinding.INSTANCE && m.returns_modified_pointer) {
-                       expr.ccodenode = new CCodeAssignment (instance, ccall_expr);
+                       set_cvalue (expr, new CCodeAssignment (instance, ccall_expr));
                } else {
-                       expr.ccodenode = ccall_expr;
+                       set_cvalue (expr, ccall_expr);
                }
 
                if (expr.is_yield_expression) {
@@ -759,7 +759,7 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                        // FIXME: size expression must not be evaluated twice at runtime (potential side effects)
                        Iterator<Expression> arg_it = expr.get_argument_list ().iterator ();
                        arg_it.next ();
-                       var new_size = (CCodeExpression) arg_it.get ().ccodenode;
+                       var new_size = get_cvalue (arg_it.get ());
 
                        var temp_decl = get_temp_variable (int_type);
                        var temp_ref = get_variable_cexpression (temp_decl.name);
@@ -770,7 +770,7 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                        cfile.add_include ("string.h");
 
                        var clen = get_array_length_cexpression (ma.inner, 1);
-                       var celems = (CCodeExpression) ma.inner.ccodenode;
+                       var celems = get_cvalue (ma.inner);
                        var array_type = (ArrayType) ma.inner.value_type;
                        var csizeof = new CCodeIdentifier ("sizeof (%s)".printf (array_type.element_type.get_cname ()));
                        var cdelta = new CCodeBinaryExpression (CCodeBinaryOperator.MINUS, temp_ref, clen);
@@ -783,11 +783,11 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
 
                        var ccomma = new CCodeCommaExpression ();
                        ccomma.append_expression (new CCodeAssignment (temp_ref, new_size));
-                       ccomma.append_expression ((CCodeExpression) expr.ccodenode);
+                       ccomma.append_expression (get_cvalue (expr));
                        ccomma.append_expression (new CCodeConditionalExpression (ccheck, czero, new CCodeConstant ("NULL")));
                        ccomma.append_expression (new CCodeAssignment (get_array_length_cexpression (ma.inner, 1), temp_ref));
 
-                       expr.ccodenode = ccomma;
+                       set_cvalue (expr, ccomma);
                }
        }
 
index 7d850a9429c7d51037b75990cd3f3cb5a9b4a93c..55c31e4df715d54d1eece5c971357c1ffeb3b926 100644 (file)
@@ -953,7 +953,7 @@ public class Vala.CCodeMethodModule : CCodeStructModule {
        private void create_precondition_statement (CodeNode method_node, DataType ret_type, Expression precondition) {
                var ccheck = new CCodeFunctionCall ();
 
-               ccheck.add_argument ((CCodeExpression) precondition.ccodenode);
+               ccheck.add_argument (get_cvalue (precondition));
 
                if (method_node is CreationMethod) {
                        ccheck.call = new CCodeIdentifier ("g_return_val_if_fail");
index 424ab72573c0c71d4b8cc6e92ffec776e258067a..07f7525528a33eec752f85bf60c8b22ea72a309a 100644 (file)
@@ -259,7 +259,7 @@ public class Vala.CCodeStructModule : CCodeBaseModule {
                                if (requires_copy (f.variable_type))  {
                                        var this_access = new MemberAccess.simple ("this");
                                        this_access.value_type = get_data_type_for_symbol ((TypeSymbol) f.parent_symbol);
-                                       this_access.ccodenode = new CCodeIdentifier ("(*self)");
+                                       set_cvalue (this_access, new CCodeIdentifier ("(*self)"));
                                        var ma = new MemberAccess (this_access, f.name);
                                        ma.symbol_reference = f;
                                        copy = get_ref_cexpression (f.variable_type, copy, ma, f);
index 89bcc764e0927cdcf523562f0af31c650ee2c010..cae3dc965672920087728bfb9d2adac55775f079 100644 (file)
@@ -161,7 +161,7 @@ public class Vala.DBusClientModule : DBusModule {
                        cend_call.add_argument (new CCodeIdentifier ("proxy"));
                        cend_call.add_argument (new CCodeIdentifier ("call"));
                        cend_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("error")));
-                       var creply_call = new CCodeFunctionCall ((CCodeExpression) callback.ccodenode);
+                       var creply_call = new CCodeFunctionCall (get_cvalue (callback));
                        if (reply_method.binding != MemberBinding.STATIC) {
                                creply_call.add_argument (new CCodeIdentifier ("user_data"));
                        }
@@ -924,12 +924,12 @@ public class Vala.DBusClientModule : DBusModule {
 
                var ccall = new CCodeFunctionCall (new CCodeIdentifier (type.type_symbol.get_lower_case_cprefix () + "dbus_proxy_new"));
                connection.emit (this);
-               ccall.add_argument ((CCodeExpression) connection.ccodenode);
+               ccall.add_argument (get_cvalue (connection));
                bus_name.emit (this);
-               ccall.add_argument ((CCodeExpression) bus_name.ccodenode);
+               ccall.add_argument (get_cvalue (bus_name));
                object_path.emit (this);
-               ccall.add_argument ((CCodeExpression) object_path.ccodenode);
-               expr.ccodenode = ccall;
+               ccall.add_argument (get_cvalue (object_path));
+               set_cvalue (expr, ccall);
        }
 
        void generate_proxy_interface_init (Interface main_iface, Interface iface) {
@@ -1416,13 +1416,13 @@ public class Vala.DBusClientModule : DBusModule {
                        interface_name.emit (this);
 
                        var ccall = new CCodeFunctionCall (new CCodeIdentifier (generate_get_all_function (mtype.method_symbol)));
-                       ccall.add_argument ((CCodeExpression) instance.ccodenode);
-                       ccall.add_argument ((CCodeExpression) interface_name.ccodenode);
+                       ccall.add_argument (get_cvalue (instance));
+                       ccall.add_argument (get_cvalue (interface_name));
 
                        current_method_inner_error = true;
                        ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_variable_cexpression ("_inner_error_")));
 
-                       expr.ccodenode = ccall;
+                       set_cvalue (expr, ccall);
                        return;
                }
 
@@ -1438,7 +1438,7 @@ public class Vala.DBusClientModule : DBusModule {
 
                var qdata_call = new CCodeFunctionCall (new CCodeIdentifier ("g_type_get_qdata"));
                type.emit (this);
-               qdata_call.add_argument ((CCodeExpression) type.ccodenode);
+               qdata_call.add_argument (get_cvalue (type));
                qdata_call.add_argument (quark_call);
 
                var get_type_call = new CCodeFunctionCall (new CCodeCastExpression (qdata_call, "GType (*)(void)"));
@@ -1447,18 +1447,18 @@ public class Vala.DBusClientModule : DBusModule {
                ccall.add_argument (get_type_call);
                ccall.add_argument (new CCodeConstant ("\"connection\""));
                connection.emit (this);
-               ccall.add_argument ((CCodeExpression) connection.ccodenode);
+               ccall.add_argument (get_cvalue (connection));
                ccall.add_argument (new CCodeConstant ("\"name\""));
                bus_name.emit (this);
-               ccall.add_argument ((CCodeExpression) bus_name.ccodenode);
+               ccall.add_argument (get_cvalue (bus_name));
                ccall.add_argument (new CCodeConstant ("\"path\""));
                object_path.emit (this);
-               ccall.add_argument ((CCodeExpression) object_path.ccodenode);
+               ccall.add_argument (get_cvalue (object_path));
                ccall.add_argument (new CCodeConstant ("\"interface\""));
                interface_name.emit (this);
-               ccall.add_argument ((CCodeExpression) interface_name.ccodenode);
+               ccall.add_argument (get_cvalue (interface_name));
                ccall.add_argument (new CCodeConstant ("NULL"));
-               expr.ccodenode = ccall;
+               set_cvalue (expr, ccall);
        }
 
        void generate_proxy_filter_function (Interface iface) {
index e1325a5077adbcab952022160fc84f98ce2c005b..cbf770d47787918dd8d2b563c1ff4f3dc8166f19 100644 (file)
@@ -1636,7 +1636,7 @@ public class Vala.DBusServerModule : DBusClientModule {
                var ma = (MemberAccess) expr.call;
 
                var raw_conn = new CCodeFunctionCall (new CCodeIdentifier ("dbus_g_connection_get_connection"));
-               raw_conn.add_argument ((CCodeExpression) ma.inner.ccodenode);
+               raw_conn.add_argument (get_cvalue (ma.inner));
 
                var args_it = expr.get_argument_list ().iterator ();
                args_it.next ();
@@ -1648,11 +1648,11 @@ public class Vala.DBusServerModule : DBusClientModule {
                if (mtype.method_symbol.get_cname () == "dbus_g_connection_register_g_object") {
                        cregister.add_argument (raw_conn);
                } else {
-                       cregister.add_argument ((CCodeExpression) ma.inner.ccodenode);
+                       cregister.add_argument (get_cvalue (ma.inner));
                }
-               cregister.add_argument ((CCodeExpression) path_arg.ccodenode);
-               cregister.add_argument ((CCodeExpression) obj_arg.ccodenode);
-               expr.ccodenode = cregister;
+               cregister.add_argument (get_cvalue (path_arg));
+               cregister.add_argument (get_cvalue (obj_arg));
+               set_cvalue (expr, cregister);
        }
 
        bool type_implements_dbus_interface (ObjectTypeSymbol sym) {
index 182ffce3465192717a0b92bb083fb29706372436..ff9fd60c812c81bb60cdb4d58c59fb91f2badf62 100644 (file)
@@ -23,7 +23,7 @@
 public class Vala.DovaArrayModule : DovaMethodCallModule {
        void append_initializer_list (CCodeCommaExpression ce, CCodeExpression name_cnode, InitializerList initializer_list, ref int i) {
                foreach (Expression e in initializer_list.get_initializers ()) {
-                       ce.append_expression (new CCodeAssignment (new CCodeElementAccess (name_cnode, new CCodeConstant (i.to_string ())), (CCodeExpression) e.ccodenode));
+                       ce.append_expression (new CCodeAssignment (new CCodeElementAccess (name_cnode, new CCodeConstant (i.to_string ())), get_cvalue (e)));
                        i++;
                }
        }
@@ -44,7 +44,7 @@ public class Vala.DovaArrayModule : DovaMethodCallModule {
 
                        ce.append_expression (name_cnode);
 
-                       expr.ccodenode = ce;
+                       set_cvalue (expr, ce);
 
                        return;
                }
@@ -55,18 +55,18 @@ public class Vala.DovaArrayModule : DovaMethodCallModule {
                array_new.add_argument (get_type_id_expression (expr.element_type));
 
                // length of new array
-               array_new.add_argument ((CCodeExpression) expr.get_sizes ().get (0).ccodenode);
+               array_new.add_argument (get_cvalue (expr.get_sizes ().get (0)));
 
-               expr.ccodenode = array_new;
+               set_cvalue (expr, array_new);
        }
 
        public override void visit_element_access (ElementAccess expr) {
                List<Expression> indices = expr.get_indices ();
 
-               var ccontainer = (CCodeExpression) expr.container.ccodenode;
-               var cindex = (CCodeExpression) indices[0].ccodenode;
+               var ccontainer = get_cvalue (expr.container);
+               var cindex = get_cvalue (indices[0]);
 
                // access to element in an array
-               expr.ccodenode = new CCodeElementAccess (ccontainer, cindex);
+               set_cvalue (expr, new CCodeElementAccess (ccontainer, cindex));
        }
 }
index 1219a44e6013437b462850b1bd963c87353a934d..2e9480ddf76c128d06f5a906464a2acf40d2d3ae 100644 (file)
@@ -41,7 +41,7 @@ public class Vala.DovaAssignmentModule : DovaMemberAccessModule {
                        }
                }
 
-               CCodeExpression cexpr = (CCodeExpression) assignment.right.ccodenode;
+               CCodeExpression cexpr = get_cvalue (assignment.right);
 
                if (assignment.operator != AssignmentOperator.SIMPLE) {
                        CCodeBinaryOperator cop;
@@ -86,7 +86,7 @@ public class Vala.DovaAssignmentModule : DovaMemberAccessModule {
        }
 
        CCodeExpression emit_simple_assignment (Assignment assignment) {
-               CCodeExpression rhs = (CCodeExpression) assignment.right.ccodenode;
+               CCodeExpression rhs = get_cvalue (assignment.right);
                CCodeExpression lhs = (CCodeExpression) get_ccodenode (assignment.left);
                CCodeCommaExpression outer_ccomma = null;
 
@@ -154,7 +154,7 @@ public class Vala.DovaAssignmentModule : DovaMemberAccessModule {
        }
 
        CCodeExpression emit_fixed_length_array_assignment (Assignment assignment, ArrayType array_type) {
-               CCodeExpression rhs = (CCodeExpression) assignment.right.ccodenode;
+               CCodeExpression rhs = get_cvalue (assignment.right);
                CCodeExpression lhs = (CCodeExpression) get_ccodenode (assignment.left);
 
                // it is necessary to use memcpy for fixed-length (stack-allocated) arrays
@@ -177,13 +177,13 @@ public class Vala.DovaAssignmentModule : DovaMemberAccessModule {
                }
 
                if (assignment.left.symbol_reference is Property) {
-                       assignment.ccodenode = emit_property_assignment (assignment);
+                       set_cvalue (assignment, emit_property_assignment (assignment));
                } else {
                        var array_type = assignment.left.value_type as ArrayType;
                        if (array_type != null && array_type.fixed_length) {
-                               assignment.ccodenode = emit_fixed_length_array_assignment (assignment, array_type);
+                               set_cvalue (assignment, emit_fixed_length_array_assignment (assignment, array_type));
                        } else {
-                               assignment.ccodenode = emit_simple_assignment (assignment);
+                               set_cvalue (assignment, emit_simple_assignment (assignment));
                        }
                }
        }
index 22603f2dc7f7b8e86a7132ff25f3a07b1e8189f5..4c55c25ca44d452b6fb946182089ba51d3f4e6c5 100644 (file)
@@ -375,7 +375,7 @@ public class Vala.DovaBaseModule : CodeGenerator {
                                cenum.add_value (new CCodeEnumValue (ev.get_cname ()));
                        } else {
                                ev.value.emit (this);
-                               cenum.add_value (new CCodeEnumValue (ev.get_cname (), (CCodeExpression) ev.value.ccodenode));
+                               cenum.add_value (new CCodeEnumValue (ev.get_cname (), get_cvalue (ev.value)));
                        }
                }
 
@@ -407,12 +407,12 @@ public class Vala.DovaBaseModule : CodeGenerator {
                                if (c.type_reference is ArrayType) {
                                        arr = "[]";
                                }
-                               cdecl.add_declarator (new CCodeVariableDeclarator ("%s%s".printf (c.get_cname (), arr), (CCodeExpression) c.value.ccodenode));
+                               cdecl.add_declarator (new CCodeVariableDeclarator ("%s%s".printf (c.get_cname (), arr), get_cvalue (c.value)));
                                cdecl.modifiers = CCodeModifiers.STATIC;
 
                                decl_space.add_constant_declaration (cdecl);
                        } else {
-                               var cdefine = new CCodeMacroReplacement.with_expression (c.get_cname (), (CCodeExpression) c.value.ccodenode);
+                               var cdefine = new CCodeMacroReplacement.with_expression (c.get_cname (), get_cvalue (c.value));
                                decl_space.add_type_member_declaration (cdefine);
                        }
                }
@@ -853,8 +853,8 @@ public class Vala.DovaBaseModule : CodeGenerator {
                generate_type_declaration (local.variable_type, cfile);
 
                CCodeExpression rhs = null;
-               if (local.initializer != null && local.initializer.ccodenode != null) {
-                       rhs = (CCodeExpression) local.initializer.ccodenode;
+               if (local.initializer != null && get_cvalue (local.initializer) != null) {
+                       rhs = get_cvalue (local.initializer);
                }
 
                if (local.captured) {
@@ -902,7 +902,7 @@ public class Vala.DovaBaseModule : CodeGenerator {
                                        }
                                }
 
-                               var cexpr = (CCodeExpression) expr.ccodenode;
+                               var cexpr = get_cvalue (expr);
 
                                string ctype = field.get_ctype ();
                                if (ctype != null) {
@@ -912,13 +912,13 @@ public class Vala.DovaBaseModule : CodeGenerator {
                                clist.append (cexpr);
                        }
 
-                       list.ccodenode = clist;
+                       set_cvalue (list, clist);
                } else {
                        var clist = new CCodeInitializerList ();
                        foreach (Expression expr in list.get_initializers ()) {
-                               clist.append ((CCodeExpression) expr.ccodenode);
+                               clist.append (get_cvalue (expr));
                        }
-                       list.ccodenode = clist;
+                       set_cvalue (list, clist);
                }
        }
 
@@ -1114,7 +1114,7 @@ public class Vala.DovaBaseModule : CodeGenerator {
                emit_temp_var (full_expr_var);
 
                var expr_list = new CCodeCommaExpression ();
-               expr_list.append_expression (new CCodeAssignment (get_variable_cexpression (full_expr_var.name), (CCodeExpression) expr.ccodenode));
+               expr_list.append_expression (new CCodeAssignment (get_variable_cexpression (full_expr_var.name), get_cvalue (expr)));
 
                foreach (LocalVariable local in temp_ref_vars) {
                        var ma = new MemberAccess.simple (local.name);
@@ -1124,7 +1124,7 @@ public class Vala.DovaBaseModule : CodeGenerator {
 
                expr_list.append_expression (get_variable_cexpression (full_expr_var.name));
 
-               expr.ccodenode = expr_list;
+               set_cvalue (expr, expr_list);
 
                temp_ref_vars.clear ();
        }
@@ -1184,7 +1184,7 @@ public class Vala.DovaBaseModule : CodeGenerator {
                        return;
                }
 
-               ccode.add_expression ((CCodeExpression) stmt.expression.ccodenode);
+               ccode.add_expression (get_cvalue (stmt.expression));
                /* free temporary objects and handle errors */
 
                foreach (LocalVariable local in temp_ref_vars) {
@@ -1297,31 +1297,31 @@ public class Vala.DovaBaseModule : CodeGenerator {
                }
 
                var ccall = new CCodeFunctionCall (get_destroy_func_expression (type));
-               ccall.add_argument ((CCodeExpression) stmt.expression.ccodenode);
+               ccall.add_argument (get_cvalue (stmt.expression));
                ccode.add_expression (ccall);
        }
 
        public override void visit_expression (Expression expr) {
-               if (expr.ccodenode != null && !expr.lvalue) {
+               if (get_cvalue (expr) != null && !expr.lvalue) {
                        // memory management, implicit casts, and boxing/unboxing
-                       expr.ccodenode = transform_expression ((CCodeExpression) expr.ccodenode, expr.value_type, expr.target_type, expr);
+                       set_cvalue (expr, transform_expression (get_cvalue (expr), expr.value_type, expr.target_type, expr));
                }
        }
 
        public override void visit_boolean_literal (BooleanLiteral expr) {
-               expr.ccodenode = new CCodeConstant (expr.value ? "true" : "false");
+               set_cvalue (expr, new CCodeConstant (expr.value ? "true" : "false"));
        }
 
        public override void visit_character_literal (CharacterLiteral expr) {
                if (expr.get_char () >= 0x20 && expr.get_char () < 0x80) {
-                       expr.ccodenode = new CCodeConstant (expr.value);
+                       set_cvalue (expr, new CCodeConstant (expr.value));
                } else {
-                       expr.ccodenode = new CCodeConstant ("%uU".printf (expr.get_char ()));
+                       set_cvalue (expr, new CCodeConstant ("%uU".printf (expr.get_char ())));
                }
        }
 
        public override void visit_integer_literal (IntegerLiteral expr) {
-               expr.ccodenode = new CCodeConstant (expr.value);
+               set_cvalue (expr, new CCodeConstant (expr.value));
        }
 
        public override void visit_real_literal (RealLiteral expr) {
@@ -1338,7 +1338,7 @@ public class Vala.DovaBaseModule : CodeGenerator {
                                c_literal += ".";
                        }
                }
-               expr.ccodenode = new CCodeConstant (c_literal);
+               set_cvalue (expr, new CCodeConstant (c_literal));
        }
 
        public override void visit_string_literal (StringLiteral expr) {
@@ -1346,16 +1346,16 @@ public class Vala.DovaBaseModule : CodeGenerator {
                var cliteral = new CCodeConstant ("\"\\0\" " + expr.value);
 
                var cbinary = new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, cliteral, new CCodeConstant ("1"));
-               expr.ccodenode = new CCodeCastExpression (cbinary, "string_t");
+               set_cvalue (expr, new CCodeCastExpression (cbinary, "string_t"));
        }
 
        public override void visit_null_literal (NullLiteral expr) {
-               expr.ccodenode = new CCodeConstant ("NULL");
+               set_cvalue (expr, new CCodeConstant ("NULL"));
        }
 
        public override void visit_base_access (BaseAccess expr) {
                generate_type_declaration (expr.value_type, cfile);
-               expr.ccodenode = new CCodeCastExpression (new CCodeIdentifier ("this"), expr.value_type.get_cname ());
+               set_cvalue (expr, new CCodeCastExpression (new CCodeIdentifier ("this"), expr.value_type.get_cname ()));
        }
 
        public override void visit_postfix_expression (PostfixExpression expr) {
@@ -1369,7 +1369,7 @@ public class Vala.DovaBaseModule : CodeGenerator {
                        // assign current value to temp variable
                        var temp_decl = get_temp_variable (prop.property_type, true, expr);
                        emit_temp_var (temp_decl);
-                       ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_decl.name), (CCodeExpression) expr.inner.ccodenode));
+                       ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_decl.name), get_cvalue (expr.inner)));
 
                        // increment/decrement property
                        var op = expr.increment ? CCodeBinaryOperator.PLUS : CCodeBinaryOperator.MINUS;
@@ -1380,13 +1380,13 @@ public class Vala.DovaBaseModule : CodeGenerator {
                        // return previous value
                        ccomma.append_expression (new CCodeIdentifier (temp_decl.name));
 
-                       expr.ccodenode = ccomma;
+                       set_cvalue (expr, ccomma);
                        return;
                }
 
                var op = expr.increment ? CCodeUnaryOperator.POSTFIX_INCREMENT : CCodeUnaryOperator.POSTFIX_DECREMENT;
 
-               expr.ccodenode = new CCodeUnaryExpression (op, (CCodeExpression) expr.inner.ccodenode);
+               set_cvalue (expr, new CCodeUnaryExpression (op, get_cvalue (expr.inner)));
        }
 
        private MemberAccess? find_property_access (Expression expr) {
@@ -1499,7 +1499,7 @@ public class Vala.DovaBaseModule : CodeGenerator {
                if (expr != null && expr.is_non_null ()
                    && !is_ref_function_void (expression_type)) {
                        // expression is non-null
-                       ccall.add_argument ((CCodeExpression) expr.ccodenode);
+                       ccall.add_argument (get_cvalue (expr));
 
                        return ccall;
                } else {
@@ -1613,7 +1613,7 @@ public class Vala.DovaBaseModule : CodeGenerator {
                        int i = 1;
                        Iterator<FormalParameter> params_it = params.iterator ();
                        foreach (Expression arg in expr.get_argument_list ()) {
-                               CCodeExpression cexpr = (CCodeExpression) arg.ccodenode;
+                               CCodeExpression cexpr = get_cvalue (arg);
                                FormalParameter param = null;
                                if (params_it.next ()) {
                                        param = params_it.get ();
@@ -1645,7 +1645,7 @@ public class Vala.DovaBaseModule : CodeGenerator {
                                 * parameter yet */
                                param.initializer.emit (this);
 
-                               creation_call.add_argument ((CCodeExpression) param.initializer.ccodenode);
+                               creation_call.add_argument (get_cvalue (param.initializer));
                                i++;
                        }
 
@@ -1693,21 +1693,21 @@ public class Vala.DovaBaseModule : CodeGenerator {
                                        } else {
                                                lhs = new CCodeMemberAccess.pointer (typed_inst, f.get_cname ());
                                        }
-                                       ccomma.append_expression (new CCodeAssignment (lhs, (CCodeExpression) init.initializer.ccodenode));
+                                       ccomma.append_expression (new CCodeAssignment (lhs, get_cvalue (init.initializer)));
                                } else if (init.symbol_reference is Property) {
                                        var inst_ma = new MemberAccess.simple ("new");
                                        inst_ma.value_type = expr.type_reference;
-                                       inst_ma.ccodenode = instance;
+                                       set_cvalue (inst_ma, instance);
                                        var ma = new MemberAccess (inst_ma, init.name);
-                                       ccomma.append_expression (get_property_set_call ((Property) init.symbol_reference, ma, (CCodeExpression) init.initializer.ccodenode));
+                                       ccomma.append_expression (get_property_set_call ((Property) init.symbol_reference, ma, get_cvalue (init.initializer)));
                                }
                        }
 
                        ccomma.append_expression (instance);
 
-                       expr.ccodenode = ccomma;
+                       set_cvalue (expr, ccomma);
                } else if (creation_expr != null) {
-                       expr.ccodenode = creation_expr;
+                       set_cvalue (expr, creation_expr);
                }
        }
 
@@ -1742,11 +1742,11 @@ public class Vala.DovaBaseModule : CodeGenerator {
        public override void visit_sizeof_expression (SizeofExpression expr) {
                var csizeof = new CCodeFunctionCall (new CCodeIdentifier ("sizeof"));
                csizeof.add_argument (new CCodeIdentifier (expr.type_reference.get_cname ()));
-               expr.ccodenode = csizeof;
+               set_cvalue (expr, csizeof);
        }
 
        public override void visit_typeof_expression (TypeofExpression expr) {
-               expr.ccodenode = get_type_id_expression (expr.type_reference);
+               set_cvalue (expr, get_type_id_expression (expr.type_reference));
        }
 
        public override void visit_unary_expression (UnaryExpression expr) {
@@ -1770,7 +1770,7 @@ public class Vala.DovaBaseModule : CodeGenerator {
                } else {
                        assert_not_reached ();
                }
-               expr.ccodenode = new CCodeUnaryExpression (op, (CCodeExpression) expr.inner.ccodenode);
+               set_cvalue (expr, new CCodeUnaryExpression (op, get_cvalue (expr.inner)));
        }
 
        public override void visit_cast_expression (CastExpression expr) {
@@ -1782,7 +1782,7 @@ public class Vala.DovaBaseModule : CodeGenerator {
                                emit_temp_var (temp_decl);
 
                                var ctemp = get_variable_cexpression (temp_decl.name);
-                               var cinit = new CCodeAssignment (ctemp, (CCodeExpression) expr.inner.ccodenode);
+                               var cinit = new CCodeAssignment (ctemp, get_cvalue (expr.inner));
                                var ccheck = create_type_check (ctemp, expr.type_reference);
                                var ccast = new CCodeCastExpression (ctemp, expr.type_reference.get_cname ());
                                var cnull = new CCodeConstant ("NULL");
@@ -1790,7 +1790,7 @@ public class Vala.DovaBaseModule : CodeGenerator {
                                ccomma.append_expression (cinit);
                                ccomma.append_expression (new CCodeConditionalExpression (ccheck, ccast, cnull));
 
-                               expr.ccodenode = ccomma;
+                               set_cvalue (expr, ccomma);
                        } else {
                                expr.error = true;
                                Report.error (expr.source_reference, "Operation not supported for this type");
@@ -1805,7 +1805,7 @@ public class Vala.DovaBaseModule : CodeGenerator {
                        var cvar = get_variable_cexpression (temp_decl.name);
 
                        var ccomma = new CCodeCommaExpression ();
-                       ccomma.append_expression (new CCodeAssignment (cvar, (CCodeExpression) expr.inner.ccodenode));
+                       ccomma.append_expression (new CCodeAssignment (cvar, get_cvalue (expr.inner)));
 
                        var to_any  = new CCodeFunctionCall (new CCodeIdentifier ("dova_type_value_to_any"));
                        to_any.add_argument (get_type_id_expression (expr.inner.value_type));
@@ -1813,7 +1813,7 @@ public class Vala.DovaBaseModule : CodeGenerator {
                        to_any.add_argument (new CCodeConstant ("0"));
                        ccomma.append_expression (to_any);
 
-                       expr.ccodenode = ccomma;
+                       set_cvalue (expr, ccomma);
                        return;
                } else if (expr.inner.value_type.data_type != null && expr.inner.value_type.data_type.get_full_name () == "Dova.Value") {
                        // unbox value
@@ -1828,14 +1828,14 @@ public class Vala.DovaBaseModule : CodeGenerator {
 
                        var to_any  = new CCodeFunctionCall (new CCodeIdentifier ("dova_type_value_from_any"));
                        to_any.add_argument (get_type_id_expression (expr.type_reference));
-                       to_any.add_argument ((CCodeExpression) expr.inner.ccodenode);
+                       to_any.add_argument (get_cvalue (expr.inner));
                        to_any.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, cvar));
                        to_any.add_argument (new CCodeConstant ("0"));
                        ccomma.append_expression (to_any);
 
                        ccomma.append_expression (cvar);
 
-                       expr.ccodenode = ccomma;
+                       set_cvalue (expr, ccomma);
                        return;
                }
 
@@ -1843,18 +1843,18 @@ public class Vala.DovaBaseModule : CodeGenerator {
 
                if (expr.inner.value_type is GenericType && !(expr.type_reference is GenericType)) {
                        // generic types use an extra pointer, dereference that pointer
-                       expr.ccodenode = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeCastExpression ((CCodeExpression) expr.inner.ccodenode, expr.type_reference.get_cname () + "*"));
+                       set_cvalue (expr, new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeCastExpression (get_cvalue (expr.inner), expr.type_reference.get_cname () + "*")));
                } else {
-                       expr.ccodenode = new CCodeCastExpression ((CCodeExpression) expr.inner.ccodenode, expr.type_reference.get_cname ());
+                       set_cvalue (expr, new CCodeCastExpression (get_cvalue (expr.inner), expr.type_reference.get_cname ()));
                }
        }
 
        public override void visit_pointer_indirection (PointerIndirection expr) {
-               expr.ccodenode = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, (CCodeExpression) expr.inner.ccodenode);
+               set_cvalue (expr, new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, get_cvalue (expr.inner)));
        }
 
        public override void visit_addressof_expression (AddressofExpression expr) {
-               expr.ccodenode = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, (CCodeExpression) expr.inner.ccodenode);
+               set_cvalue (expr, new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_cvalue (expr.inner)));
        }
 
        public override void visit_reference_transfer_expression (ReferenceTransferExpression expr) {
@@ -1864,15 +1864,15 @@ public class Vala.DovaBaseModule : CodeGenerator {
                emit_temp_var (temp_decl);
                var cvar = get_variable_cexpression (temp_decl.name);
 
-               ccomma.append_expression (new CCodeAssignment (cvar, (CCodeExpression) expr.inner.ccodenode));
-               ccomma.append_expression (new CCodeAssignment ((CCodeExpression) expr.inner.ccodenode, new CCodeConstant ("NULL")));
+               ccomma.append_expression (new CCodeAssignment (cvar, get_cvalue (expr.inner)));
+               ccomma.append_expression (new CCodeAssignment (get_cvalue (expr.inner), new CCodeConstant ("NULL")));
                ccomma.append_expression (cvar);
-               expr.ccodenode = ccomma;
+               set_cvalue (expr, ccomma);
        }
 
        public override void visit_binary_expression (BinaryExpression expr) {
-               var cleft = (CCodeExpression) expr.left.ccodenode;
-               var cright = (CCodeExpression) expr.right.ccodenode;
+               var cleft = get_cvalue (expr.left);
+               var cright = get_cvalue (expr.right);
 
                CCodeBinaryOperator op;
                if (expr.operator == BinaryOperator.PLUS) {
@@ -1912,7 +1912,7 @@ public class Vala.DovaBaseModule : CodeGenerator {
                } else if (expr.operator == BinaryOperator.OR) {
                        op = CCodeBinaryOperator.OR;
                } else if (expr.operator == BinaryOperator.IN) {
-                       expr.ccodenode = new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, new CCodeBinaryExpression (CCodeBinaryOperator.BITWISE_AND, cright, cleft), cleft);
+                       set_cvalue (expr, new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, new CCodeBinaryExpression (CCodeBinaryOperator.BITWISE_AND, cright, cleft), cleft));
                        return;
                } else {
                        assert_not_reached ();
@@ -1949,7 +1949,7 @@ public class Vala.DovaBaseModule : CodeGenerator {
                        }
                }
 
-               expr.ccodenode = new CCodeBinaryExpression (op, cleft, cright);
+               set_cvalue (expr, new CCodeBinaryExpression (op, cleft, cright));
        }
 
        CCodeExpression? create_type_check (CCodeNode ccodenode, DataType type) {
@@ -1962,8 +1962,8 @@ public class Vala.DovaBaseModule : CodeGenerator {
        public override void visit_type_check (TypeCheck expr) {
                generate_type_declaration (expr.type_reference, cfile);
 
-               expr.ccodenode = create_type_check (expr.expression.ccodenode, expr.type_reference);
-               if (expr.ccodenode is CCodeInvalidExpression) {
+               set_cvalue (expr, create_type_check (get_cvalue (expr.expression), expr.type_reference));
+               if (get_cvalue (expr) is CCodeInvalidExpression) {
                        Report.error (expr.source_reference, "type check expressions not supported for compact classes, structs, and enums");
                }
        }
@@ -1975,7 +1975,7 @@ public class Vala.DovaBaseModule : CodeGenerator {
 
                l.accept_children (this);
 
-               l.ccodenode = new CCodeIdentifier (l.method.get_cname ());
+               set_cvalue (l, new CCodeIdentifier (l.method.get_cname ()));
        }
 
        // manage memory and implicit casts
@@ -2231,6 +2231,14 @@ public class Vala.DovaBaseModule : CodeGenerator {
                return null;
        }
 
+       public CCodeExpression? get_cvalue (Expression expr) {
+               return (CCodeExpression) expr.ccodenode;
+       }
+
+       public void set_cvalue (Expression expr, CCodeExpression? cvalue) {
+               expr.ccodenode = cvalue;
+       }
+
        public CCodeNode? get_ccodenode (CodeNode node) {
                if (node.ccodenode == null) {
                        node.emit (this);
index 93894ed46eecd4822a36296d0341a7c6106bc3d6..ac17c14dd3469c1cdd96dfbec764be0004f7952a 100644 (file)
@@ -22,7 +22,7 @@
 
 public class Vala.DovaControlFlowModule : DovaMethodModule {
        public override void visit_if_statement (IfStatement stmt) {
-               ccode.open_if ((CCodeExpression) stmt.condition.ccodenode);
+               ccode.open_if (get_cvalue (stmt.condition));
 
                stmt.true_statement.emit (this);
 
@@ -35,7 +35,7 @@ public class Vala.DovaControlFlowModule : DovaMethodModule {
        }
 
        public override void visit_switch_statement (SwitchStatement stmt) {
-               ccode.open_switch ((CCodeExpression) stmt.expression.ccodenode);
+               ccode.open_switch (get_cvalue (stmt.expression));
 
                foreach (SwitchSection section in stmt.get_sections ()) {
                        if (section.has_default_label ()) {
@@ -53,7 +53,7 @@ public class Vala.DovaControlFlowModule : DovaMethodModule {
 
                        visit_end_full_expression (label.expression);
 
-                       ccode.add_case ((CCodeExpression) label.expression.ccodenode);
+                       ccode.add_case (get_cvalue (label.expression));
                }
        }
 
index be2fcafd2c2d239635f467df1f66777a321b7bcc..f4d9d37e6ab631c8eef0a7445433ac66eb07e0a9 100644 (file)
@@ -27,7 +27,7 @@ public class Vala.DovaErrorModule : DovaDelegateModule {
        private bool is_in_catch = false;
 
        public override void visit_throw_statement (ThrowStatement stmt) {
-               ccode.add_expression (new CCodeAssignment (new CCodeIdentifier ("dova_error"), (CCodeExpression) stmt.error_expression.ccodenode));
+               ccode.add_expression (new CCodeAssignment (new CCodeIdentifier ("dova_error"), get_cvalue (stmt.error_expression)));
 
                add_simple_check (stmt, true);
        }
index 3e87b0514da8ac16a0ff278777c56f3866c8ee2a..5e6f0d9b29133bcc77d0f855b2e162d034a85bbc 100644 (file)
@@ -28,7 +28,7 @@ public class Vala.DovaMemberAccessModule : DovaControlFlowModule {
                DataType base_type = null;
 
                if (expr.inner != null) {
-                       pub_inst = (CCodeExpression) expr.inner.ccodenode;
+                       pub_inst = get_cvalue (expr.inner);
 
                        if (expr.inner.value_type != null) {
                                base_type = expr.inner.value_type;
@@ -54,12 +54,12 @@ public class Vala.DovaMemberAccessModule : DovaControlFlowModule {
                                if (m.base_method != null) {
                                        var base_class = (Class) m.base_method.parent_symbol;
 
-                                       expr.ccodenode = new CCodeIdentifier ("%s_base_%s".printf (base_class.get_lower_case_cname (null), m.name));
+                                       set_cvalue (expr, new CCodeIdentifier ("%s_base_%s".printf (base_class.get_lower_case_cname (null), m.name)));
                                        return;
                                } else if (m.base_interface_method != null) {
                                        var base_iface = (Interface) m.base_interface_method.parent_symbol;
 
-                                       expr.ccodenode = new CCodeIdentifier ("%s_base_%s".printf (base_iface.get_lower_case_cname (null), m.name));
+                                       set_cvalue (expr, new CCodeIdentifier ("%s_base_%s".printf (base_iface.get_lower_case_cname (null), m.name)));
                                        return;
                                }
                        }
@@ -74,28 +74,28 @@ public class Vala.DovaMemberAccessModule : DovaControlFlowModule {
                                                emit_temp_var (temp_var);
                                                var ctemp = new CCodeIdentifier (temp_var.name);
                                                inst = new CCodeAssignment (ctemp, pub_inst);
-                                               expr.inner.ccodenode = ctemp;
+                                               set_cvalue (expr.inner, ctemp);
                                        }
                                        var base_class = (Class) m.base_method.parent_symbol;
                                        var vclass = new CCodeFunctionCall (new CCodeIdentifier ("%s_GET_CLASS".printf (base_class.get_upper_case_cname (null))));
                                        vclass.add_argument (inst);
-                                       expr.ccodenode = new CCodeMemberAccess.pointer (vclass, m.name);
+                                       set_cvalue (expr, new CCodeMemberAccess.pointer (vclass, m.name));
                                } else {
-                                       expr.ccodenode = new CCodeIdentifier (m.base_method.get_cname ());
+                                       set_cvalue (expr, new CCodeIdentifier (m.base_method.get_cname ()));
                                }
                        } else if (m.base_interface_method != null) {
-                               expr.ccodenode = new CCodeIdentifier (m.base_interface_method.get_cname ());
+                               set_cvalue (expr, new CCodeIdentifier (m.base_interface_method.get_cname ()));
                        } else if (m is CreationMethod) {
-                               expr.ccodenode = new CCodeIdentifier (m.get_real_cname ());
+                               set_cvalue (expr, new CCodeIdentifier (m.get_real_cname ()));
                        } else {
-                               expr.ccodenode = new CCodeIdentifier (m.get_cname ());
+                               set_cvalue (expr, new CCodeIdentifier (m.get_cname ()));
                        }
                } else if (expr.symbol_reference is ArrayLengthField) {
                        generate_property_accessor_declaration (((Property) array_class.scope.lookup ("length")).get_accessor, cfile);
 
                        var ccall = new CCodeFunctionCall (new CCodeIdentifier ("dova_array_get_length"));
                        ccall.add_argument (pub_inst);
-                       expr.ccodenode = ccall;
+                       set_cvalue (expr, ccall);
                } else if (expr.symbol_reference is Field) {
                        var f = (Field) expr.symbol_reference;
                        if (f.binding == MemberBinding.INSTANCE) {
@@ -116,27 +116,27 @@ public class Vala.DovaMemberAccessModule : DovaControlFlowModule {
                                        inst = pub_inst;
                                }
                                if (instance_target_type.data_type.is_reference_type () || (expr.inner != null && expr.inner.value_type is PointerType)) {
-                                       expr.ccodenode = new CCodeMemberAccess.pointer (inst, f.get_cname ());
+                                       set_cvalue (expr, new CCodeMemberAccess.pointer (inst, f.get_cname ()));
                                } else {
-                                       expr.ccodenode = new CCodeMemberAccess (inst, f.get_cname ());
+                                       set_cvalue (expr, new CCodeMemberAccess (inst, f.get_cname ()));
                                }
                        } else {
                                generate_field_declaration (f, cfile);
 
-                               expr.ccodenode = new CCodeIdentifier (f.get_cname ());
+                               set_cvalue (expr, new CCodeIdentifier (f.get_cname ()));
                        }
                } else if (expr.symbol_reference is EnumValue) {
                        var ev = (EnumValue) expr.symbol_reference;
 
                        generate_enum_declaration ((Enum) ev.parent_symbol, cfile);
 
-                       expr.ccodenode = new CCodeConstant (ev.get_cname ());
+                       set_cvalue (expr, new CCodeConstant (ev.get_cname ()));
                } else if (expr.symbol_reference is Constant) {
                        var c = (Constant) expr.symbol_reference;
 
                        generate_constant_declaration (c, cfile);
 
-                       expr.ccodenode = new CCodeIdentifier (c.get_cname ());
+                       set_cvalue (expr, new CCodeIdentifier (c.get_cname ()));
                } else if (expr.symbol_reference is Property) {
                        var prop = (Property) expr.symbol_reference;
 
@@ -159,16 +159,16 @@ public class Vala.DovaMemberAccessModule : DovaControlFlowModule {
                                        vcast.add_argument (new CCodeIdentifier ("%s_parent_class".printf (current_class.get_lower_case_cname (null))));
 
                                        var ccall = new CCodeFunctionCall (new CCodeMemberAccess.pointer (vcast, "get_%s".printf (prop.name)));
-                                       ccall.add_argument ((CCodeExpression) expr.inner.ccodenode);
-                                       expr.ccodenode = ccall;
+                                       ccall.add_argument (get_cvalue (expr.inner));
+                                       set_cvalue (expr, ccall);
                                        return;
                                } else if (prop.base_interface_property != null) {
                                        var base_iface = (Interface) prop.base_interface_property.parent_symbol;
                                        string parent_iface_var = "%s_%s_parent_iface".printf (current_class.get_lower_case_cname (null), base_iface.get_lower_case_cname (null));
 
                                        var ccall = new CCodeFunctionCall (new CCodeMemberAccess.pointer (new CCodeIdentifier (parent_iface_var), "get_%s".printf (prop.name)));
-                                       ccall.add_argument ((CCodeExpression) expr.inner.ccodenode);
-                                       expr.ccodenode = ccall;
+                                       ccall.add_argument (get_cvalue (expr.inner));
+                                       set_cvalue (expr, ccall);
                                        return;
                                }
                        }
@@ -186,31 +186,31 @@ public class Vala.DovaMemberAccessModule : DovaControlFlowModule {
                                ccall.add_argument (pub_inst);
                        }
 
-                       expr.ccodenode = ccall;
+                       set_cvalue (expr, ccall);
                } else if (expr.symbol_reference is LocalVariable) {
                        var local = (LocalVariable) expr.symbol_reference;
                        if (local.is_result) {
                                // used in postconditions
-                               expr.ccodenode = new CCodeIdentifier ("result");
+                               set_cvalue (expr, new CCodeIdentifier ("result"));
                        } else if (local.captured) {
                                // captured variables are stored on the heap
                                var block = (Block) local.parent_symbol;
-                               expr.ccodenode = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_variable_cname (local.name));
+                               set_cvalue (expr, new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_variable_cname (local.name)));
                        } else {
-                               expr.ccodenode = get_variable_cexpression (local.name);
+                               set_cvalue (expr, get_variable_cexpression (local.name));
                        }
                } else if (expr.symbol_reference is FormalParameter) {
                        var p = (FormalParameter) expr.symbol_reference;
                        if (p.name == "this") {
                                if (current_method != null && current_method.coroutine) {
                                        // use closure
-                                       expr.ccodenode = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "this");
+                                       set_cvalue (expr, new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "this"));
                                } else {
                                        var st = current_type_symbol as Struct;
                                        if (st != null && !st.is_boolean_type () && !st.is_integer_type () && !st.is_floating_type () && (!st.is_simple_type () || current_method is CreationMethod)) {
-                                               expr.ccodenode = new CCodeIdentifier ("(*this)");
+                                               set_cvalue (expr, new CCodeIdentifier ("(*this)"));
                                        } else {
-                                               expr.ccodenode = new CCodeIdentifier ("this");
+                                               set_cvalue (expr, new CCodeIdentifier ("this"));
                                        }
                                }
                        } else {
@@ -220,19 +220,19 @@ public class Vala.DovaMemberAccessModule : DovaControlFlowModule {
                                        if (block == null) {
                                                block = ((Method) p.parent_symbol).body;
                                        }
-                                       expr.ccodenode = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_variable_cname (p.name));
+                                       set_cvalue (expr, new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_variable_cname (p.name)));
                                } else {
                                        if (current_method != null && current_method.coroutine) {
                                                // use closure
-                                               expr.ccodenode = get_variable_cexpression (p.name);
+                                               set_cvalue (expr, get_variable_cexpression (p.name));
                                        } else {
                                                var type_as_struct = p.variable_type.data_type as Struct;
                                                if (p.direction != ParameterDirection.IN
                                                    || (type_as_struct != null && !type_as_struct.is_simple_type () && !p.variable_type.nullable)) {
                                                        if (p.variable_type is GenericType) {
-                                                               expr.ccodenode = get_variable_cexpression (p.name);
+                                                               set_cvalue (expr, get_variable_cexpression (p.name));
                                                        } else {
-                                                               expr.ccodenode = new CCodeIdentifier ("(*%s)".printf (get_variable_cname (p.name)));
+                                                               set_cvalue (expr, new CCodeIdentifier ("(*%s)".printf (get_variable_cname (p.name))));
                                                        }
                                                } else {
                                                        // Property setters of non simple structs shall replace all occurences
@@ -242,9 +242,9 @@ public class Vala.DovaMemberAccessModule : DovaControlFlowModule {
                                                            current_property_accessor.writable &&
                                                            current_property_accessor.value_parameter == p &&
                                                            current_property_accessor.prop.property_type.is_real_struct_type ()) {
-                                                               expr.ccodenode = new CCodeIdentifier ("(*value)");
+                                                               set_cvalue (expr, new CCodeIdentifier ("(*value)"));
                                                        } else {
-                                                               expr.ccodenode = get_variable_cexpression (p.name);
+                                                               set_cvalue (expr, get_variable_cexpression (p.name));
                                                        }
                                                }
                                        }
index 958aa2635a6afb6d574c8e07fcd77ffe4aaade62..852185eda146e44b5a464ac20db9393a514cf08e 100644 (file)
@@ -23,7 +23,7 @@
 public class Vala.DovaMethodCallModule : DovaAssignmentModule {
        public override void visit_method_call (MethodCall expr) {
                // the bare function call
-               var ccall = new CCodeFunctionCall ((CCodeExpression) expr.call.ccodenode);
+               var ccall = new CCodeFunctionCall (get_cvalue (expr.call));
 
                Method m = null;
                Delegate deleg = null;
@@ -46,7 +46,7 @@ public class Vala.DovaMethodCallModule : DovaAssignmentModule {
                } else if (itype is DelegateType) {
                        deleg = ((DelegateType) itype).delegate_symbol;
                        ccall = new CCodeFunctionCall (new CCodeIdentifier ("%s_invoke".printf (deleg.get_lower_case_cname ())));
-                       ccall.add_argument ((CCodeExpression) expr.call.ccodenode);
+                       ccall.add_argument (get_cvalue (expr.call));
                }
 
                if (m is CreationMethod) {
@@ -59,11 +59,11 @@ public class Vala.DovaMethodCallModule : DovaAssignmentModule {
                        }
                } else if (m != null) {
                        if (m.binding == MemberBinding.INSTANCE) {
-                               var instance = (CCodeExpression) ma.inner.ccodenode;
+                               var instance = get_cvalue (ma.inner);
 
                                if (ma.member_name == "begin" && ma.inner.symbol_reference == ma.symbol_reference) {
                                        var inner_ma = (MemberAccess) ma.inner;
-                                       instance = (CCodeExpression) inner_ma.inner.ccodenode;
+                                       instance = get_cvalue (inner_ma.inner);
                                }
 
                                var st = m.parent_symbol as Struct;
@@ -116,7 +116,7 @@ public class Vala.DovaMethodCallModule : DovaAssignmentModule {
                int i = 1;
                Iterator<FormalParameter> params_it = params.iterator ();
                foreach (Expression arg in expr.get_argument_list ()) {
-                       CCodeExpression cexpr = (CCodeExpression) arg.ccodenode;
+                       CCodeExpression cexpr = get_cvalue (arg);
 
                        if (params_it.next ()) {
                                var param = params_it.get ();
@@ -140,7 +140,7 @@ public class Vala.DovaMethodCallModule : DovaAssignmentModule {
 
                                                if (param.direction == ParameterDirection.REF) {
                                                        var crefcomma = new CCodeCommaExpression ();
-                                                       crefcomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_var.name), (CCodeExpression) unary.inner.ccodenode));
+                                                       crefcomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_var.name), get_cvalue (unary.inner)));
                                                        crefcomma.append_expression (cexpr);
                                                        cexpr = crefcomma;
                                                }
@@ -163,12 +163,12 @@ public class Vala.DovaMethodCallModule : DovaAssignmentModule {
                                                cassign_comma.append_expression (new CCodeAssignment (get_variable_cexpression (assign_temp_var.name), transform_expression (get_variable_cexpression (temp_var.name), param.variable_type, unary.inner.value_type, arg)));
 
                                                // unref old value
-                                               cassign_comma.append_expression (get_unref_expression ((CCodeExpression) unary.inner.ccodenode, arg.value_type, arg));
+                                               cassign_comma.append_expression (get_unref_expression (get_cvalue (unary.inner), arg.value_type, arg));
 
                                                cassign_comma.append_expression (get_variable_cexpression (assign_temp_var.name));
 
                                                // assign new value
-                                               ccomma.append_expression (new CCodeAssignment ((CCodeExpression) unary.inner.ccodenode, cassign_comma));
+                                               ccomma.append_expression (new CCodeAssignment (get_cvalue (unary.inner), cassign_comma));
 
                                                // return value
                                                if (!(itype.get_return_type () is VoidType)) {
@@ -218,7 +218,7 @@ public class Vala.DovaMethodCallModule : DovaAssignmentModule {
                        ccall_expr = ccomma;
                }
 
-               expr.ccodenode = ccall_expr;
+               set_cvalue (expr, ccall_expr);
        }
 }
 
index 768d9a28cd17769150028cbb79ff9998586d603d..7a0e7ba9143a327c2804b492851f8194fad45b28 100644 (file)
@@ -783,9 +783,9 @@ public class Vala.DovaObjectModule : DovaArrayModule {
 
                                        var field_st = f.parent_symbol as Struct;
                                        if (field_st != null && !field_st.is_simple_type ()) {
-                                               this_access.ccodenode = new CCodeIdentifier ("(*this)");
+                                               set_cvalue (this_access, new CCodeIdentifier ("(*this)"));
                                        } else {
-                                               this_access.ccodenode = new CCodeIdentifier ("this");
+                                               set_cvalue (this_access, new CCodeIdentifier ("this"));
                                        }
 
                                        var ma = new MemberAccess (this_access, f.name);
@@ -1945,24 +1945,24 @@ public class Vala.DovaObjectModule : DovaArrayModule {
                        expr.accept_children (this);
 
                        List<Expression> indices = expr.get_indices ();
-                       var cindex = (CCodeExpression) indices[0].ccodenode;
+                       var cindex = get_cvalue (indices[0]);
 
                        if (array_type.inline_allocated) {
-                               expr.ccodenode = new CCodeElementAccess ((CCodeExpression) expr.container.ccodenode, cindex);
+                               set_cvalue (expr, new CCodeElementAccess (get_cvalue (expr.container), cindex));
                        } else {
                                generate_property_accessor_declaration (((Property) array_class.scope.lookup ("data")).get_accessor, cfile);
 
                                var ccontainer = new CCodeFunctionCall (new CCodeIdentifier ("dova_array_get_data"));
-                               ccontainer.add_argument ((CCodeExpression) expr.container.ccodenode);
+                               ccontainer.add_argument (get_cvalue (expr.container));
 
                                if (array_type.element_type is GenericType) {
                                        // generic array
                                        // calculate offset in bytes based on value size
                                        var value_size = new CCodeFunctionCall (new CCodeIdentifier ("dova_type_get_value_size"));
                                        value_size.add_argument (get_type_id_expression (array_type.element_type));
-                                       expr.ccodenode = new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, new CCodeCastExpression (ccontainer, "char*"), new CCodeBinaryExpression (CCodeBinaryOperator.MUL, value_size, cindex));
+                                       set_cvalue (expr, new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, new CCodeCastExpression (ccontainer, "char*"), new CCodeBinaryExpression (CCodeBinaryOperator.MUL, value_size, cindex)));
                                } else {
-                                       expr.ccodenode = new CCodeElementAccess (new CCodeCastExpression (ccontainer, "%s*".printf (array_type.element_type.get_cname ())), cindex);
+                                       set_cvalue (expr, new CCodeElementAccess (new CCodeCastExpression (ccontainer, "%s*".printf (array_type.element_type.get_cname ())), cindex));
                                }
                        }
 
@@ -1976,7 +1976,7 @@ public class Vala.DovaObjectModule : DovaArrayModule {
                        field.initializer.emit (this);
 
                        var lhs = new CCodeIdentifier (field.get_cname ());
-                       var rhs = (CCodeExpression) field.initializer.ccodenode;
+                       var rhs = get_cvalue (field.initializer);
 
                        ccode.add_expression (new CCodeAssignment (lhs, rhs));
                }
index d9eea58103702225ee056e958d9a6db6ffa10a4a..5a056dd37af29060f0c515fc242bbeae6a5bb927 100644 (file)
@@ -312,7 +312,7 @@ public class Vala.DovaValueModule : DovaObjectModule {
                                if (requires_destroy (f.variable_type))  {
                                        var this_access = new MemberAccess.simple ("this");
                                        this_access.value_type = get_data_type_for_symbol ((TypeSymbol) f.parent_symbol);
-                                       this_access.ccodenode = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, dest);
+                                       set_cvalue (this_access, new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, dest));
                                        var ma = new MemberAccess (this_access, f.name);
                                        ma.symbol_reference = f;
                                        ma.value_type = f.variable_type.copy ();
@@ -349,7 +349,7 @@ public class Vala.DovaValueModule : DovaObjectModule {
                                        if (requires_copy (f.variable_type))  {
                                                var this_access = new MemberAccess.simple ("this");
                                                this_access.value_type = get_data_type_for_symbol ((TypeSymbol) f.parent_symbol);
-                                               this_access.ccodenode = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, src);
+                                               set_cvalue (this_access, new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, src));
                                                var ma = new MemberAccess (this_access, f.name);
                                                ma.symbol_reference = f;
                                                copy = get_ref_cexpression (f.variable_type, copy, ma, f);
@@ -383,7 +383,7 @@ public class Vala.DovaValueModule : DovaObjectModule {
 
                if (src is NullLiteral) {
                        // TODO destroy dest
-                       assignment.ccodenode = new CCodeConstant ("0");
+                       set_cvalue (assignment, new CCodeConstant ("0"));
                        return;
                }
 
@@ -438,7 +438,7 @@ public class Vala.DovaValueModule : DovaObjectModule {
                ccall.add_argument (dest_index);
                ccall.add_argument (csrc);
                ccall.add_argument (src_index);
-               assignment.ccodenode = ccall;
+               set_cvalue (assignment, ccall);
        }
 
        public override void visit_binary_expression (BinaryExpression expr) {
@@ -486,9 +486,9 @@ public class Vala.DovaValueModule : DovaObjectModule {
                ccall.add_argument (right_index);
 
                if (expr.operator == BinaryOperator.EQUALITY) {
-                       expr.ccodenode = ccall;
+                       set_cvalue (expr, ccall);
                } else {
-                       expr.ccodenode = new CCodeUnaryExpression (CCodeUnaryOperator.LOGICAL_NEGATION, ccall);
+                       set_cvalue (expr, new CCodeUnaryExpression (CCodeUnaryOperator.LOGICAL_NEGATION, ccall));
                }
        }
 
@@ -527,7 +527,7 @@ public class Vala.DovaValueModule : DovaObjectModule {
                        ccall.add_argument (cval);
                        ccall.add_argument (val_index);
 
-                       expr.ccodenode = ccall;
+                       set_cvalue (expr, ccall);
                }
        }
 
@@ -550,7 +550,7 @@ public class Vala.DovaValueModule : DovaObjectModule {
 
                        int i = 0;
                        foreach (Expression e in expr.get_expressions ()) {
-                               ce.append_expression (new CCodeAssignment (new CCodeElementAccess (name_cnode, new CCodeConstant (i.to_string ())), (CCodeExpression) e.ccodenode));
+                               ce.append_expression (new CCodeAssignment (new CCodeElementAccess (name_cnode, new CCodeConstant (i.to_string ())), get_cvalue (e)));
                                i++;
                        }
 
@@ -562,7 +562,7 @@ public class Vala.DovaValueModule : DovaObjectModule {
                list_creation.add_argument (new CCodeConstant (length.to_string ()));
                list_creation.add_argument (ce);
 
-               expr.ccodenode = list_creation;
+               set_cvalue (expr, list_creation);
        }
 
        public override void visit_set_literal (SetLiteral expr) {
@@ -584,7 +584,7 @@ public class Vala.DovaValueModule : DovaObjectModule {
 
                        int i = 0;
                        foreach (Expression e in expr.get_expressions ()) {
-                               ce.append_expression (new CCodeAssignment (new CCodeElementAccess (name_cnode, new CCodeConstant (i.to_string ())), (CCodeExpression) e.ccodenode));
+                               ce.append_expression (new CCodeAssignment (new CCodeElementAccess (name_cnode, new CCodeConstant (i.to_string ())), get_cvalue (e)));
                                i++;
                        }
 
@@ -596,7 +596,7 @@ public class Vala.DovaValueModule : DovaObjectModule {
                set_creation.add_argument (new CCodeConstant (length.to_string ()));
                set_creation.add_argument (ce);
 
-               expr.ccodenode = set_creation;
+               set_cvalue (expr, set_creation);
        }
 
        public override void visit_map_literal (MapLiteral expr) {
@@ -629,8 +629,8 @@ public class Vala.DovaValueModule : DovaObjectModule {
                        emit_temp_var (value_temp_var);
 
                        for (int i = 0; i < length; i++) {
-                               key_ce.append_expression (new CCodeAssignment (new CCodeElementAccess (key_name_cnode, new CCodeConstant (i.to_string ())), (CCodeExpression) expr.get_keys ().get (i).ccodenode));
-                               value_ce.append_expression (new CCodeAssignment (new CCodeElementAccess (value_name_cnode, new CCodeConstant (i.to_string ())), (CCodeExpression) expr.get_values ().get (i).ccodenode));
+                               key_ce.append_expression (new CCodeAssignment (new CCodeElementAccess (key_name_cnode, new CCodeConstant (i.to_string ())), get_cvalue (expr.get_keys ().get (i))));
+                               value_ce.append_expression (new CCodeAssignment (new CCodeElementAccess (value_name_cnode, new CCodeConstant (i.to_string ())), get_cvalue (expr.get_values ().get (i))));
                        }
 
                        key_ce.append_expression (key_name_cnode);
@@ -644,7 +644,7 @@ public class Vala.DovaValueModule : DovaObjectModule {
                map_creation.add_argument (key_ce);
                map_creation.add_argument (value_ce);
 
-               expr.ccodenode = map_creation;
+               set_cvalue (expr, map_creation);
        }
 
        public override void visit_tuple (Tuple tuple) {
@@ -675,7 +675,7 @@ public class Vala.DovaValueModule : DovaObjectModule {
 
                        type_ce.append_expression (new CCodeAssignment (new CCodeElementAccess (type_name_cnode, new CCodeConstant (i.to_string ())), get_type_id_expression (element_type)));
 
-                       var cexpr = (CCodeExpression) e.ccodenode;
+                       var cexpr = get_cvalue (e);
 
                        var unary = cexpr as CCodeUnaryExpression;
                        if (unary != null && unary.operator == CCodeUnaryOperator.POINTER_INDIRECTION) {
@@ -706,6 +706,6 @@ public class Vala.DovaValueModule : DovaObjectModule {
                tuple_creation.add_argument (type_ce);
                tuple_creation.add_argument (ce);
 
-               tuple.ccodenode = tuple_creation;
+               set_cvalue (tuple, tuple_creation);
        }
 }
index d347f5bbb8342b4117545e2f118234962d89c46d..f6401ca9e8018b23be562e634ae48754f07747f9 100644 (file)
@@ -555,7 +555,7 @@ public class Vala.GAsyncModule : GSignalModule {
                        return;
                }
 
-               ccode.add_expression ((CCodeExpression) stmt.yield_expression.ccodenode);
+               ccode.add_expression (get_cvalue (stmt.yield_expression));
 
                if (stmt.tree_can_fail && stmt.yield_expression.tree_can_fail) {
                        // simple case, no node breakdown necessary
index a1ebeb42569e06263d93257f6d59e9355d65e32e..d4d038ee724a8310c0e4e8c223108916cb6619f1 100644 (file)
@@ -266,31 +266,31 @@ public class Vala.GDBusClientModule : GDBusModule {
                var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_initable_new"));
                ccall.add_argument (new CCodeIdentifier ("%s_PROXY".printf (iface.get_type_id ())));
                cancellable.emit (this);
-               ccall.add_argument ((CCodeExpression) cancellable.ccodenode);
+               ccall.add_argument (get_cvalue (cancellable));
                ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_variable_cexpression ("_inner_error_")));
                ccall.add_argument (new CCodeConstant ("\"g-flags\""));
                ccall.add_argument (new CCodeConstant ("G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES"));
                ccall.add_argument (new CCodeConstant ("\"g-name\""));
                name.emit (this);
-               ccall.add_argument ((CCodeExpression) name.ccodenode);
+               ccall.add_argument (get_cvalue (name));
                if (bus_get_proxy_sync) {
                        Expression bus_type = args.get (0);
                        ccall.add_argument (new CCodeConstant ("\"g-bus-type\""));
                        bus_type.emit (this);
-                       ccall.add_argument ((CCodeExpression) bus_type.ccodenode);
+                       ccall.add_argument (get_cvalue (bus_type));
                } else {
                        Expression connection = ((MemberAccess) expr.call).inner;
                        ccall.add_argument (new CCodeConstant ("\"g-connection\""));
                        connection.emit (this);
-                       ccall.add_argument ((CCodeExpression) connection.ccodenode);
+                       ccall.add_argument (get_cvalue (connection));
                }
                ccall.add_argument (new CCodeConstant ("\"g-object-path\""));
                object_path.emit (this);
-               ccall.add_argument ((CCodeExpression) object_path.ccodenode);
+               ccall.add_argument (get_cvalue (object_path));
                ccall.add_argument (new CCodeConstant ("\"g-interface-name\""));
                ccall.add_argument (new CCodeConstant ("\"%s\"".printf (get_dbus_name (iface))));
                ccall.add_argument (new CCodeConstant ("NULL"));
-               expr.ccodenode = ccall;
+               set_cvalue (expr, ccall);
        }
 
        string generate_dbus_signal_handler (Signal sig, ObjectTypeSymbol sym) {
index 01f7fa2a59ee680db44c9f836f35297ef80aaab3..9ac6487ae3aff35b5f2614a9d3f286770b6d5d23 100644 (file)
@@ -1049,11 +1049,11 @@ public class Vala.GDBusServerModule : GDBusClientModule {
                current_method_inner_error = true;
 
                var cregister = new CCodeFunctionCall (new CCodeIdentifier ("%sregister_object".printf (type_arg.type_symbol.get_lower_case_cprefix ())));
-               cregister.add_argument ((CCodeExpression) obj_arg.ccodenode);
-               cregister.add_argument ((CCodeExpression) ma.inner.ccodenode);
-               cregister.add_argument ((CCodeExpression) path_arg.ccodenode);
+               cregister.add_argument (get_cvalue (obj_arg));
+               cregister.add_argument (get_cvalue (ma.inner));
+               cregister.add_argument (get_cvalue (path_arg));
                cregister.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_variable_cexpression ("_inner_error_")));
-               expr.ccodenode = cregister;
+               set_cvalue (expr, cregister);
        }
 
        public override void generate_class_declaration (Class cl, CCodeFile decl_space) {
index b08b825c2c7f9293d851d20adc7960a849831f56..ec0d56fa7b14bcf2c6a028cf50c03c8cfcbc8076 100644 (file)
@@ -40,7 +40,7 @@ public class Vala.GErrorModule : CCodeDelegateModule {
                                cenum.add_value (new CCodeEnumValue (ecode.get_cname ()));
                        } else {
                                ecode.value.emit (this);
-                               cenum.add_value (new CCodeEnumValue (ecode.get_cname (), (CCodeExpression) ecode.value.ccodenode));
+                               cenum.add_value (new CCodeEnumValue (ecode.get_cname (), get_cvalue (ecode.value)));
                        }
                }
 
@@ -87,7 +87,7 @@ public class Vala.GErrorModule : CCodeDelegateModule {
        public override void visit_throw_statement (ThrowStatement stmt) {
                // method will fail
                current_method_inner_error = true;
-               ccode.add_expression (new CCodeAssignment (get_variable_cexpression ("_inner_error_"), (CCodeExpression) stmt.error_expression.ccodenode));
+               ccode.add_expression (new CCodeAssignment (get_variable_cexpression ("_inner_error_"), get_cvalue (stmt.error_expression)));
 
                add_simple_check (stmt, true);
        }
index ed52d8530aee10deb5c2646b3f25b43fc5b19114..f30077cbd492bd0e5a28f1835e20692554f76763 100644 (file)
@@ -748,7 +748,7 @@ public class Vala.GObjectModule : GTypeModule {
                                var ccomma = new CCodeCommaExpression ();
                                var temp_var = get_temp_variable (expr.value_type, false, expr, false);
                                emit_temp_var (temp_var);
-                               ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_var.name), (CCodeExpression) expr.ccodenode));
+                               ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_var.name), get_cvalue (expr)));
 
                                var initiallyunowned_ccall = new CCodeFunctionCall (new CCodeIdentifier ("G_IS_INITIALLY_UNOWNED"));
                                initiallyunowned_ccall.add_argument (get_variable_cexpression (temp_var.name));
@@ -756,7 +756,7 @@ public class Vala.GObjectModule : GTypeModule {
                                sink_ref_ccall.add_argument (get_variable_cexpression (temp_var.name));
                                ccomma.append_expression (new CCodeConditionalExpression (initiallyunowned_ccall, sink_ref_ccall, get_variable_cexpression (temp_var.name)));
 
-                               expr.ccodenode = ccomma;
+                               set_cvalue (expr, ccomma);
                                return;
                        } else if (ma.symbol_reference == gobject_type) {
                                // Object (...) chain up
index 8b90ef4c063650a6bc8a7ed8c0fc66e75f496172..5dcd326cb4c579a546bdc38e7ffc77ee833cbe8a 100644 (file)
@@ -169,7 +169,7 @@ public class Vala.GSignalModule : GObjectModule {
 
                var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_strconcat"));
                ccall.add_argument (sig.get_canonical_cconstant (""));
-               ccall.add_argument ((CCodeExpression) detail_expr.ccodenode);
+               ccall.add_argument (get_cvalue (detail_expr));
                ccall.add_argument (new CCodeConstant ("NULL"));
 
                var ccomma = new CCodeCommaExpression ();
@@ -491,11 +491,11 @@ public class Vala.GSignalModule : GObjectModule {
                        var signal_name_cexpr = get_signal_name_cexpression (sig, detail_expr, expr);
                        
                        var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_signal_emit_by_name"));
-                       ccall.add_argument ((CCodeExpression) ma.inner.ccodenode);
+                       ccall.add_argument (get_cvalue (ma.inner));
                        if (signal_name_cexpr != null) {
                                ccall.add_argument (signal_name_cexpr);
                        }
-                       expr.ccodenode = ccall;
+                       set_cvalue (expr, ccall);
                } else {
                        base.visit_element_access (expr);
                }
@@ -535,7 +535,7 @@ public class Vala.GSignalModule : GObjectModule {
                                return;
                        }
 
-                       assignment.ccodenode = emit_signal_assignment (assignment);
+                       set_cvalue (assignment, emit_signal_assignment (assignment));
                } else {
                        base.visit_assignment (assignment);
                }
@@ -546,7 +546,7 @@ public class Vala.GSignalModule : GObjectModule {
                        CCodeExpression pub_inst = null;
        
                        if (expr.inner != null) {
-                               pub_inst = (CCodeExpression) expr.inner.ccodenode;
+                               pub_inst = get_cvalue (expr.inner);
                        }
 
                        var sig = (Signal) expr.symbol_reference;
@@ -558,7 +558,7 @@ public class Vala.GSignalModule : GObjectModule {
                                var vcast = new CCodeFunctionCall (new CCodeIdentifier ("%s_CLASS".printf (base_class.get_upper_case_cname (null))));
                                vcast.add_argument (new CCodeIdentifier ("%s_parent_class".printf (current_class.get_lower_case_cname (null))));
                                
-                               expr.ccodenode = new CCodeMemberAccess.pointer (vcast, m.name);
+                               set_cvalue (expr, new CCodeMemberAccess.pointer (vcast, m.name));
                                return;
                        }
 
@@ -566,14 +566,14 @@ public class Vala.GSignalModule : GObjectModule {
                                var ccall = new CCodeFunctionCall (new CCodeIdentifier ("%s_%s".printf (cl.get_lower_case_cname (null), sig.name)));
 
                                ccall.add_argument (pub_inst);
-                               expr.ccodenode = ccall;
+                               set_cvalue (expr, ccall);
                        } else {
                                var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_signal_emit_by_name"));
                                ccall.add_argument (pub_inst);
 
                                ccall.add_argument (sig.get_canonical_cconstant ());
                                
-                               expr.ccodenode = ccall;
+                               set_cvalue (expr, ccall);
                        }
                } else {
                        base.visit_member_access (expr);
@@ -596,7 +596,7 @@ public class Vala.GSignalModule : GObjectModule {
                bool disconnect = (method_type.method_symbol.name == "disconnect");
                bool after = (method_type.method_symbol.name == "connect_after");
 
-               expr.ccodenode = connect_signal (sig, signal_access, handler, disconnect, after, expr);
+               set_cvalue (expr, connect_signal (sig, signal_access, handler, disconnect, after, expr));
        }
 
        CCodeExpression? connect_signal (Signal sig, Expression signal_access, Expression handler, bool disconnect, bool after, CodeNode expr) {
@@ -711,7 +711,7 @@ public class Vala.GSignalModule : GObjectModule {
                }
 
                // third resp. sixth argument: handler
-               ccall.add_argument (new CCodeCastExpression ((CCodeExpression) handler.ccodenode, "GCallback"));
+               ccall.add_argument (new CCodeCastExpression (get_cvalue (handler), "GCallback"));
 
                if (m.closure) {
                        // g_signal_connect_data
@@ -736,7 +736,7 @@ public class Vala.GSignalModule : GObjectModule {
                        if (handler is MemberAccess) {
                                var right_ma = (MemberAccess) handler;
                                if (right_ma.inner != null) {
-                                       ccall.add_argument ((CCodeExpression) right_ma.inner.ccodenode);
+                                       ccall.add_argument (get_cvalue (right_ma.inner));
                                } else {
                                        ccall.add_argument (get_result_cexpression ("self"));
                                }
index a09551f0446ca6046271ccb58cfc151a754a895b..bca62630827f4dcc6f1aab0ebb89429031cdf68b 100644 (file)
@@ -2116,7 +2116,7 @@ public class Vala.GTypeModule : GErrorModule {
                ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_var.name), get_value));
                var is_null_value = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, get_variable_cexpression (temp_var.name), new CCodeIdentifier ("NULL"));
                ccomma.append_expression (new CCodeConditionalExpression (is_null_value, new CCodeMemberAccess.pointer (get_variable_cexpression (temp_var.name), "value_name"), new CCodeIdentifier ("NULL")));
-               expr.ccodenode = ccomma;
+               set_cvalue (expr, ccomma);
        }
 
        public override void visit_property (Property prop) {