summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2023-01-04 22:47:01 +0100
committerRico Tzschichholz <ricotz@ubuntu.com>2023-01-04 22:47:01 +0100
commit3c64222b6361aceb5ee42c7523c9d854a0d7f731 (patch)
tree102a156aca60912b396760fdaf5c4bb221b5d1ef
parentd6b9e6aace8388d76a29b3df83413dec76324833 (diff)
downloadvala-3c64222b6361aceb5ee42c7523c9d854a0d7f731.tar.gz
vala: Allow to use store_field() for initializations
-rw-r--r--codegen/valaccodeassignmentmodule.vala10
-rw-r--r--codegen/valaccodebasemodule.vala6
-rw-r--r--codegen/valaccodestructmodule.vala2
-rw-r--r--vala/valaassignment.vala2
-rw-r--r--vala/valacodegenerator.vala2
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);
}