... and porting over memory management for assignment to vector elements

This commit is contained in:
Vern Paxson 2021-02-27 06:37:50 -08:00
parent 1447736b35
commit f92946509c
2 changed files with 25 additions and 4 deletions

View file

@ -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;
} }

View file

@ -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.