From 2d1a75f550a14cb18cc85014430d33aa1c617a5b Mon Sep 17 00:00:00 2001 From: Nicolas Williams Date: Sat, 9 Aug 2014 13:10:41 -0500 Subject: [PATCH] `.foo[-1] = ...` trips assertion (fix #490) --- jv.c | 6 +++++- tests/all.test | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/jv.c b/jv.c index b93854b..bf7a0c5 100644 --- 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 diff --git a/tests/all.test b/tests/all.test index 7edd14d..99e95b7 100644 --- a/tests/all.test +++ b/tests/all.test @@ -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 # -- 2.40.0