From 8d4748c8df283d06e58ac6202505057e99a4a83a Mon Sep 17 00:00:00 2001 From: Stephen Dolan Date: Thu, 7 Nov 2013 12:18:48 +0000 Subject: [PATCH] Fix a crash on group_by of empty list. Fixes #208. --- jv_aux.c | 28 +++++++++++++++------------- tests/all.test | 4 ++++ 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/jv_aux.c b/jv_aux.c index b73c9057..89f36e69 100644 --- a/jv_aux.c +++ b/jv_aux.c @@ -545,21 +545,23 @@ jv jv_group(jv objects, jv keys) { int n = jv_array_length(jv_copy(objects)); struct sort_entry* entries = sort_items(objects, keys); jv ret = jv_array(); - jv curr_key = entries[0].key; - jv group = jv_array_append(jv_array(), entries[0].object); - for (int i = 1; i < n; i++) { - if (jv_equal(jv_copy(curr_key), jv_copy(entries[i].key))) { - jv_free(entries[i].key); - } else { - jv_free(curr_key); - curr_key = entries[i].key; - ret = jv_array_append(ret, group); - group = jv_array(); + if (n > 0) { + jv curr_key = entries[0].key; + jv group = jv_array_append(jv_array(), entries[0].object); + for (int i = 1; i < n; i++) { + if (jv_equal(jv_copy(curr_key), jv_copy(entries[i].key))) { + jv_free(entries[i].key); + } else { + jv_free(curr_key); + curr_key = entries[i].key; + ret = jv_array_append(ret, group); + group = jv_array(); + } + group = jv_array_append(group, entries[i].object); } - group = jv_array_append(group, entries[i].object); + jv_free(curr_key); + ret = jv_array_append(ret, group); } - jv_free(curr_key); - ret = jv_array_append(ret, group); jv_mem_free(entries); return ret; } diff --git a/tests/all.test b/tests/all.test index c16b7eba..aa02e90c 100644 --- a/tests/all.test +++ b/tests/all.test @@ -610,6 +610,10 @@ unique [1,2,5,3,5,3,1,3] [1,2,3,5] +unique +[] +[] + [min, max, min_by(.[1]), max_by(.[1]), min_by(.[2]), max_by(.[2])] [[4,2,"a"],[3,1,"a"],[2,4,"a"],[1,3,"a"]] [[1,3,"a"],[4,2,"a"],[3,1,"a"],[2,4,"a"],[4,2,"a"],[1,3,"a"]]