GH-3060: Support negative index lookups for vectors

This commit is contained in:
Tim Wojtulewicz 2023-05-23 13:48:58 -07:00
parent cdb9c74054
commit 351e68b66a
3 changed files with 15 additions and 1 deletions

View file

@ -2932,7 +2932,13 @@ ValPtr IndexExpr::Fold(Val* v1, Val* v2) const
const ListVal* lv = v2->AsListVal();
if ( lv->Length() == 1 )
v = vect->ValAt(lv->Idx(0)->CoerceToUnsigned());
{
auto index = lv->Idx(0)->CoerceToInt();
if ( index < 0 )
index = vect->Size() + index;
v = vect->ValAt(index);
}
else
return index_slice(vect, lv);
}

View file

@ -80,3 +80,5 @@ hole in vector of managed types, 5, [[a=T], [a=T], , , [a=T]]
hole in vector of managed types after replacing slice, 3, [[a=T], [a=T], ]
left shift (PASS)
right shift (PASS)
negative index (PASS)
negative index (PASS)

View file

@ -223,4 +223,10 @@ event zeek_init()
local v23 = v6 >> four_ones;
test_case( "left shift", all_set(v22 == vector(20, 40, 60, 80)) );
test_case( "right shift", all_set(v23 == vector(5, 10, 15, 20)) );
# negative indices
local v24 = vector( 1, 2, 3, 4, 5 );
test_case( "negative index", v24[-1] == 5 );
test_case( "negative index", v24[-3] == 3 );
}