[vala/0.40] codegen: Add destroy of parameter in vfunc of delegate property setter
- From: Rico Tzschichholz <ricotz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/0.40] codegen: Add destroy of parameter in vfunc of delegate property setter
- Date: Tue, 24 Mar 2020 09:46:05 +0000 (UTC)
commit 9fe7591e1113a15c3451c306910447fe2b5854cd
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 5072f0e69..080f22c0e 100644
--- a/codegen/valagtypemodule.vala
+++ b/codegen/valagtypemodule.vala
@@ -369,6 +369,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"), "GDestroyNotify"));
+ }
}
var vdecl = new CCodeDeclaration ("void");
@@ -2164,6 +2167,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"), "GDestroyNotify"));
+ }
}
var vdecl = new CCodeDeclaration ("void");
diff --git a/tests/Makefile.am b/tests/Makefile.am
index f5f7d9153..e66fad791 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -321,6 +321,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-static.vala \
objects/regex.vala \
objects/signals.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]