]> 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>
Mon, 18 Nov 2019 08:33:40 +0000 (09:33 +0100)
codegen/valagtypemodule.vala
tests/Makefile.am
tests/objects/interface-property-delegate.vala [new file with mode: 0644]

index 9bdd5743def0239750bd686b3f630d848316eca0..8f7f976eadad73e22a985ca6ec01c9df6dad8c7c 100644 (file)
@@ -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");
index f049e7778d171a02db19f8eac7631f5f9db7d900..b9b0623343187933083a830cf77238e49ecc8412 100644 (file)
@@ -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 (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);
+}