]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Use destroy_variable in store_*
authorJürg Billeter <j@bitron.ch>
Wed, 16 Feb 2011 16:19:59 +0000 (17:19 +0100)
committerJürg Billeter <j@bitron.ch>
Tue, 22 Feb 2011 14:58:29 +0000 (15:58 +0100)
codegen/valaccodeassignmentmodule.vala
codegen/valaccodememberaccessmodule.vala
codegen/valadovaassignmentmodule.vala
codegen/valadovamemberaccessmodule.vala
vala/valaassignment.vala
vala/valacodegenerator.vala

index 136712ea16e166f5a10d1539dae80f566538626c..83552a6f99f60951976caca59093bf24ea96edc9 100644 (file)
@@ -170,11 +170,6 @@ public class Vala.CCodeAssignmentModule : CCodeMemberAccessModule {
        }
 
        void store_variable (Variable variable, TargetValue lvalue, TargetValue value, bool initializer) {
-               if (!initializer && requires_destroy (variable.variable_type)) {
-                       /* unref old value */
-                       ccode.add_expression (destroy_value (lvalue));
-               }
-
                ccode.add_assignment (get_cvalue_ (lvalue), get_cvalue_ (value));
 
                var array_type = variable.variable_type as ArrayType;
@@ -221,10 +216,29 @@ public class Vala.CCodeAssignmentModule : CCodeMemberAccessModule {
        }
 
        public override void store_local (LocalVariable local, TargetValue value, bool initializer) {
+               if (!initializer && requires_destroy (local.variable_type)) {
+                       /* unref old value */
+                       ccode.add_expression (destroy_local (local));
+               }
+
                store_variable (local, get_local_cvalue (local), value, initializer);
        }
 
        public override void store_parameter (Parameter param, TargetValue value) {
+               if (requires_destroy (param.variable_type)) {
+                       /* unref old value */
+                       ccode.add_expression (destroy_parameter (param));
+               }
+
                store_variable (param, get_parameter_cvalue (param), value, false);
        }
+
+       public override void store_field (Field field, Expression? instance, TargetValue value) {
+               if (requires_destroy (field.variable_type)) {
+                       /* unref old value */
+                       ccode.add_expression (destroy_field (field, instance));
+               }
+
+               store_variable (field, get_field_cvalue (field, instance), value, false);
+       }
 }
index 97fedd8bcb048a7b6bbe048948fa47e5fe869fb4..1ea26bcb6f78b3c24bb1c6dda7939139b783450f 100644 (file)
@@ -694,7 +694,7 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
        }
 
        /* Returns unowned access to the given field */
-       public TargetValue load_field (Field field, Expression? instance) {
+       public override TargetValue load_field (Field field, Expression? instance) {
                return load_variable (field, get_field_cvalue (field, instance));
        }
 }
index 1338b024fb3531e596615552feac509616287e4e..e2123144a44f9d6ecd7ccc9a6181134d1178e4f8 100644 (file)
@@ -148,4 +148,8 @@ public class Vala.DovaAssignmentModule : DovaMemberAccessModule {
        public override void store_parameter (Parameter param, TargetValue value) {
                store_variable (param, get_parameter_cvalue (param), value, false);
        }
+
+       public override void store_field (Field field, Expression? instance, TargetValue value) {
+               store_variable (field, get_field_cvalue (field, instance), value, false);
+       }
 }
index 7cc3d6752dd09814590381a487b4e137065eca4e..8538db037b5920d98d5a78f86059dc3f724f2b00 100644 (file)
@@ -295,7 +295,7 @@ public abstract class Vala.DovaMemberAccessModule : DovaControlFlowModule {
                return load_variable (param, get_parameter_cvalue (param));
        }
 
-       public TargetValue load_field (Field field, Expression? instance) {
+       public override TargetValue load_field (Field field, Expression? instance) {
                return load_variable (field, get_field_cvalue (field, instance));
        }
 }
index 199226fd8e8872213954ed01e96af5e9787ccf06..9fb81c6b6d69e6fe84b52f237224946c296bc286 100644 (file)
@@ -466,14 +466,14 @@ public class Vala.Assignment : Expression {
                        var field = ma.symbol_reference as Field;
                        var property = ma.symbol_reference as Property;
 
-                       bool instance = (field != null && field.binding == MemberBinding.INSTANCE)
-                               || (property != null && property.binding == MemberBinding.INSTANCE);
+                       bool instance = (field != null && field.binding != MemberBinding.STATIC)
+                               || (property != null && property.binding != MemberBinding.STATIC);
 
                        if (operator == AssignmentOperator.SIMPLE &&
-                           (local != null || param != null) &&
+                           (local != null || param != null || field != null) &&
                            !is_array_add ()) {
                                // visit_assignment not necessary
-                               if (instance) {
+                               if (instance && ma.inner != null) {
                                        ma.inner.emit (codegen);
                                }
 
@@ -484,6 +484,8 @@ public class Vala.Assignment : Expression {
                                        codegen.store_local (local, new_value, false);
                                } else if (param != null) {
                                        codegen.store_parameter (param, new_value);
+                               } else if (field != null) {
+                                       codegen.store_field (field, instance ? ma.inner : null, new_value);
                                }
 
                                // when load_variable is changed to use temporary
@@ -493,6 +495,8 @@ public class Vala.Assignment : Expression {
                                        target_value = codegen.load_local (local);
                                } else if (param != null) {
                                        target_value = codegen.load_parameter (param);
+                               } else if (field != null) {
+                                       target_value = codegen.load_field (field, instance ? ma.inner : null);
                                }
 
                                codegen.visit_expression (this);
@@ -505,7 +509,7 @@ public class Vala.Assignment : Expression {
                                // should be removed when moving codegen from
                                // visit_assignment to emit_store_field
                                ma.emit (codegen);
-                       } else if (instance) {
+                       } else if (instance && ma.inner != null) {
                                ma.inner.emit (codegen);
                        }
                } else if (ea != null) {
index d3ca065d61ae0481ae2bf244125ece929bd2862c..a7680324c08512b5603cbb132de8ec09e7a52f9d 100644 (file)
@@ -41,4 +41,8 @@ public abstract class Vala.CodeGenerator : CodeVisitor {
        public abstract TargetValue load_parameter (Parameter param);
 
        public abstract void store_parameter (Parameter param, TargetValue value);
+
+       public abstract TargetValue load_field (Field field, Expression? instance);
+
+       public abstract void store_field (Field field, Expression? instance, TargetValue value);
 }