diff --git a/src/Frame.cc b/src/Frame.cc index cecea12385..70eb1118d3 100644 --- a/src/Frame.cc +++ b/src/Frame.cc @@ -17,7 +17,7 @@ std::vector g_frame_stack; Frame::Frame(int arg_size, const BroFunc* func, const zeek::Args* fn_args) { size = arg_size; - frame = new Val*[size]; + frame = std::make_unique[]>(size); function = func; func_args = fn_args; @@ -29,9 +29,6 @@ Frame::Frame(int arg_size, const BroFunc* func, const zeek::Args* fn_args) delayed = false; closure = nullptr; - - for (int i = 0; i < size; ++i) - frame[i] = nullptr; } Frame::~Frame() @@ -51,7 +48,8 @@ Frame::~Frame() for ( auto& i : outer_ids ) Unref(i); - Release(); + for ( int i = 0; i < size; ++i ) + UnrefElement(i); delete [] weak_refs; } @@ -69,7 +67,7 @@ void Frame::AddFunctionWithClosureRef(BroFunc* func) void Frame::SetElement(int n, Val* v, bool weak_ref) { UnrefElement(n); - frame[n] = v; + frame[n] = {AdoptRef{}, v}; if ( weak_ref ) { @@ -132,10 +130,10 @@ Val* Frame::GetElement(const ID* id) const { auto where = offset_map->find(std::string(id->Name())); if ( where != offset_map->end() ) - return frame[where->second]; + return frame[where->second].get(); } - return frame[id->Offset()]; + return frame[id->Offset()].get(); } void Frame::Reset(int startIdx) @@ -147,14 +145,6 @@ void Frame::Reset(int startIdx) } } -void Frame::Release() - { - for ( int i = 0; i < size; ++i ) - UnrefElement(i); - - delete [] frame; - } - void Frame::Describe(ODesc* d) const { if ( ! d->IsBinary() ) @@ -190,13 +180,14 @@ Frame* Frame::Clone() const other->call = call; other->trigger = trigger; - for (int i = 0; i < size; i++) - other->frame[i] = frame[i] ? frame[i]->Clone().release() : nullptr; + for ( int i = 0; i < size; i++ ) + if ( frame[i] ) + other->frame[i] = frame[i]->Clone(); return other; } -static bool val_is_func(Val* v, BroFunc* func) +static bool val_is_func(const IntrusivePtr& v, BroFunc* func) { if ( v->GetType()->Tag() != TYPE_FUNC ) return false; @@ -204,17 +195,18 @@ static bool val_is_func(Val* v, BroFunc* func) return v->AsFunc() == func; } -static void clone_if_not_func(Val** frame, int offset, BroFunc* func, +static void clone_if_not_func(const std::unique_ptr[]>& frame, + int offset, BroFunc* func, Frame* other) { - auto v = frame[offset]; + const auto& v = frame[offset]; if ( ! v ) return; if ( val_is_func(v, func) ) { - other->SetElement(offset, v, true); + other->SetElement(offset, v.get(), true); return; } @@ -355,11 +347,11 @@ broker::expected Frame::Serialize(const Frame* target, const id_li if (where != new_map.end()) location = where->second; - Val* val = target->frame[location]; + const auto& val = target->frame[location]; TypeTag tag = val->GetType()->Tag(); - auto expected = bro_broker::val_to_data(val); + auto expected = bro_broker::val_to_data(val.get()); if ( ! expected ) return broker::ec::invalid_data; @@ -490,7 +482,7 @@ std::pair> Frame::Unserialize(const broker::vector& da if ( ! val ) return std::make_pair(false, nullptr); - rf->frame[i] = val.release(); + rf->frame[i] = std::move(val); } return std::make_pair(true, std::move(rf)); @@ -542,9 +534,9 @@ void Frame::ClearTrigger() void Frame::UnrefElement(int n) { if ( weak_refs && weak_refs[n] ) - return; - - Unref(frame[n]); + frame[n].release(); + else + frame[n] = nullptr; } bool Frame::IsOuterID(const ID* in) const diff --git a/src/Frame.h b/src/Frame.h index 8716022d6e..3880159aec 100644 --- a/src/Frame.h +++ b/src/Frame.h @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -41,7 +42,7 @@ public: * @param n the index to get. * @return the value at index *n* of the underlying array. */ - Val* NthElement(int n) const { return frame[n]; } + Val* NthElement(int n) const { return frame[n].get(); } /** * Sets the element at index *n* of the underlying array @@ -81,12 +82,6 @@ public: */ void Reset(int startIdx); - /** - * Resets all of the values in the frame and clears out the - * underlying array. - */ - void Release(); - /** * Describes the frame and all of its values. */ @@ -269,7 +264,7 @@ private: bool delayed; /** Associates ID's offsets with values. */ - Val** frame; + std::unique_ptr[]> frame; /** Values that are weakly referenced by the frame. Used to * prevent circular reference memory leaks in lambda/closures */