diff options
author | Jürg Billeter <j@bitron.ch> | 2011-02-16 17:19:59 +0100 |
---|---|---|
committer | Jürg Billeter <j@bitron.ch> | 2011-02-16 17:19:59 +0100 |
commit | 83c2095d821724234d667f6ae4934ae9e1cd7800 (patch) | |
tree | 26d9a4073d0733aa5ff24e0696f605e2533c2092 | |
parent | 8bdc01af37d50ff70c36c19a80b10b7395cf2539 (diff) | |
download | vala-emit-j.tar.gz |
codegen: Use destroy_variable in store_*emit-j
-rw-r--r-- | codegen/valaccodeassignmentmodule.vala | 24 | ||||
-rw-r--r-- | codegen/valaccodememberaccessmodule.vala | 2 | ||||
-rw-r--r-- | codegen/valadovaassignmentmodule.vala | 4 | ||||
-rw-r--r-- | codegen/valadovamemberaccessmodule.vala | 2 | ||||
-rw-r--r-- | vala/valaassignment.vala | 14 | ||||
-rw-r--r-- | vala/valacodegenerator.vala | 4 |
6 files changed, 38 insertions, 12 deletions
diff --git a/codegen/valaccodeassignmentmodule.vala b/codegen/valaccodeassignmentmodule.vala index 136712ea1..83552a6f9 100644 --- a/codegen/valaccodeassignmentmodule.vala +++ b/codegen/valaccodeassignmentmodule.vala @@ -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); + } } diff --git a/codegen/valaccodememberaccessmodule.vala b/codegen/valaccodememberaccessmodule.vala index 97fedd8bc..1ea26bcb6 100644 --- a/codegen/valaccodememberaccessmodule.vala +++ b/codegen/valaccodememberaccessmodule.vala @@ -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)); } } diff --git a/codegen/valadovaassignmentmodule.vala b/codegen/valadovaassignmentmodule.vala index 1338b024f..e2123144a 100644 --- a/codegen/valadovaassignmentmodule.vala +++ b/codegen/valadovaassignmentmodule.vala @@ -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); + } } diff --git a/codegen/valadovamemberaccessmodule.vala b/codegen/valadovamemberaccessmodule.vala index 7cc3d6752..8538db037 100644 --- a/codegen/valadovamemberaccessmodule.vala +++ b/codegen/valadovamemberaccessmodule.vala @@ -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)); } } diff --git a/vala/valaassignment.vala b/vala/valaassignment.vala index 199226fd8..9fb81c6b6 100644 --- a/vala/valaassignment.vala +++ b/vala/valaassignment.vala @@ -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) { diff --git a/vala/valacodegenerator.vala b/vala/valacodegenerator.vala index d3ca065d6..a7680324c 100644 --- a/vala/valacodegenerator.vala +++ b/vala/valacodegenerator.vala @@ -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); } |