diff options
author | Evan Nemerson <evan@coeus-group.com> | 2014-01-28 16:06:50 -0800 |
---|---|---|
committer | Evan Nemerson <evan@coeus-group.com> | 2014-01-28 16:10:06 -0800 |
commit | 0d8ab7be120106388b4c9777ad4715069a575228 (patch) | |
tree | 07ef84a53c157adc7d58bfd810504c09ae7d98db | |
parent | 8f9979da7a75cb91a46e47e61bf35a41c8ff8083 (diff) | |
download | vala-0d8ab7be120106388b4c9777ad4715069a575228.tar.gz |
glib-2.0: fix string.joinv for empty (but not null) arrays
Fixes bug 723195.
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rw-r--r-- | tests/methods/bug723195.vala | 25 | ||||
-rw-r--r-- | vapi/glib-2.0.vapi | 12 |
3 files changed, 34 insertions, 4 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am index 9c47ec5f2..77b2fa032 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -57,6 +57,7 @@ TESTS = \ methods/bug653908.vala \ methods/bug663210.vala \ methods/bug723009.vala \ + methods/bug723195.vala \ methods/generics.vala \ control-flow/break.vala \ control-flow/expressions-conditional.vala \ diff --git a/tests/methods/bug723195.vala b/tests/methods/bug723195.vala new file mode 100644 index 000000000..1ea599046 --- /dev/null +++ b/tests/methods/bug723195.vala @@ -0,0 +1,25 @@ +private static int main (string[] args) { + string[] a = { "foo", "bar", null, "baz" }; + + a.length = 0; + assert (string.joinv (":", a) == ""); + + a.length = 1; + assert (string.joinv (":", a) == "foo"); + + a.length = 2; + assert (string.joinv (":", a) == "foo:bar"); + + a.length = 3; + assert (string.joinv (":", a) == "foo:bar:"); + + a.length = 4; + assert (string.joinv (":", a) == "foo:bar::baz"); + + a.length = -1; + assert (string.joinv (":", a) == "foo:bar"); + + assert (string.joinv (":", null) == ""); + + return 0; +} diff --git a/vapi/glib-2.0.vapi b/vapi/glib-2.0.vapi index 7f867b5bf..434078b92 100644 --- a/vapi/glib-2.0.vapi +++ b/vapi/glib-2.0.vapi @@ -964,19 +964,23 @@ public class string { if (separator == null) { separator = ""; } - if (str_array != null) { + if (str_array != null || str_array.length > 0 || (str_array.length == -1 && str_array[0] != null)) { int i; size_t len = 1; for (i = 0 ; (str_array.length != -1 && i < str_array.length) || (str_array.length == -1 && str_array[i] != null) ; i++) { - len += str_array[i].length; + len += (str_array[i] != null) ? str_array[i].length : 0; } + if (i == 0) { + return ""; + } + str_array.length = i; len += separator.length * (i - 1); string* res = GLib.malloc (len); void* ptr = string.copy_to_buffer ((void*) res, str_array[0]); - for (i = 1 ; str_array[i] != null ; i++) { + for (i = 1 ; i < str_array.length ; i++) { ptr = string.copy_to_buffer (ptr, separator); - ptr = string.copy_to_buffer (ptr, str_array[i]); + ptr = string.copy_to_buffer (ptr, str_array[i] ?? ""); } return (owned) res; |