diff options
author | erorcun <erorcunerorcun@hotmail.com.tr> | 2021-03-06 17:28:59 +0100 |
---|---|---|
committer | erorcun <erorcunerorcun@hotmail.com.tr> | 2021-03-06 17:28:59 +0100 |
commit | 62b8f0f553917bf2db467941b5a055e08872913f (patch) | |
tree | 9e012cf5c6b1e530bee4c02e2540c52e471cdf12 /src/objects/Object.cpp | |
parent | Fix FPEs (diff) | |
download | re3-62b8f0f553917bf2db467941b5a055e08872913f.tar re3-62b8f0f553917bf2db467941b5a055e08872913f.tar.gz re3-62b8f0f553917bf2db467941b5a055e08872913f.tar.bz2 re3-62b8f0f553917bf2db467941b5a055e08872913f.tar.lz re3-62b8f0f553917bf2db467941b5a055e08872913f.tar.xz re3-62b8f0f553917bf2db467941b5a055e08872913f.tar.zst re3-62b8f0f553917bf2db467941b5a055e08872913f.zip |
Diffstat (limited to 'src/objects/Object.cpp')
-rw-r--r-- | src/objects/Object.cpp | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/src/objects/Object.cpp b/src/objects/Object.cpp index 0605f54f..807ff301 100644 --- a/src/objects/Object.cpp +++ b/src/objects/Object.cpp @@ -25,10 +25,32 @@ int16 CObject::nNoTempObjects; //int16 CObject::nBodyCastHealth = 1000; float CObject::fDistToNearestTree; -void *CObject::operator new(size_t sz) { return CPools::GetObjectPool()->New(); } -void *CObject::operator new(size_t sz, int handle) { return CPools::GetObjectPool()->New(handle);}; -void CObject::operator delete(void *p, size_t sz) { CPools::GetObjectPool()->Delete((CObject*)p); } -void CObject::operator delete(void *p, int handle) { CPools::GetObjectPool()->Delete((CObject*)p); } +// Object pools tends to be full sometimes, let's free a temp. object in this case. +#ifdef FIX_BUGS +void *CObject::operator new(size_t sz) throw() { + CObject *obj = CPools::GetObjectPool()->New(); + if (!obj) { + CObjectPool *objectPool = CPools::GetObjectPool(); + for (int32 i = 0; i < objectPool->GetSize(); i++) { + CObject *existing = objectPool->GetSlot(i); + if (existing && existing->ObjectCreatedBy == TEMP_OBJECT) { + int32 handle = objectPool->GetIndex(existing); + CWorld::Remove(existing); + delete existing; + obj = objectPool->New(handle); + break; + } + } + } + return obj; +} +#else +void *CObject::operator new(size_t sz) throw() { return CPools::GetObjectPool()->New(); } +#endif +void *CObject::operator new(size_t sz, int handle) throw() { return CPools::GetObjectPool()->New(handle); }; + +void CObject::operator delete(void *p, size_t sz) throw() { CPools::GetObjectPool()->Delete((CObject*)p); } +void CObject::operator delete(void *p, int handle) throw() { CPools::GetObjectPool()->Delete((CObject*)p); } CObject::CObject(void) { |