From 2ac6b339b2f080b8507abbb06ed1d948c9bc9dcc Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Thu, 14 May 2020 14:56:25 -0700 Subject: [PATCH] Fixed memory leaks --- BeefySysLib/util/Dictionary.h | 24 +++++++-------- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 5 +++- IDEHelper/Compiler/BfResolvedTypeUtils.cpp | 3 +- IDEHelper/Compiler/BfResolvedTypeUtils.h | 34 +++++++++++++++++++++- 4 files changed, 51 insertions(+), 15 deletions(-) diff --git a/BeefySysLib/util/Dictionary.h b/BeefySysLib/util/Dictionary.h index cfd63c79..fbb05dd4 100644 --- a/BeefySysLib/util/Dictionary.h +++ b/BeefySysLib/util/Dictionary.h @@ -398,6 +398,18 @@ public: } ~Dictionary() + { + DeleteData(); + } + + void AllocData(intptr size, Entry*& outEntries, int_cosize*& outBuckets) + { + uint8* data = new uint8[size * (sizeof(Entry) + sizeof(int_cosize))]; + outEntries = (Entry*)data; + outBuckets = (int_cosize*)(data + size * sizeof(Entry)); + } + + void DeleteData() { if (!std::is_pod::value) { @@ -417,18 +429,6 @@ public: } } - DeleteData(); - } - - void AllocData(intptr size, Entry*& outEntries, int_cosize*& outBuckets) - { - uint8* data = new uint8[size * (sizeof(Entry) + sizeof(int_cosize))]; - outEntries = (Entry*)data; - outBuckets = (int_cosize*)(data + size * sizeof(Entry)); - } - - void DeleteData() - { delete mEntries; } diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 113fe5d6..a715ac44 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -74,6 +74,8 @@ BfGenericExtensionEntry* BfModule::BuildGenericExtensionInfo(BfGenericTypeInstan { auto genericParamInstance = new BfGenericTypeParamInstance(partialTypeDef, paramIdx); genericParamInstance->mExternType = GetGenericParamType(BfGenericParamKind_Type, paramIdx); + + auto prevPtr = genericExEntry->mGenericParams.mVals; genericExEntry->mGenericParams.push_back(genericParamInstance); } @@ -961,7 +963,8 @@ bool BfModule::PopulateType(BfType* resolvedTypeRef, BfPopulateType populateType } resolvedTypeRef->mDefineState = BfTypeDefineState_DefinedAndMethodsSlotted; resolvedTypeRef->mRebuildFlags = BfTypeRebuildFlag_None; - typeAlias->mCustomAttributes = GetCustomAttributes(typeDef->mTypeDeclaration->mAttributes, BfAttributeTargets_Alias); + if ((typeInstance->mCustomAttributes == NULL) && (typeDef->mTypeDeclaration != NULL) && (typeDef->mTypeDeclaration->mAttributes != NULL)) + typeInstance->mCustomAttributes = GetCustomAttributes(typeDef->mTypeDeclaration->mAttributes, BfAttributeTargets_Alias); // Fall through so generic params are populated in DoPopulateType } diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp index 760bea81..c580e2ab 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp @@ -1587,7 +1587,8 @@ BfGenericTypeInstance::~BfGenericTypeInstance() { for (auto genericParamInstance : mGenericParams) genericParamInstance->Release(); - delete mGenericExtensionInfo; + if (mGenericExtensionInfo != NULL) + delete mGenericExtensionInfo; } BfGenericTypeInstance::GenericParamsVector* BfGenericTypeInstance::GetGenericParamsVector(BfTypeDef* declaringTypeDef) diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.h b/IDEHelper/Compiler/BfResolvedTypeUtils.h index 7e8fdf61..4525119a 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.h +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.h @@ -1749,6 +1749,38 @@ public: virtual void ReportMemory(MemReporter* memReporter) override; }; +template +class LogAlloc +{ +public: + T* allocate(intptr count) + { + auto ptr = (T*)malloc(sizeof(T) * count); + OutputDebugStrF("LogAlloc.allocate: %p\n", ptr); + return ptr; + } + + void deallocate(T* ptr) + { + OutputDebugStrF("LogAlloc.deallocate: %p\n", ptr); + free(ptr); + } + + void* rawAllocate(intptr size) + { + auto ptr = malloc(size); + OutputDebugStrF("LogAlloc.rawAllocate: %p\n", ptr); + return ptr; + } + + void rawDeallocate(void* ptr) + { + OutputDebugStrF("LogAlloc.rawFree: %p\n", ptr); + free(ptr); + } +}; + + class BfBoxedType : public BfTypeInstance { public: @@ -1801,7 +1833,7 @@ public: class BfGenericExtensionEntry { public: - Array mGenericParams; + Array mGenericParams; bool mConstraintsPassed; public: