mirror of
https://github.com/zeek/zeek.git
synced 2025-10-04 07:38:19 +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();
|
auto y_tag = yield_type->Tag();
|
||||||
any_yield = (y_tag == TYPE_VOID || y_tag == TYPE_ANY);
|
any_yield = (y_tag == TYPE_VOID || y_tag == TYPE_ANY);
|
||||||
|
managed_yield = IsManagedType(yield_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
VectorVal::~VectorVal()
|
VectorVal::~VectorVal()
|
||||||
|
@ -3211,7 +3212,7 @@ VectorVal::~VectorVal()
|
||||||
delete yield_types;
|
delete yield_types;
|
||||||
}
|
}
|
||||||
|
|
||||||
else if ( IsManagedType(yield_type) )
|
else if ( managed_yield )
|
||||||
{
|
{
|
||||||
for ( auto& elem : *vector_val )
|
for ( auto& elem : *vector_val )
|
||||||
DeleteManagedType(elem);
|
DeleteManagedType(elem);
|
||||||
|
@ -3279,10 +3280,15 @@ bool VectorVal::Assign(unsigned int index, ValPtr element)
|
||||||
{
|
{
|
||||||
const auto& t = element->GetType();
|
const auto& t = element->GetType();
|
||||||
(*yield_types)[index] = t;
|
(*yield_types)[index] = t;
|
||||||
|
DeleteIfManaged((*vector_val)[index], t);
|
||||||
(*vector_val)[index] = ZVal(std::move(element), t);
|
(*vector_val)[index] = ZVal(std::move(element), t);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
if ( managed_yield )
|
||||||
|
DeleteManagedType((*vector_val)[index]);
|
||||||
(*vector_val)[index] = ZVal(std::move(element), yield_type);
|
(*vector_val)[index] = ZVal(std::move(element), yield_type);
|
||||||
|
}
|
||||||
|
|
||||||
Modified();
|
Modified();
|
||||||
return true;
|
return true;
|
||||||
|
@ -3308,12 +3314,19 @@ bool VectorVal::Insert(unsigned int index, ValPtr element)
|
||||||
vector<ZVal>::iterator it;
|
vector<ZVal>::iterator it;
|
||||||
vector<TypePtr>::iterator types_it;
|
vector<TypePtr>::iterator types_it;
|
||||||
|
|
||||||
|
const auto& t = element->GetType();
|
||||||
|
|
||||||
if ( index < vector_val->size() )
|
if ( index < vector_val->size() )
|
||||||
{
|
{
|
||||||
it = std::next(vector_val->begin(), index);
|
it = std::next(vector_val->begin(), index);
|
||||||
if ( yield_types )
|
if ( yield_types )
|
||||||
|
{
|
||||||
|
DeleteIfManaged(*it, t);
|
||||||
types_it = std::next(yield_types->begin(), index);
|
types_it = std::next(yield_types->begin(), index);
|
||||||
}
|
}
|
||||||
|
else if ( managed_yield )
|
||||||
|
DeleteManagedType(*it);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
it = vector_val->end();
|
it = vector_val->end();
|
||||||
|
@ -3323,8 +3336,7 @@ bool VectorVal::Insert(unsigned int index, ValPtr element)
|
||||||
|
|
||||||
if ( yield_types )
|
if ( yield_types )
|
||||||
{
|
{
|
||||||
const auto& t = element->GetType();
|
yield_types->insert(types_it, t);
|
||||||
yield_types->insert(types_it, element->GetType());
|
|
||||||
vector_val->insert(it, ZVal(std::move(element), t));
|
vector_val->insert(it, ZVal(std::move(element), t));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -3340,14 +3352,19 @@ bool VectorVal::Remove(unsigned int index)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
auto it = std::next(vector_val->begin(), index);
|
auto it = std::next(vector_val->begin(), index);
|
||||||
vector_val->erase(it);
|
|
||||||
|
|
||||||
if ( yield_types )
|
if ( yield_types )
|
||||||
{
|
{
|
||||||
auto types_it = std::next(yield_types->begin(), index);
|
auto types_it = std::next(yield_types->begin(), index);
|
||||||
|
DeleteIfManaged(*it, *types_it);
|
||||||
yield_types->erase(types_it);
|
yield_types->erase(types_it);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if ( managed_yield )
|
||||||
|
DeleteManagedType(*it);
|
||||||
|
|
||||||
|
vector_val->erase(it);
|
||||||
|
|
||||||
Modified();
|
Modified();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1582,6 +1582,10 @@ private:
|
||||||
// the case for empty vectors created using "vector()").
|
// the case for empty vectors created using "vector()").
|
||||||
bool any_yield;
|
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,
|
// For heterogeneous vectors, the individual type of each element,
|
||||||
// parallel to vector_val. Heterogeneous vectors can arise for
|
// parallel to vector_val. Heterogeneous vectors can arise for
|
||||||
// "vector of any" when disparate elements are stored in the vector.
|
// "vector of any" when disparate elements are stored in the vector.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue