diff --git a/NEWS b/NEWS index c7c9c6bc3e..5f4f479c6f 100644 --- a/NEWS +++ b/NEWS @@ -211,8 +211,8 @@ Deprecated Functionality - ``TableVal::Lookup()`` is deprecated, use ``TableVal::Find()`` or ``TableVal::FindOrDefault()``. -- ``VectorVal::Assign`` methods taking raw ``Val*`` are deprecated, use the - methods that take ``IntrusivePtr``. +- ``VectorVal::Assign`` and ``Insert`` methods taking raw ``Val*`` are + deprecated, use the methods that take ``IntrusivePtr``. Zeek 3.1.0 ========== diff --git a/src/Expr.cc b/src/Expr.cc index 33c26f3e35..04dfdbecd2 100644 --- a/src/Expr.cc +++ b/src/Expr.cc @@ -2756,7 +2756,7 @@ void IndexExpr::Assign(Frame* f, IntrusivePtr v) VectorVal* v_vect = v->AsVectorVal(); for ( auto idx = 0u; idx < v_vect->Size(); idx++, first++ ) - v1_vect->Insert(first, v_vect->Lookup(idx)->Ref()); + v1_vect->Insert(first, {NewRef{}, v_vect->Lookup(idx)}); } else if ( ! v1_vect->Assign(lv->Idx(0)->CoerceToUnsigned(), std::move(v)) ) { diff --git a/src/Val.cc b/src/Val.cc index bf2966dca1..d1c914e951 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -3092,12 +3092,11 @@ bool VectorVal::AssignRepeat(unsigned int index, unsigned int how_many, return true; } -bool VectorVal::Insert(unsigned int index, Val* element) +bool VectorVal::Insert(unsigned int index, IntrusivePtr element) { if ( element && ! same_type(element->GetType().get(), GetType()->AsVectorType()->Yield().get(), false) ) { - Unref(element); return false; } @@ -3111,7 +3110,7 @@ bool VectorVal::Insert(unsigned int index, Val* element) // Note: we do *not* Ref() the element, if any, at this point. // AssignExpr::Eval() already does this; other callers must remember // to do it similarly. - val.vector_val->insert(it, element); + val.vector_val->insert(it, element.release()); Modified(); return true; diff --git a/src/Val.h b/src/Val.h index bf3541c02d..1a0a7de7e6 100644 --- a/src/Val.h +++ b/src/Val.h @@ -1309,8 +1309,19 @@ public: notifier::Modifiable* Modifiable() override { return this; } - // Insert an element at a specific position into the underlying vector. - bool Insert(unsigned int index, Val* element); + /** + * Inserts an element at the given position in the vector. All elements + * at that original position and higher are shifted up by one. + * @param index The index to insert the element at. + * @param element The value to insert into the vector. + * @return True if the element was inserted or false if the element was + * the wrong type. + */ + bool Insert(unsigned int index, IntrusivePtr element); + + [[deprecated("Remove in v4.1. Insert an IntrusivePtr instead.")]] + bool Insert(unsigned int index, Val* element) + { return Insert(index, {AdoptRef{}, element}); } // Removes an element at a specific position. bool Remove(unsigned int index);