]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Add TargetValue class
authorJürg Billeter <j@bitron.ch>
Sun, 15 Aug 2010 13:00:00 +0000 (15:00 +0200)
committerJürg Billeter <j@bitron.ch>
Sat, 9 Oct 2010 13:47:22 +0000 (15:47 +0200)
14 files changed:
codegen/valaccodearraymodule.vala
codegen/valaccodebasemodule.vala
codegen/valaccodedelegatemodule.vala
codegen/valaccodememberaccessmodule.vala
codegen/valaccodemethodcallmodule.vala
codegen/valaccodemethodmodule.vala
codegen/valadbusservermodule.vala
codegen/valadovabasemodule.vala
codegen/valagdbusservermodule.vala
codegen/valagtypemodule.vala
vala/Makefile.am
vala/valacodenode.vala
vala/valaexpression.vala
vala/valatargetvalue.vala [new file with mode: 0644]

index 2fb6dc401cb2d059c2008f5b503fbe580a945557..276f5c73d727036b7f1b7a0c9cacc991cce224c2 100644 (file)
@@ -176,7 +176,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                        var length_expr = size[dim - 1];
                        return (CCodeExpression) get_ccodenode (length_expr);
                } else if (array_expr is MethodCall || array_expr is CastExpression || array_expr is SliceExpression) {
-                       List<CCodeExpression> size = array_expr.get_array_sizes ();
+                       List<CCodeExpression> size = get_array_sizes (array_expr);
                        if (size != null && size.size >= dim) {
                                return size[dim - 1];
                        }
@@ -328,7 +328,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                        } else if (array_expr.symbol_reference is Property) {
                                var prop = (Property) array_expr.symbol_reference;
                                if (!prop.no_array_length) {
-                                       List<CCodeExpression> size = array_expr.get_array_sizes ();
+                                       List<CCodeExpression> size = get_array_sizes (array_expr);
                                        if (size != null && size.size >= dim) {
                                                return size[dim - 1];
                                        }
@@ -463,7 +463,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                ccomma.append_expression (get_variable_cexpression (slice_var.name));
 
                set_cvalue (expr, ccomma);
-               expr.append_array_size (get_variable_cexpression (len_var.name));
+               append_array_size (expr, get_variable_cexpression (len_var.name));
        }
 
        private CCodeForStatement get_struct_array_free_loop (Struct st) {
@@ -980,10 +980,9 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                }
        }
 
-       public override void generate_parameter (FormalParameter param, CCodeFile decl_space, Map<int,CCodeFormalParameter> cparam_map, Map<int,CCodeExpression>? carg_map) {
+       public override CCodeFormalParameter generate_parameter (FormalParameter param, CCodeFile decl_space, Map<int,CCodeFormalParameter> cparam_map, Map<int,CCodeExpression>? carg_map) {
                if (!(param.variable_type is ArrayType)) {
-                       base.generate_parameter (param, decl_space, cparam_map, carg_map);
-                       return;
+                       return base.generate_parameter (param, decl_space, cparam_map, carg_map);
                }
 
                string ctypename = param.variable_type.get_cname ();
@@ -992,13 +991,13 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                        ctypename += "*";
                }
 
-               param.ccodenode = new CCodeFormalParameter (get_variable_cname (param.name), ctypename);
+               var main_cparam = new CCodeFormalParameter (get_variable_cname (param.name), ctypename);
 
                var array_type = (ArrayType) param.variable_type;
 
                generate_type_declaration (array_type.element_type, decl_space);
 
-               cparam_map.set (get_param_pos (param.cparameter_position), (CCodeFormalParameter) param.ccodenode);
+               cparam_map.set (get_param_pos (param.cparameter_position), main_cparam);
                if (carg_map != null) {
                        carg_map.set (get_param_pos (param.cparameter_position), get_variable_cexpression (param.name));
                }
@@ -1020,5 +1019,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                                }
                        }
                }
+
+               return main_cparam;
        }
 }
index 4acbaa1521ca2d5b502bc2be2fa334a5cfb7f20b..e6947b18f7b3f774070e94b04c6caaeac721cb59 100644 (file)
@@ -3037,8 +3037,6 @@ public class Vala.CCodeBaseModule : CodeGenerator {
        
        public void emit_temp_var (LocalVariable local) {
                var vardecl = new CCodeVariableDeclarator (local.name, null, local.variable_type.get_cdeclarator_suffix ());
-               // sets #line
-               local.ccodenode = vardecl;
 
                var st = local.variable_type.data_type as Struct;
                var array_type = local.variable_type as ArrayType;
@@ -4375,7 +4373,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        // null-terminated string array
                        var len_call = new CCodeFunctionCall (new CCodeIdentifier ("g_strv_length"));
                        len_call.add_argument (rv);
-                       expr.append_array_size (len_call);
+                       append_array_size (expr, len_call);
                } else if (to is StructValueType) {
                        var temp_decl = get_temp_variable (to, true, null, true);
                        emit_temp_var (temp_decl);
@@ -4430,7 +4428,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
 
                                ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_variable_cexpression (temp_decl.name)));
                                cfunc.add_parameter (new CCodeFormalParameter (get_array_length_cname ("result", dim), "int*"));
-                               expr.append_array_size (get_variable_cexpression (temp_decl.name));
+                               append_array_size (expr, get_variable_cexpression (temp_decl.name));
                        }
                }
 
@@ -4506,7 +4504,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        var array_type = expr.type_reference as ArrayType;
                        if (array_type != null && expr.inner.value_type is ArrayType) {
                                for (int dim = 1; dim <= array_type.rank; dim++) {
-                                       expr.append_array_size (get_array_length_cexpression (expr.inner, dim));
+                                       append_array_size (expr, get_array_length_cexpression (expr.inner, dim));
                                }
                        }
 
@@ -5435,19 +5433,11 @@ 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) {
+       public CCodeExpression? get_ccodenode (Expression node) {
+               if (get_cvalue (node) == null) {
                        node.emit (this);
                }
-               return node.ccodenode;
+               return get_cvalue (node);
        }
 
        public override void visit_class (Class cl) {
@@ -5655,6 +5645,85 @@ public class Vala.CCodeBaseModule : CodeGenerator {
 
        public virtual void add_simple_check (CodeNode node, bool always_fails = false) {
        }
+
+       public CCodeExpression? get_cvalue (Expression expr) {
+               if (expr.target_value == null) {
+                       return null;
+               }
+               var glib_value = (GLibValue) expr.target_value;
+               return glib_value.ccodenode;
+       }
+
+       public void set_cvalue (Expression expr, CCodeExpression cvalue) {
+               var glib_value = (GLibValue) expr.target_value;
+               if (glib_value == null) {
+                       glib_value = new GLibValue ();
+                       expr.target_value = glib_value;
+               }
+               glib_value.ccodenode = cvalue;
+       }
+
+       public CCodeExpression? get_delegate_target (Expression expr) {
+               if (expr.target_value == null) {
+                       return null;
+               }
+               var glib_value = (GLibValue) expr.target_value;
+               return glib_value.delegate_target;
+       }
+
+       public void set_delegate_target (Expression expr, CCodeExpression delegate_target) {
+               var glib_value = (GLibValue) expr.target_value;
+               if (glib_value == null) {
+                       glib_value = new GLibValue ();
+                       expr.target_value = glib_value;
+               }
+               glib_value.delegate_target = delegate_target;
+       }
+
+       public CCodeExpression? get_delegate_target_destroy_notify (Expression expr) {
+               if (expr.target_value == null) {
+                       return null;
+               }
+               var glib_value = (GLibValue) expr.target_value;
+               return glib_value.delegate_target_destroy_notify;
+       }
+
+       public void set_delegate_target_destroy_notify (Expression expr, CCodeExpression destroy_notify) {
+               var glib_value = (GLibValue) expr.target_value;
+               if (glib_value == null) {
+                       glib_value = new GLibValue ();
+                       expr.target_value = glib_value;
+               }
+               glib_value.delegate_target_destroy_notify = destroy_notify;
+       }
+
+       public void append_array_size (Expression expr, CCodeExpression size) {
+               var glib_value = (GLibValue) expr.target_value;
+               if (glib_value == null) {
+                       glib_value = new GLibValue ();
+                       expr.target_value = glib_value;
+               }
+               if (glib_value.array_sizes == null) {
+                       glib_value.array_sizes = new ArrayList<CCodeExpression> ();
+               }
+               glib_value.array_sizes.add (size);
+       }
+
+       public List<CCodeExpression>? get_array_sizes (Expression expr) {
+               var glib_value = (GLibValue) expr.target_value;
+               if (glib_value == null) {
+                       glib_value = new GLibValue ();
+                       expr.target_value = glib_value;
+               }
+               return glib_value.array_sizes;
+       }
 }
 
-// vim:sw=8 noet
+public class Vala.GLibValue : TargetValue {
+       public CCodeExpression ccodenode;
+
+       public List<CCodeExpression> array_sizes;
+
+       public CCodeExpression? delegate_target;
+       public CCodeExpression? delegate_target_destroy_notify;
+}
index 2102371760246978d1007bac43a293df1fcd764f..5fab0a1b9f063d0306b2f715d51f7d5ea0aa0da3 100644 (file)
@@ -48,9 +48,9 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
 
                var cfundecl = new CCodeFunctionDeclarator (d.get_cname ());
                foreach (FormalParameter param in d.get_parameters ()) {
-                       generate_parameter (param, decl_space, new HashMap<int,CCodeFormalParameter> (), null);
+                       var cparam = generate_parameter (param, decl_space, new HashMap<int,CCodeFormalParameter> (), null);
 
-                       cfundecl.add_parameter ((CCodeFormalParameter) param.ccodenode);
+                       cfundecl.add_parameter (cparam);
 
                        // handle array parameters
                        if (!param.no_array_length && param.variable_type is ArrayType) {
@@ -62,7 +62,7 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
                                }
                                
                                for (int dim = 1; dim <= array_type.rank; dim++) {
-                                       var cparam = new CCodeFormalParameter (get_parameter_array_length_cname (param, dim), length_ctype);
+                                       cparam = new CCodeFormalParameter (get_parameter_array_length_cname (param, dim), length_ctype);
                                        cfundecl.add_parameter (cparam);
                                }
                        }
@@ -71,7 +71,7 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
                                var deleg_type = (DelegateType) param.variable_type;
                                var param_d = deleg_type.delegate_symbol;
                                if (param_d.has_target) {
-                                       var cparam = new CCodeFormalParameter (get_delegate_target_cname (get_variable_cname (param.name)), "void*");
+                                       cparam = new CCodeFormalParameter (get_delegate_target_cname (get_variable_cname (param.name)), "void*");
                                        cfundecl.add_parameter (cparam);
                                }
                        }
@@ -150,10 +150,10 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
                
                if (delegate_expr is MethodCall) {
                        var invocation_expr = (MethodCall) delegate_expr;
-                       if (invocation_expr.delegate_target_destroy_notify != null) {
-                               delegate_target_destroy_notify = invocation_expr.delegate_target_destroy_notify;
+                       if (get_delegate_target_destroy_notify (invocation_expr) != null) {
+                               delegate_target_destroy_notify = get_delegate_target_destroy_notify (invocation_expr);
                        }
-                       return invocation_expr.delegate_target;
+                       return get_delegate_target (invocation_expr);
                } else if (delegate_expr is LambdaExpression) {
                        var lambda = (LambdaExpression) delegate_expr;
                        var delegate_type = (DelegateType) delegate_expr.target_type;
@@ -317,7 +317,7 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
                                        return delegate_target;
                                }
                        } else if (delegate_expr.symbol_reference is Property) {
-                               return delegate_expr.delegate_target;
+                               return get_delegate_target (delegate_expr);
                        }
                }
 
@@ -377,7 +377,6 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
 
                var function = new CCodeFunction (wrapper_name, return_type_cname);
                function.modifiers = CCodeModifiers.STATIC;
-               m.ccodenode = function;
 
                var cparam_map = new HashMap<int,CCodeFormalParameter> (direct_hash, direct_equal);
 
@@ -462,7 +461,7 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
                                        Report.error (expr != null ? expr.source_reference : null, "Cannot create delegate without target for instance method or closure");
                                        arg = new CCodeConstant ("NULL");
                                } else {
-                                       arg = new CCodeIdentifier ((d_params.get (0).ccodenode as CCodeFormalParameter).name);
+                                       arg = new CCodeIdentifier (d_params.get (0).name);
                                        i = 1;
                                }
                        }
@@ -481,7 +480,7 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
                        }
 
                        CCodeExpression arg;
-                       arg = new CCodeIdentifier ((d_params.get (i).ccodenode as CCodeFormalParameter).name);
+                       arg = new CCodeIdentifier (d_params.get (i).name);
                        carg_map.set (get_param_pos (param.cparameter_position), arg);
 
                        // handle array arguments
@@ -608,10 +607,9 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
                return wrapper_name;
        }
 
-       public override void generate_parameter (FormalParameter param, CCodeFile decl_space, Map<int,CCodeFormalParameter> cparam_map, Map<int,CCodeExpression>? carg_map) {
+       public override CCodeFormalParameter generate_parameter (FormalParameter param, CCodeFile decl_space, Map<int,CCodeFormalParameter> cparam_map, Map<int,CCodeExpression>? carg_map) {
                if (!(param.variable_type is DelegateType || param.variable_type is MethodType)) {
-                       base.generate_parameter (param, decl_space, cparam_map, carg_map);
-                       return;
+                       return base.generate_parameter (param, decl_space, cparam_map, carg_map);
                }
 
                string ctypename = param.variable_type.get_cname ();
@@ -630,9 +628,9 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
                        target_destroy_notify_ctypename += "*";
                }
 
-               param.ccodenode = new CCodeFormalParameter (get_variable_cname (param.name), ctypename);
+               var main_cparam = new CCodeFormalParameter (get_variable_cname (param.name), ctypename);
 
-               cparam_map.set (get_param_pos (param.cparameter_position), (CCodeFormalParameter) param.ccodenode);
+               cparam_map.set (get_param_pos (param.cparameter_position), main_cparam);
                if (carg_map != null) {
                        carg_map.set (get_param_pos (param.cparameter_position), get_variable_cexpression (param.name));
                }
@@ -664,5 +662,7 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
                                carg_map.set (get_param_pos (param.cdelegate_target_parameter_position), get_variable_cexpression (cparam.name));
                        }
                }
+
+               return main_cparam;
        }
 }
index 9b20ebe9a3e74e9503653e448c35efd860a5ab51..c5be34887919da2c1ddf5a0fcd5fb344ca7a9ad0 100644 (file)
@@ -294,7 +294,7 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                                        var ctemp = get_variable_cexpression (temp_var.name);
                                                        emit_temp_var (temp_var);
                                                        ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, ctemp));
-                                                       expr.append_array_size (ctemp);
+                                                       append_array_size (expr, ctemp);
                                                }
                                        } else {
                                                var delegate_type = base_property.property_type as DelegateType;
@@ -303,7 +303,7 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                                        var ctemp = get_variable_cexpression (temp_var.name);
                                                        emit_temp_var (temp_var);
                                                        ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, ctemp));
-                                                       expr.delegate_target = ctemp;
+                                                       set_delegate_target (expr, ctemp);
                                                }
                                        }
 
index 5c6d483f3baf18590a66bceb6943737cfe812f28..5e318c16606067ec1d1b5aa4d176dac019a396bf 100644 (file)
@@ -546,7 +546,7 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                                        var len_call = new CCodeFunctionCall (new CCodeIdentifier ("_vala_array_length"));
                                        len_call.add_argument (temp_ref);
 
-                                       expr.append_array_size (len_call);
+                                       append_array_size (expr, len_call);
                                } else if (!m.no_array_length) {
                                        LocalVariable temp_var;
 
@@ -561,9 +561,9 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
 
                                        out_arg_map.set (get_param_pos (m.carray_length_parameter_position + 0.01 * dim), new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, temp_ref));
 
-                                       expr.append_array_size (temp_ref);
+                                       append_array_size (expr, temp_ref);
                                } else {
-                                       expr.append_array_size (new CCodeConstant ("-1"));
+                                       append_array_size (expr, new CCodeConstant ("-1"));
                                }
                        }
                } else if (m != null && m.return_type is DelegateType && async_call != ccall) {
@@ -577,7 +577,7 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
 
                                out_arg_map.set (get_param_pos (m.cdelegate_target_parameter_position), new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, temp_ref));
 
-                               expr.delegate_target = temp_ref;
+                               set_delegate_target (expr, temp_ref);
 
                                if (deleg_type.value_owned) {
                                        temp_var = get_temp_variable (new DelegateType ((Delegate) context.root.scope.lookup ("GLib").scope.lookup ("DestroyNotify")));
@@ -587,7 +587,7 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
 
                                        out_arg_map.set (get_param_pos (m.cdelegate_target_parameter_position + 0.01), new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, temp_ref));
 
-                                       expr.delegate_target_destroy_notify = temp_ref;
+                                       set_delegate_target_destroy_notify (expr, temp_ref);
                                }
                        }
                }
@@ -610,7 +610,7 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                                        var len_call = new CCodeFunctionCall (new CCodeIdentifier ("_vala_array_length"));
                                        len_call.add_argument (temp_ref);
 
-                                       expr.append_array_size (len_call);
+                                       append_array_size (expr, len_call);
                                } else if (!deleg.no_array_length) {
                                        var temp_var = get_temp_variable (int_type);
                                        var temp_ref = get_variable_cexpression (temp_var.name);
@@ -619,9 +619,9 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
 
                                        out_arg_map.set (get_param_pos (deleg.carray_length_parameter_position + 0.01 * dim), new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, temp_ref));
 
-                                       expr.append_array_size (temp_ref);
+                                       append_array_size (expr, temp_ref);
                                } else {
-                                       expr.append_array_size (new CCodeConstant ("-1"));
+                                       append_array_size (expr, new CCodeConstant ("-1"));
                                }
                        }
                } else if (deleg != null && deleg.return_type is DelegateType) {
@@ -635,7 +635,7 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
 
                                out_arg_map.set (get_param_pos (deleg.cdelegate_target_parameter_position), new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, temp_ref));
 
-                               expr.delegate_target = temp_ref;
+                               set_delegate_target (expr, temp_ref);
                        }
                }
 
index 55c31e4df715d54d1eece5c971357c1ffeb3b926..3b462c8a2b35606b0b7d9e7a03489ba9de4e2b36 100644 (file)
@@ -719,7 +719,8 @@ public class Vala.CCodeMethodModule : CCodeStructModule {
                }
        }
 
-       public virtual void generate_parameter (FormalParameter param, CCodeFile decl_space, Map<int,CCodeFormalParameter> cparam_map, Map<int,CCodeExpression>? carg_map) {
+       public virtual CCodeFormalParameter generate_parameter (FormalParameter param, CCodeFile decl_space, Map<int,CCodeFormalParameter> cparam_map, Map<int,CCodeExpression>? carg_map) {
+               CCodeFormalParameter cparam;
                if (!param.ellipsis) {
                        string ctypename = param.variable_type.get_cname ();
 
@@ -743,15 +744,17 @@ public class Vala.CCodeMethodModule : CCodeStructModule {
                                ctypename += "*";
                        }
 
-                       param.ccodenode = new CCodeFormalParameter (get_variable_cname (param.name), ctypename);
+                       cparam = new CCodeFormalParameter (get_variable_cname (param.name), ctypename);
                } else {
-                       param.ccodenode = new CCodeFormalParameter.with_ellipsis ();
+                       cparam = new CCodeFormalParameter.with_ellipsis ();
                }
 
-               cparam_map.set (get_param_pos (param.cparameter_position, param.ellipsis), (CCodeFormalParameter) param.ccodenode);
+               cparam_map.set (get_param_pos (param.cparameter_position, param.ellipsis), cparam);
                if (carg_map != null && !param.ellipsis) {
                        carg_map.set (get_param_pos (param.cparameter_position, param.ellipsis), get_variable_cexpression (param.name));
                }
+
+               return cparam;
        }
 
        public override void generate_cparameters (Method m, CCodeFile decl_space, Map<int,CCodeFormalParameter> cparam_map, CCodeFunction func, CCodeFunctionDeclarator? vdeclarator = null, Map<int,CCodeExpression>? carg_map = null, CCodeFunctionCall? vcall = null, int direction = 3) {
index cbf770d47787918dd8d2b563c1ff4f3dc8166f19..edf5e5a794c64c0ef7f4fe185119a4cadf9ac004 100644 (file)
@@ -489,9 +489,9 @@ public class Vala.DBusServerModule : DBusClientModule {
 
                foreach (var param in sig.get_parameters ()) {
                        // ensure ccodenode of parameter is set
-                       generate_parameter (param, cfile, new HashMap<int,CCodeFormalParameter> (), null);
+                       var cparam = generate_parameter (param, cfile, new HashMap<int,CCodeFormalParameter> (), null);
 
-                       function.add_parameter ((CCodeFormalParameter) get_ccodenode (param));
+                       function.add_parameter (cparam);
                        if (param.variable_type is ArrayType) {
                                var array_type = (ArrayType) param.variable_type;
                                for (int dim = 1; dim <= array_type.rank; dim++) {
index 4c55c25ca44d452b6fb946182089ba51d3f4e6c5..64fcfbc6b1cd8f7c46f7097a53aaf6872682da70 100644 (file)
@@ -1133,8 +1133,6 @@ public class Vala.DovaBaseModule : CodeGenerator {
                var cdecl = new CCodeDeclaration (local.variable_type.get_cname ());
 
                var vardecl = new CCodeVariableDeclarator (local.name, null, local.variable_type.get_cdeclarator_suffix ());
-               // sets #line
-               local.ccodenode = vardecl;
                cdecl.add_declarator (vardecl);
 
                var st = local.variable_type.data_type as Struct;
@@ -2231,19 +2229,11 @@ 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) {
+       public CCodeExpression? get_ccodenode (Expression node) {
+               if (get_cvalue (node) == null) {
                        node.emit (this);
                }
-               return node.ccodenode;
+               return get_cvalue (node);
        }
 
        public DataType? get_this_type () {
@@ -2269,4 +2259,25 @@ public class Vala.DovaBaseModule : CodeGenerator {
 
        public virtual void add_simple_check (CodeNode node, bool always_fails = false) {
        }
+
+       public CCodeExpression? get_cvalue (Expression expr) {
+               if (expr.target_value == null) {
+                       return null;
+               }
+               var dova_value = (DovaValue) expr.target_value;
+               return dova_value.ccodenode;
+       }
+
+       public void set_cvalue (Expression expr, CCodeExpression cvalue) {
+               var dova_value = (DovaValue) expr.target_value;
+               if (dova_value == null) {
+                       dova_value = new DovaValue ();
+                       expr.target_value = dova_value;
+               }
+               dova_value.ccodenode = cvalue;
+       }
+}
+
+public class Vala.DovaValue : TargetValue {
+       public CCodeExpression ccodenode;
 }
index 9ac6487ae3aff35b5f2614a9d3f286770b6d5d23..abe9ed1f3363127d6f58fc6ffef3465716a1c8c0 100644 (file)
@@ -375,9 +375,9 @@ public class Vala.GDBusServerModule : GDBusClientModule {
 
                foreach (var param in sig.get_parameters ()) {
                        // ensure ccodenode of parameter is set
-                       generate_parameter (param, cfile, new HashMap<int,CCodeFormalParameter> (), null);
+                       var cparam = generate_parameter (param, cfile, new HashMap<int,CCodeFormalParameter> (), null);
 
-                       function.add_parameter ((CCodeFormalParameter) get_ccodenode (param));
+                       function.add_parameter (cparam);
                        if (param.variable_type is ArrayType) {
                                var array_type = (ArrayType) param.variable_type;
                                for (int dim = 1; dim <= array_type.rank; dim++) {
index bca62630827f4dcc6f1aab0ebb89429031cdf68b..6612f86e3b340d27371bd1ad224869bd738be5da 100644 (file)
 
 
 public class Vala.GTypeModule : GErrorModule {
-       public override void generate_parameter (FormalParameter param, CCodeFile decl_space, Map<int,CCodeFormalParameter> cparam_map, Map<int,CCodeExpression>? carg_map) {
+       public override CCodeFormalParameter generate_parameter (FormalParameter param, CCodeFile decl_space, Map<int,CCodeFormalParameter> cparam_map, Map<int,CCodeExpression>? carg_map) {
                if (!(param.variable_type is ObjectType)) {
-                       base.generate_parameter (param, decl_space, cparam_map, carg_map);
-                       return;
+                       return base.generate_parameter (param, decl_space, cparam_map, carg_map);
                }
 
                generate_type_declaration (param.variable_type, decl_space);
@@ -38,12 +37,14 @@ public class Vala.GTypeModule : GErrorModule {
                        ctypename += "*";
                }
 
-               param.ccodenode = new CCodeFormalParameter (get_variable_cname (param.name), ctypename);
+               var cparam = new CCodeFormalParameter (get_variable_cname (param.name), ctypename);
 
-               cparam_map.set (get_param_pos (param.cparameter_position), (CCodeFormalParameter) param.ccodenode);
+               cparam_map.set (get_param_pos (param.cparameter_position), cparam);
                if (carg_map != null) {
                        carg_map.set (get_param_pos (param.cparameter_position), get_variable_cexpression (param.name));
                }
+
+               return cparam;
        }
 
        public override void generate_class_declaration (Class cl, CCodeFile decl_space) {
index 83acbd595b6802a56b6912dcdc7df51eb21acdd3..a2e0ede0967fb78ecc267a92d8b066e485c9928d 100644 (file)
@@ -141,6 +141,7 @@ libvalacore_la_VALASOURCES = \
        valaswitchstatement.vala \
        valasymbol.vala \
        valasymbolresolver.vala \
+       valatargetvalue.vala \
        valatemplate.vala \
        valathrowstatement.vala \
        valatokentype.vala \
index 0b047c04d77b6fa321b7a7f5b0f458770de1c6e8..62508c7e6af8813653a3ff83405237d30049bbdb 100644 (file)
@@ -50,24 +50,6 @@ public abstract class Vala.CodeNode {
        public string type_name {
                get { return Type.from_instance (this).name (); }
        }
-       
-       /**
-        * Generated CCodeNode that corresponds to this code node.
-        */
-       public CCodeNode? ccodenode {
-               get {
-                       return _ccodenode;
-               }
-               set {
-                       if (value != null && source_reference != null && CodeContext.get ().debug) {
-                               value.line = new CCodeLineDirective (
-                                       Path.get_basename (source_reference.file.filename),
-                                       source_reference.first_line);
-                       }
-
-                       _ccodenode = value;
-               }
-       }
 
        public bool checked { get; set; }
 
@@ -86,8 +68,6 @@ public abstract class Vala.CodeNode {
        private List<DataType> _error_types;
        private static List<DataType> _empty_type_list;
 
-       private CCodeNode? _ccodenode;
-
        static int last_temp_nr = 0;
 
        /**
index eafb202d8c055338198b3508148af32f006f3fcd..dd005afcaed59adfe358c13c0760c15690939ff2 100644 (file)
@@ -55,10 +55,7 @@ public abstract class Vala.Expression : CodeNode {
         */
        public bool lvalue { get; set; }
 
-       private List<CCodeExpression> array_sizes;
-
-       public CCodeExpression? delegate_target { get; set; }
-       public CCodeExpression? delegate_target_destroy_notify { get; set; }
+       public TargetValue? target_value { get; set; }
 
        /**
         * Returns whether this expression is constant, i.e. whether this
@@ -81,24 +78,6 @@ public abstract class Vala.Expression : CodeNode {
                return false;
        }
 
-       /**
-        * Add an array size C code expression.
-        */
-       public void append_array_size (CCodeExpression size) {
-               if (array_sizes == null) {
-                       array_sizes = new ArrayList<CCodeExpression> ();
-               }
-               array_sizes.add (size);
-       }
-
-       /**
-        * Get the C code expression for array sizes for all dimensions
-        * ascending from left to right.
-        */
-       public List<CCodeExpression>? get_array_sizes () {
-               return array_sizes;
-       }
-
        public Statement? parent_statement {
                get {
                        var expr = parent_node as Expression;
diff --git a/vala/valatargetvalue.vala b/vala/valatargetvalue.vala
new file mode 100644 (file)
index 0000000..e84913a
--- /dev/null
@@ -0,0 +1,25 @@
+/* valatargetvalue.vala
+ *
+ * Copyright (C) 2010  Jürg Billeter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
+ *
+ * Author:
+ *     Jürg Billeter <j@bitron.ch>
+ */
+
+public abstract class Vala.TargetValue {
+       public DataType value_type { get; set; }
+}