]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Add destroy_value function
authorJürg Billeter <j@bitron.ch>
Thu, 21 Oct 2010 13:44:09 +0000 (15:44 +0200)
committerJürg Billeter <j@bitron.ch>
Thu, 28 Oct 2010 09:43:44 +0000 (11:43 +0200)
codegen/valaccodearraymodule.vala
codegen/valaccodebasemodule.vala
codegen/valadovabasemodule.vala

index ec375c37f9d690b947f9b75303d5540cb8b2c2ee..c906fb217e8992804a7c81fe9e646491d27d06eb 100644 (file)
@@ -522,12 +522,14 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                }
        }
 
-       public override CCodeExpression get_unref_expression (CCodeExpression cvar, DataType type, Expression? expr, bool is_macro_definition) {
+       public override CCodeExpression destroy_value (TargetValue value, bool is_macro_definition = false) {
+               var type = value.value_type;
+
                if (type is ArrayType) {
                        var array_type = (ArrayType) type;
 
                        if (!array_type.fixed_length) {
-                               return base.get_unref_expression (cvar, type, expr, is_macro_definition);
+                               return base.destroy_value (value, is_macro_definition);
                        }
 
                        requires_array_free = true;
@@ -535,13 +537,13 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                        var ccall = new CCodeFunctionCall (get_destroy_func_expression (type));
 
                        ccall = new CCodeFunctionCall (new CCodeIdentifier ("_vala_array_destroy"));
-                       ccall.add_argument (cvar);
+                       ccall.add_argument (get_cvalue_ (value));
                        ccall.add_argument (new CCodeConstant ("%d".printf (array_type.length)));
                        ccall.add_argument (new CCodeCastExpression (get_destroy_func_expression (array_type.element_type), "GDestroyNotify"));
 
                        return ccall;
                } else {
-                       return base.get_unref_expression (cvar, type, expr, is_macro_definition);
+                       return base.destroy_value (value, is_macro_definition);
                }
        }
 
index 7bbcc929edaee9fd81e991303c6eff8b89629c1c..4e528495bb37494cfd25f07d6dd5eb5eaa2e696c 100644 (file)
@@ -2900,10 +2900,23 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                return null;
        }
 
-       public virtual CCodeExpression get_unref_expression (CCodeExpression cvar, DataType type, Expression? expr, bool is_macro_definition = false) {
+       public CCodeExpression get_unref_expression (CCodeExpression cvar, DataType type, Expression? expr, bool is_macro_definition = false) {
+               var value = new GLibValue (type, cvar);
+               if (expr != null && expr.target_value != null) {
+                       value.array_length_cvalues = ((GLibValue) expr.target_value).array_length_cvalues;
+                       value.delegate_target_cvalue = get_delegate_target_cvalue (expr.target_value);
+                       value.delegate_target_destroy_notify_cvalue = get_delegate_target_destroy_notify_cvalue (expr.target_value);
+               }
+               return destroy_value (value, is_macro_definition);
+       }
+
+       public virtual CCodeExpression destroy_value (TargetValue value, bool is_macro_definition = false) {
+               var type = value.value_type;
+               var cvar = get_cvalue_ (value);
+
                if (type is DelegateType) {
-                       CCodeExpression delegate_target_destroy_notify;
-                       var delegate_target = get_delegate_target_cexpression (expr, out delegate_target_destroy_notify);
+                       var delegate_target = get_delegate_target_cvalue (value);
+                       var delegate_target_destroy_notify = get_delegate_target_destroy_notify_cvalue (value);
 
                        var ccall = new CCodeFunctionCall (delegate_target_destroy_notify);
                        ccall.add_argument (delegate_target);
@@ -2957,7 +2970,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                        string free0_func = "_%s0".printf (freeid.name);
 
                        if (add_wrapper (free0_func)) {
-                               var macro = get_unref_expression (new CCodeIdentifier ("var"), type, expr, true);
+                               var macro = destroy_value (new GLibValue (type, new CCodeIdentifier ("var")), true);
                                cfile.add_type_declaration (new CCodeMacroReplacement.with_expression ("%s(var)".printf (free0_func), macro));
                        }
 
@@ -3006,10 +3019,10 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                        bool first = true;
                                        for (int dim = 1; dim <= array_type.rank; dim++) {
                                                if (first) {
-                                                       csizeexpr = get_array_length_cexpression (expr, dim);
+                                                       csizeexpr = get_array_length_cvalue (value, dim);
                                                        first = false;
                                                } else {
-                                                       csizeexpr = new CCodeBinaryExpression (CCodeBinaryOperator.MUL, csizeexpr, get_array_length_cexpression (expr, dim));
+                                                       csizeexpr = new CCodeBinaryExpression (CCodeBinaryOperator.MUL, csizeexpr, get_array_length_cvalue (value, dim));
                                                }
                                        }
 
index 63ebb6d14412d1c6d071c5e3041ba9add2e46e58..58ba7e98839266d8e2ccafb4472d217526143730 100644 (file)
@@ -1058,7 +1058,14 @@ public abstract class Vala.DovaBaseModule : CodeGenerator {
                }
        }
 
-       public virtual CCodeExpression get_unref_expression (CCodeExpression cvar, DataType type, Expression? expr = null) {
+       public CCodeExpression get_unref_expression (CCodeExpression cvar, DataType type, Expression? expr = null) {
+               return destroy_value (new DovaValue (type, cvar));
+       }
+
+       public CCodeExpression destroy_value (TargetValue value) {
+               var type = value.value_type;
+               var cvar = get_cvalue_ (value);
+
                var ccall = new CCodeFunctionCall (get_destroy_func_expression (type));
 
                if (type is ValueType && !type.nullable) {