summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2022-01-31 16:37:44 +0100
committerRico Tzschichholz <ricotz@ubuntu.com>2022-02-16 18:39:25 +0100
commit8c86b4e5a124c0c913652ce76f244ea006037fce (patch)
tree4f79deb729035854def3ea5a5645bb6d06cdf0e2
parent4964667e36a479a08d1171c781728a532195ba7d (diff)
downloadvala-8c86b4e5a124c0c913652ce76f244ea006037fce.tar.gz
codegen: Use correct target/destroy of delegate field initializer
Fixes https://gitlab.gnome.org/GNOME/vala/issues/1285
-rw-r--r--codegen/valaccodebasemodule.vala15
-rw-r--r--tests/Makefile.am1
-rw-r--r--tests/delegates/class-field-initializer.vala26
3 files changed, 39 insertions, 3 deletions
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 39abb0f41..94a31b3f5 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -1222,10 +1222,19 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
var delegate_type = (DelegateType) f.variable_type;
if (delegate_type.delegate_symbol.has_target) {
var field_value = get_field_cvalue (f, load_this_parameter ((TypeSymbol) f.parent_symbol));
-
- ccode.add_assignment (get_delegate_target_cvalue (field_value), new CCodeIdentifier ("self"));
+ var target_cvalue = get_delegate_target_cvalue (f.initializer.target_value);
+ if (target_cvalue != null) {
+ ccode.add_assignment (get_delegate_target_cvalue (field_value), target_cvalue);
+ } else {
+ ccode.add_assignment (get_delegate_target_cvalue (field_value), new CCodeIdentifier ("self"));
+ }
if (delegate_type.is_disposable ()) {
- ccode.add_assignment (get_delegate_target_destroy_notify_cvalue (field_value), new CCodeConstant ("NULL"));
+ var destroy_cvalue = get_delegate_target_destroy_notify_cvalue (f.initializer.target_value);
+ if (destroy_cvalue != null) {
+ ccode.add_assignment (get_delegate_target_destroy_notify_cvalue (field_value), destroy_cvalue);
+ } else {
+ ccode.add_assignment (get_delegate_target_destroy_notify_cvalue (field_value), new CCodeConstant ("NULL"));
+ }
}
}
}
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 0dd5fc9d4..c36f4aad3 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -405,6 +405,7 @@ TESTS = \
structs/bug777194.vala \
structs/bug777194-2.vala \
delegates/casting.vala \
+ delegates/class-field-initializer.vala \
delegates/compatible.vala \
delegates/delegate_only.vala \
delegates/delegate-recusive.vala \
diff --git a/tests/delegates/class-field-initializer.vala b/tests/delegates/class-field-initializer.vala
new file mode 100644
index 000000000..5a84e4af8
--- /dev/null
+++ b/tests/delegates/class-field-initializer.vala
@@ -0,0 +1,26 @@
+delegate string FooFunc ();
+
+FooFunc get_func () {
+ var s = "foo";
+ return () => { return s; };
+}
+
+class Foo {
+ public FooFunc func = get_func ();
+}
+
+[Compact]
+class Bar {
+ public FooFunc func = get_func ();
+}
+
+void main () {
+ {
+ var foo = new Foo ();
+ assert (foo.func () == "foo");
+ }
+ {
+ var bar = new Bar ();
+ assert (bar.func () == "foo");
+ }
+}