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 /codegen | |
parent | d6b9e6aace8388d76a29b3df83413dec76324833 (diff) | |
download | vala-3c64222b6361aceb5ee42c7523c9d854a0d7f731.tar.gz |
vala: Allow to use store_field() for initializations
Diffstat (limited to 'codegen')
-rw-r--r-- | codegen/valaccodeassignmentmodule.vala | 10 | ||||
-rw-r--r-- | codegen/valaccodebasemodule.vala | 6 | ||||
-rw-r--r-- | codegen/valaccodestructmodule.vala | 2 |
3 files changed, 12 insertions, 6 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); } } |