]> granicus.if.org Git - jq/commitdiff
`.foo[-1] = ...` trips assertion (fix #490)
authorNicolas Williams <nico@cryptonector.com>
Sat, 9 Aug 2014 18:10:41 +0000 (13:10 -0500)
committerNicolas Williams <nico@cryptonector.com>
Sat, 9 Aug 2014 18:10:41 +0000 (13:10 -0500)
jv.c
tests/all.test

diff --git a/jv.c b/jv.c
index b93854b3e6345dabb5ce8c673569cbe90aaa9bc4..bf7a0c51479ad0522ac1ecf62b2f42bc43d57f67 100644 (file)
--- a/jv.c
+++ b/jv.c
@@ -230,9 +230,13 @@ static jv* jvp_array_read(jv a, int i) {
 }
 
 static jv* jvp_array_write(jv* a, int i) {
-  assert(i >= 0);
   jvp_array* array = jvp_array_ptr(*a);
 
+  if (i < 0)
+    i = array->length + i;
+  if (i < 0)
+    i = 0;
+
   int pos = i + jvp_array_offset(*a);
   if (pos < array->alloc_length && jvp_refcnt_unshared(a->u.ptr)) {
     // use existing array space
index 7edd14d80f830990b285eadbe144d9590c6657bb..99e95b76ba8e6a70364b7a4c1edf9e3f0284c16d 100644 (file)
@@ -152,6 +152,26 @@ null
 [1,null,true,false,"abcdef",{},{"a":1,"b":2},[],[1,2,3,4,5],[1,2]]
 [null,"bc",[],[2,3],[2]]
 
+#
+# Negative array indices
+#
+
+.foo[-1] = 0
+null
+{"foo":[0]}
+
+.foo[-2] = 0
+null
+{"foo":[0]}
+
+.[-1] = 5
+[0,1,2]
+[0,1,5]
+
+.[-2] = 5
+[0,1,2]
+[0,5,2]
+
 #
 # Multiple outputs, iteration
 #