]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Fix (unowned foo)[] to foo[] array copy
authorLuca Bruno <lucabru@src.gnome.org>
Tue, 12 Aug 2014 21:14:25 +0000 (23:14 +0200)
committerLuca Bruno <lucabru@src.gnome.org>
Sun, 21 Dec 2014 15:24:01 +0000 (16:24 +0100)
Fixes bug 731017

codegen/valaccodebasemodule.vala
tests/Makefile.am
tests/basic-types/bug731017.vala [new file with mode: 0644]

index 8d6ebddf9d6a956fd87eae60422bd62cf0413767..e87b0b1309efcbd4d65487f345d42ca9a3102aa8 100644 (file)
@@ -5743,7 +5743,16 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                        result.lvalue = result.lvalue && result.cvalue == old_cexpr;
                }
 
-               if (!gvalue_boxing && !gvariant_boxing && target_type.value_owned && (!type.value_owned || boxing || unboxing) && requires_copy (target_type) && !(type is NullType)) {
+               bool array_needs_copy = false;
+               if (type is ArrayType && target_type is ArrayType) {
+                       var array = (ArrayType) type;
+                       var target_array = (ArrayType) target_type;
+                       if (target_array.element_type.value_owned && !array.element_type.value_owned) {
+                               array_needs_copy = requires_copy (target_array.element_type);
+                       }
+               }
+               
+               if (!gvalue_boxing && !gvariant_boxing && target_type.value_owned && (!type.value_owned || boxing || unboxing || array_needs_copy) && requires_copy (target_type) && !(type is NullType)) {
                        // need to copy value
                        var copy = (GLibValue) copy_value (result, node);
                        if (target_type.data_type is Interface && copy == null) {
index 8143bda83f85d8ae7917e8799ab13d6baeac7aa9..3dab72c1e692a8f01c52a00cee5c7b2b3512b823 100644 (file)
@@ -38,6 +38,7 @@ TESTS = \
        basic-types/bug678791.vala \
        basic-types/bug686336.vala \
        basic-types/bug729907.vala \
+       basic-types/bug731017.vala \
        namespaces.vala \
        methods/lambda.vala \
        methods/closures.vala \
diff --git a/tests/basic-types/bug731017.vala b/tests/basic-types/bug731017.vala
new file mode 100644 (file)
index 0000000..0b1e0ac
--- /dev/null
@@ -0,0 +1,17 @@
+[CCode (cname = "g_hash_table_get_keys_as_array", array_length_type = "guint", type = "gpointer*")]
+public extern (unowned string)[] g_hash_table_get_keys_as_array (GLib.HashTable<string,string> hash_table);
+
+private static int main (string[] args) {
+  var ht = new GLib.HashTable<string,string> (GLib.str_hash, GLib.str_equal);
+  ht["one"] = "hello";
+  ht["two"] = "world";
+
+  string[] keys = g_hash_table_get_keys_as_array (ht);
+  ht = null;
+  
+  foreach (unowned string k in keys) {
+         assert (k == "one" || k == "two");
+  }
+
+  return 0;
+}
\ No newline at end of file