diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2023-01-04 22:47:01 +0100 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2023-01-04 22:47:01 +0100 |
commit | 3c64222b6361aceb5ee42c7523c9d854a0d7f731 (patch) | |
tree | 102a156aca60912b396760fdaf5c4bb221b5d1ef | |
parent | d6b9e6aace8388d76a29b3df83413dec76324833 (diff) | |
download | vala-3c64222b6361aceb5ee42c7523c9d854a0d7f731.tar.gz |
vala: Allow to use store_field() for initializations
-rw-r--r-- | codegen/valaccodeassignmentmodule.vala | 10 | ||||
-rw-r--r-- | codegen/valaccodebasemodule.vala | 6 | ||||
-rw-r--r-- | codegen/valaccodestructmodule.vala | 2 | ||||
-rw-r--r-- | vala/valaassignment.vala | 2 | ||||
-rw-r--r-- | vala/valacodegenerator.vala | 2 |
5 files changed, 14 insertions, 8 deletions
diff --git a/codegen/valaccodeassignmentmodule.vala b/codegen/valaccodeassignmentmodule.vala index c77a16894..4f36e13ea 100644 --- a/codegen/valaccodeassignmentmodule.vala +++ b/codegen/valaccodeassignmentmodule.vala @@ -226,16 +226,22 @@ public class Vala.CCodeAssignmentModule : CCodeMemberAccessModule { store_value (get_parameter_cvalue (param), value, source_reference); } - public override void store_field (Field field, TargetValue? instance, TargetValue value, SourceReference? source_reference = null) { + public override void store_field (Field field, TargetValue? instance, TargetValue value, bool initializer, SourceReference? source_reference = null) { var lvalue = get_field_cvalue (field, instance); var type = lvalue.value_type; if (lvalue.actual_value_type != null) { type = lvalue.actual_value_type; } - if ((!(field.variable_type is DelegateType) || get_ccode_delegate_target (field)) && requires_destroy (type)) { + if (!initializer && (!(field.variable_type is DelegateType) || get_ccode_delegate_target (field)) && requires_destroy (type)) { /* unref old value */ ccode.add_expression (destroy_field (field, instance)); } + if (initializer && instance != null && get_ccode_delegate_target (field) && get_delegate_target_cvalue (value) == null) { + unowned DelegateType delegate_type = field.variable_type as DelegateType; + if (delegate_type != null && delegate_type.delegate_symbol.has_target) { + ((GLibValue) value).delegate_target_cvalue = get_cvalue_ (instance); + } + } store_value (lvalue, value, source_reference); } diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index c8301c821..6d4d9cd20 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -2999,7 +2999,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { } } - store_field (field, instance, expr.target_value, expr.source_reference); + store_field (field, instance, expr.target_value, false, expr.source_reference); } list.target_value = instance; @@ -5336,7 +5336,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { var f = (Field) init.symbol_reference; var instance_target_type = SemanticAnalyzer.get_data_type_for_symbol ((TypeSymbol) f.parent_symbol); var typed_inst = transform_value (new GLibValue (expr.type_reference, instance, true), instance_target_type, init); - store_field (f, typed_inst, init.initializer.target_value, init.source_reference); + store_field (f, typed_inst, init.initializer.target_value, false, init.source_reference); var cl = f.parent_symbol as Class; if (cl != null) { @@ -6791,7 +6791,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { continue; } } - store_field (f, dest_struct, value); + store_field (f, dest_struct, value, false); } } diff --git a/codegen/valaccodestructmodule.vala b/codegen/valaccodestructmodule.vala index 19a616999..35779f881 100644 --- a/codegen/valaccodestructmodule.vala +++ b/codegen/valaccodestructmodule.vala @@ -339,7 +339,7 @@ public abstract class Vala.CCodeStructModule : CCodeBaseModule { continue; } } - store_field (f, dest_struct, value); + store_field (f, dest_struct, value, false); } } diff --git a/vala/valaassignment.vala b/vala/valaassignment.vala index 929fa7b66..1d62a17c0 100644 --- a/vala/valaassignment.vala +++ b/vala/valaassignment.vala @@ -530,7 +530,7 @@ public class Vala.Assignment : Expression { } else if (param != null) { codegen.store_parameter (param, new_value, false, source_reference); } else if (field != null) { - codegen.store_field (field, instance && ma.inner != null ? ma.inner.target_value : null, new_value, source_reference); + codegen.store_field (field, instance && ma.inner != null ? ma.inner.target_value : null, new_value, false, source_reference); } if (!(parent_node is ExpressionStatement)) { diff --git a/vala/valacodegenerator.vala b/vala/valacodegenerator.vala index 9452b49a3..4377a0771 100644 --- a/vala/valacodegenerator.vala +++ b/vala/valacodegenerator.vala @@ -42,5 +42,5 @@ public abstract class Vala.CodeGenerator : CodeVisitor { public abstract TargetValue load_field (Field field, TargetValue? instance, Expression? expr = null); - public abstract void store_field (Field field, TargetValue? instance, TargetValue value, SourceReference? source_reference = null); + public abstract void store_field (Field field, TargetValue? instance, TargetValue value, bool initializer, SourceReference? source_reference = null); } |