From: Luca Bruno Date: Tue, 12 Aug 2014 21:14:25 +0000 (+0200) Subject: codegen: Fix (unowned foo)[] to foo[] array copy X-Git-Tag: 0.27.1~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a6df1b95af42610a3c580188976a194ac8383d2a;p=thirdparty%2Fvala.git codegen: Fix (unowned foo)[] to foo[] array copy Fixes bug 731017 --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 8d6ebddf9..e87b0b130 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -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) { diff --git a/tests/Makefile.am b/tests/Makefile.am index 8143bda83..3dab72c1e 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -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 index 000000000..0b1e0ac37 --- /dev/null +++ b/tests/basic-types/bug731017.vala @@ -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 hash_table); + +private static int main (string[] args) { + var ht = new GLib.HashTable (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