diff --git a/src/Expr.cc b/src/Expr.cc index 10a149d0e4..fd53c31ede 100644 --- a/src/Expr.cc +++ b/src/Expr.cc @@ -4168,29 +4168,6 @@ void CallExpr::ExprDescribe(ODesc* d) const args->Describe(d); } -static std::unique_ptr shallow_copy_func_inits(const IntrusivePtr& body, - const id_list* src) - { - if ( ! body ) - return nullptr; - - if ( ! src ) - return nullptr; - - if ( src->empty() ) - return nullptr; - - auto dest = std::make_unique(src->length()); - - for ( ID* i : *src ) - { - Ref(i); - dest->push_back(i); - } - - return dest; - } - LambdaExpr::LambdaExpr(std::unique_ptr arg_ing, id_list arg_outer_ids) : Expr(EXPR_LAMBDA) { @@ -4204,7 +4181,7 @@ LambdaExpr::LambdaExpr(std::unique_ptr arg_ing, auto dummy_func = make_intrusive( ingredients->id.get(), ingredients->body, - shallow_copy_func_inits(ingredients->body, ingredients->inits).release(), + ingredients->inits, ingredients->frame_size, ingredients->priority); @@ -4255,7 +4232,7 @@ IntrusivePtr LambdaExpr::Eval(Frame* f) const auto lamb = make_intrusive( ingredients->id.get(), ingredients->body, - shallow_copy_func_inits(ingredients->body, ingredients->inits).release(), + ingredients->inits, ingredients->frame_size, ingredients->priority); diff --git a/src/Func.cc b/src/Func.cc index 2cbf77d82a..e9bcd07455 100644 --- a/src/Func.cc +++ b/src/Func.cc @@ -121,8 +121,9 @@ Func::Func(Kind arg_kind) : kind(arg_kind) Func::~Func() = default; -void Func::AddBody(IntrusivePtr /* new_body */, id_list* /* new_inits */, - size_t /* new_frame_size */, int /* priority */) +void Func::AddBody(IntrusivePtr /* new_body */, + const std::vector>& /* new_inits */, + size_t /* new_frame_size */, int /* priority */) { Internal("Func::AddBody called"); } @@ -267,7 +268,8 @@ void Func::CheckPluginResult(bool handled, const IntrusivePtr& hook_result, } } -BroFunc::BroFunc(ID* arg_id, IntrusivePtr arg_body, id_list* aggr_inits, +BroFunc::BroFunc(ID* arg_id, IntrusivePtr arg_body, + const std::vector>& aggr_inits, size_t arg_frame_size, int priority) : Func(BRO_FUNC) { @@ -447,7 +449,8 @@ IntrusivePtr BroFunc::operator()(zeek::Args* args, Frame* parent) const return result; } -void BroFunc::AddBody(IntrusivePtr new_body, id_list* new_inits, +void BroFunc::AddBody(IntrusivePtr new_body, + const std::vector>& new_inits, size_t new_frame_size, int priority) { if ( new_frame_size > frame_size ) @@ -571,9 +574,10 @@ void BroFunc::Describe(ODesc* d) const } } -IntrusivePtr BroFunc::AddInits(IntrusivePtr body, id_list* inits) +IntrusivePtr BroFunc::AddInits(IntrusivePtr body, + const std::vector>& inits) { - if ( ! inits || inits->length() == 0 ) + if ( inits.empty() ) return body; auto stmt_series = make_intrusive(); @@ -889,14 +893,6 @@ function_ingredients::function_ingredients(IntrusivePtr scope, IntrusiveP this->body = std::move(body); } -function_ingredients::~function_ingredients() - { - for ( const auto& i : *inits ) - Unref(i); - - delete inits; - } - BifReturnVal::BifReturnVal(std::nullptr_t) noexcept { } diff --git a/src/Func.h b/src/Func.h index ef2cf34fab..56c4adf75b 100644 --- a/src/Func.h +++ b/src/Func.h @@ -78,7 +78,8 @@ public: } // Add a new event handler to an existing function (event). - virtual void AddBody(IntrusivePtr new_body, id_list* new_inits, + virtual void AddBody(IntrusivePtr new_body, + const std::vector>& new_inits, size_t new_frame_size, int priority = 0); virtual void SetScope(IntrusivePtr newscope); @@ -128,7 +129,10 @@ protected: class BroFunc final : public Func { public: - BroFunc(ID* id, IntrusivePtr body, id_list* inits, size_t frame_size, int priority); + BroFunc(ID* id, IntrusivePtr body, + const std::vector>& inits, + size_t frame_size, int priority); + ~BroFunc() override; bool IsPure() const override; @@ -163,8 +167,9 @@ public: */ broker::expected SerializeClosure() const; - void AddBody(IntrusivePtr new_body, id_list* new_inits, - size_t new_frame_size, int priority) override; + void AddBody(IntrusivePtr new_body, + const std::vector>& new_inits, + size_t new_frame_size, int priority) override; /** Sets this function's outer_id list. */ void SetOuterIDs(id_list ids) @@ -174,7 +179,8 @@ public: protected: BroFunc() : Func(BRO_FUNC) {} - IntrusivePtr AddInits(IntrusivePtr body, id_list* inits); + IntrusivePtr AddInits(IntrusivePtr body, + const std::vector>& inits); /** * Clones this function along with its closures. @@ -263,11 +269,9 @@ struct function_ingredients { // to build a function. function_ingredients(IntrusivePtr scope, IntrusivePtr body); - ~function_ingredients(); - IntrusivePtr id; IntrusivePtr body; - id_list* inits; + std::vector> inits; int frame_size; int priority; IntrusivePtr scope; diff --git a/src/Scope.cc b/src/Scope.cc index 19e3d581c5..657a27170e 100644 --- a/src/Scope.cc +++ b/src/Scope.cc @@ -21,8 +21,6 @@ Scope::Scope(IntrusivePtr id, { return_type = nullptr; - inits = new id_list; - if ( id ) { const auto& id_type = scope_id->GetType(); @@ -37,17 +35,6 @@ Scope::Scope(IntrusivePtr id, } } -Scope::~Scope() - { - if ( inits ) - { - for ( const auto& i : *inits ) - Unref(i); - - delete inits; - } - } - const IntrusivePtr& Scope::Find(std::string_view name) const { auto entry = local.find(name); @@ -77,11 +64,11 @@ IntrusivePtr Scope::GenerateTemporary(const char* name) return make_intrusive(name, SCOPE_FUNCTION, false); } -id_list* Scope::GetInits() +std::vector> Scope::GetInits() { - id_list* ids = inits; - inits = nullptr; - return ids; + auto rval = std::move(inits); + inits = {}; + return rval; } void Scope::Describe(ODesc* d) const diff --git a/src/Scope.h b/src/Scope.h index 931e3d742c..146c5c051e 100644 --- a/src/Scope.h +++ b/src/Scope.h @@ -21,7 +21,6 @@ class Scope : public BroObj { public: explicit Scope(IntrusivePtr id, std::unique_ptr>> al); - ~Scope() override; const IntrusivePtr& Find(std::string_view name) const; @@ -57,10 +56,11 @@ public: // Returns the list of variables needing initialization, and // removes it from this Scope. - id_list* GetInits(); + std::vector> GetInits(); // Adds a variable to the list. - void AddInit(IntrusivePtr id) { inits->push_back(id.release()); } + void AddInit(IntrusivePtr id) + { inits.emplace_back(std::move(id)); } void Describe(ODesc* d) const override; @@ -71,7 +71,7 @@ protected: std::unique_ptr>> attrs; IntrusivePtr return_type; std::map, std::less<>> local; - id_list* inits; + std::vector> inits; }; diff --git a/src/Stmt.cc b/src/Stmt.cc index 485ed13c81..85ba3d4ec3 100644 --- a/src/Stmt.cc +++ b/src/Stmt.cc @@ -1629,19 +1629,12 @@ void EventBodyList::Describe(ODesc* d) const StmtList::Describe(d); } -InitStmt::InitStmt(id_list* arg_inits) : Stmt(STMT_INIT) +InitStmt::InitStmt(std::vector> arg_inits) : Stmt(STMT_INIT) { - inits = arg_inits; - if ( arg_inits && arg_inits->length() ) - SetLocationInfo((*arg_inits)[0]->GetLocationInfo()); - } + inits = std::move(arg_inits); -InitStmt::~InitStmt() - { - for ( const auto& init : *inits ) - Unref(init); - - delete inits; + if ( ! inits.empty() ) + SetLocationInfo(inits[0]->GetLocationInfo()); } IntrusivePtr InitStmt::Exec(Frame* f, stmt_flow_type& flow) const @@ -1649,7 +1642,7 @@ IntrusivePtr InitStmt::Exec(Frame* f, stmt_flow_type& flow) const RegisterAccess(); flow = FLOW_NEXT; - for ( const auto& aggr : *inits ) + for ( const auto& aggr : inits ) { const auto& t = aggr->GetType(); @@ -1670,7 +1663,7 @@ IntrusivePtr InitStmt::Exec(Frame* f, stmt_flow_type& flow) const break; } - f->SetElement(aggr, std::move(v)); + f->SetElement(aggr.get(), std::move(v)); } return nullptr; @@ -1681,14 +1674,14 @@ void InitStmt::Describe(ODesc* d) const AddTag(d); if ( ! d->IsReadable() ) - d->AddCount(inits->length()); + d->AddCount(inits.size()); - loop_over_list(*inits, i) + for ( size_t i = 0; i < inits.size(); ++i ) { if ( ! d->IsBinary() && i > 0 ) d->AddSP(","); - (*inits)[i]->Describe(d); + inits[i]->Describe(d); } DescribeDone(d); @@ -1699,7 +1692,7 @@ TraversalCode InitStmt::Traverse(TraversalCallback* cb) const TraversalCode tc = cb->PreStmt(this); HANDLE_TC_STMT_PRE(tc); - for ( const auto& init : *inits ) + for ( const auto& init : inits ) { tc = init->Traverse(cb); HANDLE_TC_STMT_PRE(tc); diff --git a/src/Stmt.h b/src/Stmt.h index 0fb57c7b23..0cc4e8ae43 100644 --- a/src/Stmt.h +++ b/src/Stmt.h @@ -393,20 +393,19 @@ protected: class InitStmt final : public Stmt { public: - explicit InitStmt(id_list* arg_inits); - - ~InitStmt() override; + explicit InitStmt(std::vector> arg_inits); IntrusivePtr Exec(Frame* f, stmt_flow_type& flow) const override; - const id_list* Inits() const { return inits; } + const std::vector>& Inits() const + { return inits; } void Describe(ODesc* d) const override; TraversalCode Traverse(TraversalCallback* cb) const override; protected: - id_list* inits; + std::vector> inits; }; class NullStmt final : public Stmt { diff --git a/src/Var.cc b/src/Var.cc index a086f045d2..b46956090f 100644 --- a/src/Var.cc +++ b/src/Var.cc @@ -301,7 +301,8 @@ static void make_var(ID* id, IntrusivePtr t, init_class c, // For events, add a function value (without any body) here so that // we can later access the ID even if no implementations have been // defined. - auto f = make_intrusive(id, nullptr, nullptr, 0, 0); + std::vector> inits; + auto f = make_intrusive(id, nullptr, inits, 0, 0); id->SetVal(make_intrusive(std::move(f))); } }