]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Fix vfunc signature of delegate-typed property in interface
authorRico Tzschichholz <ricotz@ubuntu.com>
Thu, 14 Nov 2019 16:28:08 +0000 (17:28 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Thu, 14 Nov 2019 16:36:30 +0000 (17:36 +0100)
codegen/valagtypemodule.vala
tests/Makefile.am
tests/objects/interface-property-delegate.vala [new file with mode: 0644]

index f1c7752649c0c049cee1ad1d9ffb9aa7e446f63d..00ebe26c48e91efef102438fa41017304c4383cc 100644 (file)
@@ -2173,6 +2173,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 (get_ccode_name (creturn_type));
@@ -2196,6 +2198,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");
index bc79845a7ed0d2fa2032d5098c869eab2c11fbec..24331e437fcaae2b521a5f7bfd00cb0027d9bf0a 100644 (file)
@@ -341,6 +341,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 (file)
index 0000000..485f125
--- /dev/null
@@ -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);
+}