[vala/0.40] codegen: Don't free value if property setter takes ownership



commit ad0202a244dd1f40f00afa76b8abb9466077d2cd
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Tue Mar 31 10:39:38 2020 +0200

    codegen: Don't free value if property setter takes ownership
    
    Correctly handle owned property accessor in object initializer.
    
    In addition to c0e955db075d3d155782c167a0abb81e0dce5f59
    
    See https://gitlab.gnome.org/GNOME/vala/issues/953

 codegen/valaccodebasemodule.vala                   |  2 +-
 tests/Makefile.am                                  |  1 +
 .../member-initializer-property-owned-setter.vala  | 22 ++++++++++++++++++++++
 3 files changed, 24 insertions(+), 1 deletion(-)
---
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 64c80efeb..b77f7e63e 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -5087,7 +5087,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                        inst_ma.target_value = typed_inst;
                                        store_property (p, inst_ma, init.initializer.target_value);
                                        // FIXME Do not ref/copy in the first place
-                                       if (requires_destroy (init.initializer.target_value.value_type)) {
+                                       if (!p.set_accessor.value_type.value_owned && requires_destroy 
(init.initializer.target_value.value_type)) {
                                                ccode.add_expression (destroy_value 
(init.initializer.target_value));
                                        }
                                }
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 04a2509d9..80a276df7 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -322,6 +322,7 @@ TESTS = \
        objects/interface-property-delegate.vala \
        objects/interface-property-override.vala \
        objects/member-initializer-base-properties.vala \
+       objects/member-initializer-property-owned-setter.vala \
        objects/methods.vala \
        objects/paramspec.vala \
        objects/properties.vala \
diff --git a/tests/objects/member-initializer-property-owned-setter.vala 
b/tests/objects/member-initializer-property-owned-setter.vala
new file mode 100644
index 000000000..8f65b7b3d
--- /dev/null
+++ b/tests/objects/member-initializer-property-owned-setter.vala
@@ -0,0 +1,22 @@
+class Bar : Object {
+}
+
+class Foo : Object {
+       public string[] faz { get; owned set; }
+       public Bar bar { get; owned set; }
+}
+
+void main() {
+       string[] sa = { "foo", "bar" };
+       var o = new Bar ();
+
+       var foo = new Foo () {
+               faz = sa,
+               bar = o
+       };
+
+       assert (foo.faz[1] == "bar");
+       assert (foo.bar.ref_count == 2);
+       assert (sa[0] == "foo");
+       assert (o.ref_count == 2);
+}


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