From 321825c565a6731ef21556132e89e474c3ac75f3 Mon Sep 17 00:00:00 2001 From: Rico Tzschichholz Date: Thu, 14 Nov 2019 17:28:08 +0100 Subject: [PATCH] codegen: Fix vfunc signature of delegate-typed property in interface --- codegen/valagtypemodule.vala | 4 +++ tests/Makefile.am | 1 + .../objects/interface-property-delegate.vala | 29 +++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 tests/objects/interface-property-delegate.vala diff --git a/codegen/valagtypemodule.vala b/codegen/valagtypemodule.vala index 9bdd5743d..8f7f976ea 100644 --- a/codegen/valagtypemodule.vala +++ b/codegen/valagtypemodule.vala @@ -2163,6 +2163,8 @@ public class Vala.GTypeModule : GErrorModule { for (int dim = 1; dim <= array_type.rank; dim++) { vdeclarator.add_parameter (new CCodeParameter (get_array_length_cname ("result", dim), length_ctype)); } + } else if ((prop.property_type is DelegateType) && get_ccode_delegate_target (prop) && ((DelegateType) prop.property_type).delegate_symbol.has_target) { + vdeclarator.add_parameter (new CCodeParameter (get_delegate_target_cname ("result"), "gpointer*")); } var vdecl = new CCodeDeclaration (creturn_type); @@ -2186,6 +2188,8 @@ public class Vala.GTypeModule : GErrorModule { for (int dim = 1; dim <= array_type.rank; dim++) { vdeclarator.add_parameter (new CCodeParameter (get_array_length_cname ("value", dim), length_ctype)); } + } else if ((prop.property_type is DelegateType) && get_ccode_delegate_target (prop) && ((DelegateType) prop.property_type).delegate_symbol.has_target) { + vdeclarator.add_parameter (new CCodeParameter (get_delegate_target_cname ("value"), "gpointer")); } var vdecl = new CCodeDeclaration ("void"); diff --git a/tests/Makefile.am b/tests/Makefile.am index f049e7778..b9b062334 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -328,6 +328,7 @@ TESTS = \ objects/interfaces.vala \ objects/interface-generics.vala \ objects/interface-property-base-access.vala \ + objects/interface-property-delegate.vala \ objects/interface-virtual-override.vala \ objects/methods.vala \ objects/paramspec.vala \ diff --git a/tests/objects/interface-property-delegate.vala b/tests/objects/interface-property-delegate.vala new file mode 100644 index 000000000..485f12516 --- /dev/null +++ b/tests/objects/interface-property-delegate.vala @@ -0,0 +1,29 @@ +delegate void FooFunc (); + +interface IFoo { + public abstract unowned FooFunc prop { get; set; } +} + +class Foo : IFoo { + public unowned FooFunc prop { get; set; } +} + +class Bar { + public bool reached; + + public Bar () { + var foo = new Foo (); + foo.prop = bar; + + foo.prop (); + } + + void bar () { + reached = true; + } +} + +void main () { + var bar = new Bar (); + assert (bar.reached); +} -- 2.47.2