mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 06:38:20 +00:00
... and porting over memory management for assignment to vector elements
This commit is contained in:
parent
1447736b35
commit
f92946509c
2 changed files with 25 additions and 4 deletions
25
src/Val.cc
25
src/Val.cc
|
@ -3199,6 +3199,7 @@ VectorVal::VectorVal(VectorTypePtr t) : Val(t)
|
|||
|
||||
auto y_tag = yield_type->Tag();
|
||||
any_yield = (y_tag == TYPE_VOID || y_tag == TYPE_ANY);
|
||||
managed_yield = IsManagedType(yield_type);
|
||||
}
|
||||
|
||||
VectorVal::~VectorVal()
|
||||
|
@ -3211,7 +3212,7 @@ VectorVal::~VectorVal()
|
|||
delete yield_types;
|
||||
}
|
||||
|
||||
else if ( IsManagedType(yield_type) )
|
||||
else if ( managed_yield )
|
||||
{
|
||||
for ( auto& elem : *vector_val )
|
||||
DeleteManagedType(elem);
|
||||
|
@ -3279,10 +3280,15 @@ bool VectorVal::Assign(unsigned int index, ValPtr element)
|
|||
{
|
||||
const auto& t = element->GetType();
|
||||
(*yield_types)[index] = t;
|
||||
DeleteIfManaged((*vector_val)[index], t);
|
||||
(*vector_val)[index] = ZVal(std::move(element), t);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( managed_yield )
|
||||
DeleteManagedType((*vector_val)[index]);
|
||||
(*vector_val)[index] = ZVal(std::move(element), yield_type);
|
||||
}
|
||||
|
||||
Modified();
|
||||
return true;
|
||||
|
@ -3308,11 +3314,18 @@ bool VectorVal::Insert(unsigned int index, ValPtr element)
|
|||
vector<ZVal>::iterator it;
|
||||
vector<TypePtr>::iterator types_it;
|
||||
|
||||
const auto& t = element->GetType();
|
||||
|
||||
if ( index < vector_val->size() )
|
||||
{
|
||||
it = std::next(vector_val->begin(), index);
|
||||
if ( yield_types )
|
||||
{
|
||||
DeleteIfManaged(*it, t);
|
||||
types_it = std::next(yield_types->begin(), index);
|
||||
}
|
||||
else if ( managed_yield )
|
||||
DeleteManagedType(*it);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -3323,8 +3336,7 @@ bool VectorVal::Insert(unsigned int index, ValPtr element)
|
|||
|
||||
if ( yield_types )
|
||||
{
|
||||
const auto& t = element->GetType();
|
||||
yield_types->insert(types_it, element->GetType());
|
||||
yield_types->insert(types_it, t);
|
||||
vector_val->insert(it, ZVal(std::move(element), t));
|
||||
}
|
||||
else
|
||||
|
@ -3340,14 +3352,19 @@ bool VectorVal::Remove(unsigned int index)
|
|||
return false;
|
||||
|
||||
auto it = std::next(vector_val->begin(), index);
|
||||
vector_val->erase(it);
|
||||
|
||||
if ( yield_types )
|
||||
{
|
||||
auto types_it = std::next(yield_types->begin(), index);
|
||||
DeleteIfManaged(*it, *types_it);
|
||||
yield_types->erase(types_it);
|
||||
}
|
||||
|
||||
else if ( managed_yield )
|
||||
DeleteManagedType(*it);
|
||||
|
||||
vector_val->erase(it);
|
||||
|
||||
Modified();
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -1582,6 +1582,10 @@ private:
|
|||
// the case for empty vectors created using "vector()").
|
||||
bool any_yield;
|
||||
|
||||
// True if this is a vector-of-managed-types, requiring explicit
|
||||
// memory management.
|
||||
bool managed_yield;
|
||||
|
||||
// For heterogeneous vectors, the individual type of each element,
|
||||
// parallel to vector_val. Heterogeneous vectors can arise for
|
||||
// "vector of any" when disparate elements are stored in the vector.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue