From: Rico Tzschichholz Date: Thu, 14 Nov 2019 16:28:08 +0000 (+0100) Subject: codegen: Fix vfunc signature of delegate-typed property in interface X-Git-Tag: 0.44.11~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=321825c565a6731ef21556132e89e474c3ac75f3;p=thirdparty%2Fvala.git codegen: Fix vfunc signature of delegate-typed property in interface --- 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); +}