]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Fix freeing on assignment to fields of generic type
authorJürg Billeter <j@bitron.ch>
Sun, 27 Mar 2011 18:26:37 +0000 (20:26 +0200)
committerJürg Billeter <j@bitron.ch>
Sun, 27 Mar 2011 18:26:37 +0000 (20:26 +0200)
Fixes bug 645773.

codegen/valaccodeassignmentmodule.vala
codegen/valaccodebasemodule.vala
codegen/valaccodememberaccessmodule.vala

index 3f6dd65e0b3b496ae7cc5ac0d589b909d6220079..1bc79f271b8809501455ce6ed18a36c7d5576cf8 100644 (file)
@@ -239,7 +239,7 @@ public class Vala.CCodeAssignmentModule : CCodeMemberAccessModule {
        }
 
        public override void store_field (Field field, TargetValue? instance, TargetValue value) {
-               if (requires_destroy (field.variable_type)) {
+               if (requires_destroy (get_field_cvalue (field, instance).value_type)) {
                        /* unref old value */
                        ccode.add_expression (destroy_field (field, instance));
                }
index 4ac24db465b76e2b8d2f9ded70b1cf5dc886e20c..ecc80d725dd40d3c686b4c48d7119a86d25d0b68 100644 (file)
@@ -2803,7 +2803,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
        // logic in this method is temporarily duplicated in destroy_value
        // apply changes to both methods
        public virtual CCodeExpression destroy_variable (Variable variable, TargetValue target_lvalue) {
-               var type = variable.variable_type;
+               var type = target_lvalue.value_type;
                var cvar = get_cvalue_ (target_lvalue);
 
                if (type is DelegateType) {
index 285c09a717a567cbe3c5fa98ac9072f04cc3cfff..7c14732fa4a3f4d9ac27d4d0588464481f2465ab 100644 (file)
@@ -493,10 +493,15 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
 
        /* Returns lvalue access to the given field */
        public override TargetValue get_field_cvalue (Field field, TargetValue? instance) {
-               var result = new GLibValue (field.variable_type.copy ());
+               var value_type = field.variable_type.copy ();
+               if (instance != null) {
+                       value_type = value_type.get_actual_type (instance.value_type, null, field);
+               }
+
+               var result = new GLibValue (value_type);
 
-               var array_type = field.variable_type as ArrayType;
-               var delegate_type = field.variable_type as DelegateType;
+               var array_type = result.value_type as ArrayType;
+               var delegate_type = result.value_type as DelegateType;
                if (field.binding == MemberBinding.INSTANCE) {
                        CCodeExpression pub_inst = null;
 
@@ -558,12 +563,12 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
 
                                if (((TypeSymbol) field.parent_symbol).is_reference_type ()) {
                                        result.delegate_target_cvalue = new CCodeMemberAccess.pointer (inst, target_cname);
-                                       if (field.variable_type.value_owned) {
+                                       if (result.value_type.value_owned) {
                                                result.delegate_target_destroy_notify_cvalue = new CCodeMemberAccess.pointer (inst, target_destroy_notify_cname);
                                        }
                                } else {
                                        result.delegate_target_cvalue = new CCodeMemberAccess (inst, target_cname);
-                                       if (field.variable_type.value_owned) {
+                                       if (result.value_type.value_owned) {
                                                result.delegate_target_destroy_notify_cvalue = new CCodeMemberAccess (inst, target_destroy_notify_cname);
                                        }
                                }
@@ -620,7 +625,7 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                }
                        } else if (delegate_type != null && delegate_type.delegate_symbol.has_target && !field.no_delegate_target) {
                                result.delegate_target_cvalue = new CCodeIdentifier (get_delegate_target_cname (field.get_cname ()));
-                               if (field.variable_type.value_owned) {
+                               if (result.value_type.value_owned) {
                                        result.delegate_target_destroy_notify_cvalue = new CCodeIdentifier (get_delegate_target_destroy_notify_cname (field.get_cname ()));
                                }
                        }