]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Add actual_value_type to TargetValue
authorLuca Bruno <lucabru@src.gnome.org>
Fri, 1 Jul 2011 18:19:50 +0000 (20:19 +0200)
committerLuca Bruno <lucabru@src.gnome.org>
Wed, 6 Jul 2011 20:32:28 +0000 (22:32 +0200)
codegen/valaccodeassignmentmodule.vala
codegen/valaccodebasemodule.vala
codegen/valaccodememberaccessmodule.vala
vala/valatargetvalue.vala

index 725fde0f35a696f5d9f01d8f6678f8dc91f61feb..b74886861484482affc88fbd398b7ff536c7efd0 100644 (file)
@@ -268,11 +268,16 @@ public class Vala.CCodeAssignmentModule : CCodeMemberAccessModule {
        }
 
        public override void store_field (Field field, TargetValue? instance, TargetValue value) {
-               if (requires_destroy (get_field_cvalue (field, instance).value_type)) {
+               var lvalue = get_field_cvalue (field, instance);
+               var type = lvalue.value_type;
+               if (lvalue.actual_value_type != null) {
+                       type = lvalue.actual_value_type;
+               }
+               if (requires_destroy (type)) {
                        /* unref old value */
                        ccode.add_expression (destroy_field (field, instance));
                }
 
-               store_value (get_field_cvalue (field, instance), value);
+               store_value (lvalue, value);
        }
 }
index c25f0bebec1dad6bd7fd8bd1a44c142453217c9f..ae8f07f44882bea6228cda8d7b73785355c59e19 100644 (file)
@@ -2888,6 +2888,9 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
        // apply changes to both methods
        public virtual CCodeExpression destroy_value (TargetValue value, bool is_macro_definition = false) {
                var type = value.value_type;
+               if (value.actual_value_type != null) {
+                       type = value.actual_value_type;
+               }
                var cvar = get_cvalue_ (value);
 
                if (type is DelegateType) {
@@ -5910,6 +5913,7 @@ public class Vala.GLibValue : TargetValue {
 
        public GLibValue copy () {
                var result = new GLibValue (value_type.copy (), cvalue);
+               result.actual_value_type = actual_value_type;
                result.non_null = non_null;
                result.ctype = ctype;
 
index 8ecd8419e7c367609a6d93cefbf8a354c5039459..2b594db9aa21a45b6b1d6eb03c9963ed120d20d2 100644 (file)
@@ -514,11 +514,11 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
        /* Returns lvalue access to the given field */
        public override TargetValue get_field_cvalue (Field field, TargetValue? instance) {
                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);
+               if (instance != null) {
+                       result.actual_value_type = field.variable_type.get_actual_type (instance.value_type, null, field);
+               }
                result.array_null_terminated = field.array_null_terminated;
                if (field.has_array_length_cexpr) {
                        result.array_length_cexpr = new CCodeConstant (field.get_array_length_cexpr ());
index b21483ea0237005b29132b0c8acdd8d9ad88eefd..4cdbccc276db60d803a8852475c08478ce8f0686 100644 (file)
@@ -22,6 +22,7 @@
 
 public abstract class Vala.TargetValue {
        public DataType? value_type { get; set; }
+       public DataType? actual_value_type { get; set; }
 
        protected TargetValue (DataType? value_type) {
                this.value_type = value_type;