[vala/0.46] codegen: Add destroy of parameter in vfunc of delegate property setter



commit 154d25bcb2186cd7417bc5c11f8fb5daf2eb80cd
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Sat Mar 7 10:08:33 2020 +0100

    codegen: Add destroy of parameter in vfunc of delegate property setter
    
    The vfunc of an owned setter requires a destroy parameter. Support for
    this was introduced with 1e90d53dba0eff6ec2babd8292676099308dd4f6
    
    Fixes https://gitlab.gnome.org/GNOME/vala/issues/919

 codegen/valagtypemodule.vala               |  6 ++++
 tests/Makefile.am                          |  1 +
 tests/objects/property-delegate-owned.vala | 53 ++++++++++++++++++++++++++++++
 3 files changed, 60 insertions(+)
---
diff --git a/codegen/valagtypemodule.vala b/codegen/valagtypemodule.vala
index ff0be7e08..d4e0f3eec 100644
--- a/codegen/valagtypemodule.vala
+++ b/codegen/valagtypemodule.vala
@@ -386,6 +386,9 @@ public class Vala.GTypeModule : GErrorModule {
                                }
                        } else if ((prop.property_type is DelegateType) && ((DelegateType) 
prop.property_type).delegate_symbol.has_target) {
                                vdeclarator.add_parameter (new CCodeParameter (get_delegate_target_cname 
("value"), "gpointer"));
+                               if (prop.set_accessor.value_type.value_owned) {
+                                       vdeclarator.add_parameter (new CCodeParameter 
(get_delegate_target_destroy_notify_cname ("value"), get_ccode_name (delegate_target_destroy_type)));
+                               }
                        }
 
                        var vdecl = new CCodeDeclaration ("void");
@@ -2193,6 +2196,9 @@ public class Vala.GTypeModule : GErrorModule {
                                                }
                                        } 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"));
+                                               if (prop.set_accessor.value_type.value_owned) {
+                                                       vdeclarator.add_parameter (new CCodeParameter 
(get_delegate_target_destroy_notify_cname ("value"), get_ccode_name (delegate_target_destroy_type)));
+                                               }
                                        }
 
                                        var vdecl = new CCodeDeclaration ("void");
diff --git a/tests/Makefile.am b/tests/Makefile.am
index fcbfee968..1b988cad1 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -365,6 +365,7 @@ TESTS = \
        objects/property-read-only-write.test \
        objects/property-construct-only-write.test \
        objects/property-construct-only-write-foreign.test \
+       objects/property-delegate-owned.vala \
        objects/property-gboxed-nullable.vala \
        objects/property-real-struct-no-accessor.test \
        objects/property-simple-type-struct-nullable.vala \
diff --git a/tests/objects/property-delegate-owned.vala b/tests/objects/property-delegate-owned.vala
new file mode 100644
index 000000000..12c3e4d44
--- /dev/null
+++ b/tests/objects/property-delegate-owned.vala
@@ -0,0 +1,53 @@
+delegate void FooFunc ();
+
+interface IFoo {
+       public abstract FooFunc foo { get; owned set; }
+       public abstract FooFunc bar { get; owned set; }
+}
+
+class Foo : IFoo {
+       FooFunc? _bar;
+
+       public virtual FooFunc foo { get; owned set; }
+
+       public virtual FooFunc bar {
+               get {
+                       return _bar;
+               }
+               owned set {
+                       _bar = (owned) value;
+               }
+       }
+
+       public Foo () {
+               foo = () => {};
+               bar = () => {};
+       }
+}
+
+class Bar : Foo {
+       FooFunc? _bar;
+
+       public override FooFunc foo { get; owned set; }
+
+       public override FooFunc bar {
+               get {
+                       return _bar;
+               }
+               owned set {
+                       _bar = (owned) value;
+               }
+       }
+
+       public Bar () {
+               foo = () => {};
+               bar = () => {};
+       }
+}
+
+void main () {
+       var foo = new Foo ();
+       foo.foo ();
+       var bar = new Bar ();
+       bar.bar ();
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]