diff --git a/jv.c b/jv.c index b93854b3..bf7a0c51 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 7edd14d8..99e95b76 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 #