]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
glib-2.0: fix string.joinv for empty (but not null) arrays
authorEvan Nemerson <evan@coeus-group.com>
Wed, 29 Jan 2014 00:06:50 +0000 (16:06 -0800)
committerEvan Nemerson <evan@coeus-group.com>
Wed, 29 Jan 2014 00:10:06 +0000 (16:10 -0800)
Fixes bug 723195.

tests/Makefile.am
tests/methods/bug723195.vala [new file with mode: 0644]
vapi/glib-2.0.vapi

index 9c47ec5f28b90d274f63ed1c4ebcbfeb9480c062..77b2fa032243d4ef2ff218f8446b18e96fff2ec5 100644 (file)
@@ -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 (file)
index 0000000..1ea5990
--- /dev/null
@@ -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;
+}
index 7f867b5bf20dca75be3599ec83137b3075fc9a2b..434078b9229e35699d88b5e4b7c59d96f8d905df 100644 (file)
@@ -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;