Don't waste time looking for variables to (de)init in native classes

This commit is contained in:
Randy Heit 2016-04-04 14:57:43 -05:00
parent c346ac6143
commit 6f60253590
1 changed files with 17 additions and 5 deletions

View File

@ -3396,16 +3396,20 @@ DObject *PClass::CreateNew() const
// //
// PClass :: InitializeSpecials // PClass :: InitializeSpecials
// //
// Initialize special fields of a newly-created instance (e.g. strings). // Initialize special fields (e.g. strings) of a newly-created instance.
// //
//========================================================================== //==========================================================================
void PClass::InitializeSpecials(void *addr) const void PClass::InitializeSpecials(void *addr) const
{ {
if (ParentClass != NULL) // Once we reach a native class, we can stop going up the family tree,
// since native classes handle initialization natively.
if (!bRuntimeClass)
{ {
ParentClass->InitializeSpecials(addr); return;
} }
assert(ParentClass != NULL);
ParentClass->InitializeSpecials(addr);
for (auto tao : SpecialInits) for (auto tao : SpecialInits)
{ {
tao.first->InitializeValue((BYTE*)addr + tao.second, Defaults + tao.second); tao.first->InitializeValue((BYTE*)addr + tao.second, Defaults + tao.second);
@ -3416,19 +3420,27 @@ void PClass::InitializeSpecials(void *addr) const
// //
// PClass :: DestroySpecials // PClass :: DestroySpecials
// //
// Destroy special fields (e.g. strings) of an instance that is about to be
// deleted.
//
//========================================================================== //==========================================================================
void PClass::DestroySpecials(void *addr) const void PClass::DestroySpecials(void *addr) const
{ {
if (ParentClass != NULL) // Once we reach a native class, we can stop going up the family tree,
// since native classes handle deinitialization natively.
if (!bRuntimeClass)
{ {
ParentClass->DestroySpecials(addr); return;
} }
assert(ParentClass != NULL);
ParentClass->DestroySpecials(addr);
for (auto tao : SpecialInits) for (auto tao : SpecialInits)
{ {
tao.first->DestroyValue((BYTE *)addr + tao.second); tao.first->DestroyValue((BYTE *)addr + tao.second);
} }
} }
//========================================================================== //==========================================================================
// //
// PClass :: Derive // PClass :: Derive