From 23f9fb0ae92b182e645ed52e729ff33575513cf4 Mon Sep 17 00:00:00 2001 From: Tim Wojtulewicz Date: Thu, 13 Jun 2019 15:37:31 -0700 Subject: [PATCH] Allow assignment for vectors using slices --- src/Expr.cc | 22 +++++++++++++++++++++- testing/btest/Baseline/language.vector/out | 2 ++ testing/btest/language/vector.zeek | 4 ++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/Expr.cc b/src/Expr.cc index 8d5bfcdc83..768d70ef0b 100644 --- a/src/Expr.cc +++ b/src/Expr.cc @@ -3199,7 +3199,26 @@ void IndexExpr::Assign(Frame* f, Val* v, Opcode op) switch ( v1->Type()->Tag() ) { case TYPE_VECTOR: - if ( ! v1->AsVectorVal()->Assign(v2, v, op) ) + { + const ListVal *lv = v2->AsListVal(); + + if ( lv->Length() > 1 ) + { + int len = v1->AsVectorVal()->Size(); + bro_int_t first = get_slice_index(lv->Index(0)->CoerceToInt(), len); + bro_int_t last = get_slice_index(lv->Index(1)->CoerceToInt(), len); + int slice_length = last - first; + + const VectorVal *v_vect = v->AsVectorVal(); + if ( slice_length != v_vect->Size()) + RuntimeError("vector being assigned to slice does not match size of slice"); + else if ( slice_length >= 0 ) + { + for ( int idx = first; idx < last; idx++ ) + v1->AsVectorVal()->Assign(idx, v_vect->Lookup(idx - first)->Ref(), op); + } + } + else if ( !v1->AsVectorVal()->Assign(v2, v, op)) { if ( v ) { @@ -3216,6 +3235,7 @@ void IndexExpr::Assign(Frame* f, Val* v, Opcode op) RuntimeErrorWithCallStack("assignment failed with null value"); } break; + } case TYPE_TABLE: if ( ! v1->AsTableVal()->Assign(v2, v, op) ) diff --git a/testing/btest/Baseline/language.vector/out b/testing/btest/Baseline/language.vector/out index 9e12403ef7..cfd9b75413 100644 --- a/testing/btest/Baseline/language.vector/out +++ b/testing/btest/Baseline/language.vector/out @@ -63,3 +63,5 @@ slicing (PASS) slicing (PASS) slicing (PASS) slicing (PASS) +slicing assignment (PASS) +slicing assignment (PASS) diff --git a/testing/btest/language/vector.zeek b/testing/btest/language/vector.zeek index 04218eb023..e8b3f68e76 100644 --- a/testing/btest/language/vector.zeek +++ b/testing/btest/language/vector.zeek @@ -175,4 +175,8 @@ event zeek_init() test_case( "slicing", all_set(v17[:2] == vector( 1, 2 )) ); test_case( "slicing", all_set(v17[2:] == vector( 3, 4, 5 )) ); test_case( "slicing", all_set(v17[:] == v17) ); + v17[0:1] = vector(6); + test_case( "slicing assignment", all_set(v17 == vector(6, 2, 3, 4, 5)) ); + v17[2:4] = vector(7, 8); + test_case( "slicing assignment", all_set(v17 == vector(6, 2, 7, 8, 5)) ); }