From: Rico Tzschichholz Date: Mon, 31 Jan 2022 15:37:44 +0000 (+0100) Subject: codegen: Use correct target/destroy of delegate field initializer X-Git-Tag: 0.52.11~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5e9f65aaac3dea17f44196e5da9a5ffcff377da9;p=thirdparty%2Fvala.git codegen: Use correct target/destroy of delegate field initializer Fixes https://gitlab.gnome.org/GNOME/vala/issues/1285 --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 6c1a14910..a368894e2 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -1272,10 +1272,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 48369672a..7b625b142 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -409,6 +409,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"); + } +}