From 676e7988fb5176ca4ed45dc13ba80f08e3d8ceca Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Fri, 18 Mar 2022 18:06:14 -0700 Subject: [PATCH] Fixes from valgrind --- BeefLibs/corlib/BeefProj.toml | 3 + BeefLibs/corlib/src/IO/StringStream.bf | 2 +- BeefLibs/corlib/src/String.bf | 60 ++++++++++++--- BeefLibs/corlib/src/Threading/Thread.bf | 18 +++-- BeefRT/dbg/DbgInternal.cpp | 8 +- BeefRT/rt/Thread.cpp | 87 ++++++++-------------- BeefRT/rt/Thread.h | 6 ++ BeefySysLib/platform/posix/PosixCommon.cpp | 15 +++- BeefySysLib/util/BeefPerf.cpp | 2 +- BeefySysLib/util/BitSet.h | 2 +- BeefySysLib/util/Dictionary.h | 2 +- IDE/src/BeefConfig.bf | 6 +- IDE/src/IDEApp.bf | 2 + IDEHelper/Backend/BeIRCodeGen.cpp | 34 +++++---- IDEHelper/Beef/BfCommon.h | 3 +- IDEHelper/Compiler/BfAst.h | 7 ++ IDEHelper/Compiler/BfCompiler.cpp | 6 +- IDEHelper/Compiler/BfContext.cpp | 3 +- IDEHelper/Compiler/BfContext.h | 2 - IDEHelper/Compiler/BfIRCodeGen.cpp | 4 +- IDEHelper/Compiler/BfIRCodeGen.h | 1 + IDEHelper/Compiler/BfModule.cpp | 25 ++++--- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 8 +- IDEHelper/Compiler/BfParser.cpp | 2 +- IDEHelper/Compiler/BfResolvedTypeUtils.cpp | 33 ++++++-- IDEHelper/Compiler/BfResolvedTypeUtils.h | 4 +- IDEHelper/Compiler/BfSource.cpp | 9 +-- IDEHelper/Compiler/BfSource.h | 2 +- IDEHelper/Compiler/BfSystem.cpp | 2 +- IDEHelper/Compiler/BfUtil.h | 26 +++++-- IDEHelper/Compiler/CeMachine.cpp | 6 +- 31 files changed, 243 insertions(+), 147 deletions(-) diff --git a/BeefLibs/corlib/BeefProj.toml b/BeefLibs/corlib/BeefProj.toml index 3fc278f7..7527207d 100644 --- a/BeefLibs/corlib/BeefProj.toml +++ b/BeefLibs/corlib/BeefProj.toml @@ -38,3 +38,6 @@ BfOptimizationLevel = "O2" RuntimeChecks = false EmitDynamicCastCheck = false EmitObjectAccessCheck = false + +[Configs.Debug.Linux64] +PreprocessorMacros = ["DEBUG", "VALGRIND"] diff --git a/BeefLibs/corlib/src/IO/StringStream.bf b/BeefLibs/corlib/src/IO/StringStream.bf index 86990fed..448e7d4f 100644 --- a/BeefLibs/corlib/src/IO/StringStream.bf +++ b/BeefLibs/corlib/src/IO/StringStream.bf @@ -54,7 +54,7 @@ namespace System.IO case .Copy: mString.Set(str); case .Reference: - mString = new String(); + mStringKind = .Reference; mString.Reference(str.Ptr, str.Length); } } diff --git a/BeefLibs/corlib/src/String.bf b/BeefLibs/corlib/src/String.bf index 783dc545..9bae5388 100644 --- a/BeefLibs/corlib/src/String.bf +++ b/BeefLibs/corlib/src/String.bf @@ -73,7 +73,8 @@ namespace System { int bufferSize = (count == 0) ? 0 : (count - 1) & ~(sizeof(char8*) - 1); #unwarn - char8* addlPtr = append char8[bufferSize]*(?); + char8* addlPtr = append char8[bufferSize]*(?); + Init(bufferSize); mAllocSizeAndFlags = (uint_strsize)bufferSize + (int_strsize)sizeof(char8*); mLength = 0; } @@ -83,7 +84,8 @@ namespace System { let bufferSize = 16 - sizeof(char8*); #unwarn - char8* addlPtr = append char8[bufferSize]*(?); + char8* addlPtr = append char8[bufferSize]*(?); + Init(bufferSize); mAllocSizeAndFlags = (uint_strsize)bufferSize + (int_strsize)sizeof(char8*); mLength = 0; } @@ -94,7 +96,8 @@ namespace System let count = str.mLength; int bufferSize = (count == 0) ? 0 : (count - 1) & ~(sizeof(char8*) - 1); #unwarn - char8* addlPtr = append char8[bufferSize]*(?); + char8* addlPtr = append char8[bufferSize]*(?); + Init(bufferSize); Internal.MemCpy(Ptr, str.Ptr, count); mLength = count; mAllocSizeAndFlags = (uint_strsize)bufferSize + (int_strsize)sizeof(char8*); @@ -108,6 +111,7 @@ namespace System int bufferSize = (count == 0) ? 0 : (count - 1) & ~(sizeof(char8*) - 1); #unwarn char8* addlPtr = append char8[bufferSize]*(?); + Init(bufferSize); let ptr = Ptr; let srcPtr = str.Ptr; for (int_strsize i = 0; i < count; i++) @@ -125,6 +129,7 @@ namespace System int bufferSize = (count == 0) ? 0 : (count - 1) & ~(sizeof(char8*) - 1); #unwarn char8* addlPtr = append char8[bufferSize]*(?); + Init(bufferSize); let ptr = Ptr; let srcPtr = str.Ptr; for (int i = 0; i < count; i++) @@ -139,6 +144,7 @@ namespace System int bufferSize = (count == 0) ? 0 : (count - 1) & ~(sizeof(char8*) - 1); #unwarn char8* addlPtr = append char8[bufferSize]*(?); + Init(bufferSize); let ptr = Ptr; for (int_strsize i = 0; i < count; i++) ptr[i] = c; @@ -152,7 +158,8 @@ namespace System let count = Internal.CStrLen(char8Ptr); int bufferSize = (count == 0) ? 0 : (count - 1) & ~(sizeof(char8*) - 1); #unwarn - char8* addlPtr = append char8[bufferSize]*(?); + char8* addlPtr = append char8[bufferSize]*(?); + Init(bufferSize); let ptr = Ptr; for (int_strsize i = 0; i < count; i++) ptr[i] = char8Ptr[i]; @@ -166,6 +173,7 @@ namespace System int bufferSize = (count == 0) ? 0 : (count - 1) & ~(sizeof(char8*) - 1); #unwarn char8* addlPtr = append char8[bufferSize]*(?); + Init(bufferSize); let ptr = Ptr; for (int i = 0; i < count; i++) ptr[i] = char8Ptr[i]; @@ -180,6 +188,7 @@ namespace System int bufferSize = (count == 0) ? 0 : (count - 1) & ~(sizeof(char8*) - 1); #unwarn char8* addlPtr = append char8[bufferSize]*(?); + Init(bufferSize); mAllocSizeAndFlags = (uint_strsize)bufferSize + (int_strsize)sizeof(char8*); mLength = 0; UTF16.Decode(char16Ptr, this); @@ -192,6 +201,7 @@ namespace System int bufferSize = (count == 0) ? 0 : (count - 1) & ~(sizeof(char8*) - 1); #unwarn char8* addlPtr = append char8[bufferSize]*(?); + Init(bufferSize); mAllocSizeAndFlags = (uint_strsize)bufferSize + (int_strsize)sizeof(char8*); mLength = 0; UTF16.Decode(chars, this); @@ -204,6 +214,7 @@ namespace System let bufferSize = (tryBufferSize >= 0) ? tryBufferSize : 0; #unwarn char8* addlPtr = append char8[bufferSize]*(?); + Init(bufferSize); let ptr = Ptr; Internal.MemCpy(ptr, strView.Ptr, strView.Length); mAllocSizeAndFlags = (uint_strsize)bufferSize + (int_strsize)sizeof(char8*); @@ -216,7 +227,8 @@ namespace System let count = strView.Length + (flags.HasFlag(.NullTerminate) ? 1 : 0); int bufferSize = (count == 0) ? 0 : (count - 1) & ~(sizeof(char8*) - 1); #unwarn - char8* addlPtr = append char8[bufferSize]*(?); + char8* addlPtr = append char8[bufferSize]*(?); + Init(bufferSize); let ptr = Ptr; Internal.MemCpy(ptr, strView.Ptr, strView.Length); if (flags.HasFlag(.NullTerminate)) @@ -233,7 +245,8 @@ namespace System let count = strView.Length - offset; int bufferSize = (count == 0) ? 0 : (count - 1) & ~(sizeof(char8*) - 1); #unwarn - char8* addlPtr = append char8[bufferSize]*(?); + char8* addlPtr = append char8[bufferSize]*(?); + Init(bufferSize); let ptr = Ptr; let srcPtr = strView.Ptr; for (int i = 0; i < count; i++) @@ -250,7 +263,8 @@ namespace System int bufferSize = (count == 0) ? 0 : (count - 1) & ~(sizeof(char8*) - 1); #unwarn - char8* addlPtr = append char8[bufferSize]*(?); + char8* addlPtr = append char8[bufferSize]*(?); + Init(bufferSize); let ptr = Ptr; let srcPtr = strView.Ptr; for (int i = 0; i < count; i++) @@ -264,7 +278,8 @@ namespace System { int bufferSize = (count == 0) ? 0 : (count - 1) & ~(sizeof(char8*) - 1); #unwarn - char8* addlPtr = append char8[bufferSize]*(?); + char8* addlPtr = append char8[bufferSize]*(?); + Init(bufferSize); let ptr = Ptr; for (int i = 0; i < count; i++) ptr[i] = chars[i + offset]; @@ -287,6 +302,7 @@ namespace System int bufferSize = (count == 0) ? 0 : (count - 1) & ~(sizeof(char8*) - 1); #unwarn char8* addlPtr = append char8[bufferSize]*(?); + Init(bufferSize); let ptr = Ptr; int curIdx = 0; for (var str in strs) @@ -299,6 +315,14 @@ namespace System mAllocSizeAndFlags = (uint_strsize)bufferSize + (int_strsize)sizeof(char8*); } +#if !VALGRIND + [SkipCall] +#endif + void Init(int appendSize) + { + Internal.MemSet(Ptr, 0, appendSize + (int_strsize)sizeof(char8*)); + } + public ~this() { if (IsDynAlloc) @@ -692,8 +716,11 @@ namespace System { Debug.Assert(AllocSize > 0, "String has been frozen"); Debug.Assert((uint)newSize <= cSizeFlags); - char8* newPtr = new:this char8[newSize]*; + char8* newPtr = new:this char8[newSize]* (?); Internal.MemCpy(newPtr, Ptr, mLength); +#if VALGRIND + Internal.MemSet(newPtr + mLength, 0, newSize - mLength); +#endif if (IsDynAlloc) delete:this mPtr; mPtr = newPtr; @@ -772,7 +799,10 @@ namespace System { // This handles appending to ourselves, we invalidate 'ptr' after calling Realloc int newSize = CalcNewSize(newCurrentIndex); - char8* newPtr = new:this char8[newSize]*; + char8* newPtr = new:this char8[newSize]* (?); +#if VALGRIND + Internal.MemSet(newPtr, 0, newSize); +#endif Internal.MemCpy(newPtr + mLength, appendPtr, length); Realloc(newPtr, newSize); ptr = newPtr; @@ -793,7 +823,10 @@ namespace System { // This handles appending to ourselves, we invalidate 'ptr' after calling Realloc int newSize = CalcNewSize(newCurrentIndex); - char8* newPtr = new:this char8[newSize]*; + char8* newPtr = new:this char8[newSize]* (?); +#if VALGRIND + Internal.MemSet(newPtr, 0, newSize); +#endif Internal.MemCpy(newPtr + mLength, appendPtr, length); Realloc(newPtr, newSize); ptr = newPtr; @@ -814,7 +847,10 @@ namespace System { // This handles appending to ourselves, we invalidate 'ptr' after calling Realloc int newSize = CalcNewSize(newCurrentIndex); - char8* newPtr = new:this char8[newSize]*; + char8* newPtr = new:this char8[newSize]* (?); +#if VALGRIND + Internal.MemSet(newPtr, 0, newSize); +#endif Internal.MemCpy(newPtr + mLength, arr.CArray() + idx, length); Realloc(newPtr, newSize); ptr = newPtr; diff --git a/BeefLibs/corlib/src/Threading/Thread.bf b/BeefLibs/corlib/src/Threading/Thread.bf index 39e9fa26..05ae5dcb 100644 --- a/BeefLibs/corlib/src/Threading/Thread.bf +++ b/BeefLibs/corlib/src/Threading/Thread.bf @@ -73,14 +73,22 @@ namespace System.Threading int32 stackStart = 0; thread.SetStackStart((void*)&stackStart); - if (thread.mDelegate is ThreadStart) + + var dlg = thread.mDelegate; + var threadStartArg = thread.mThreadStartArg; + thread.mDelegate = null; + + thread.ThreadStarted(); + + if (dlg is ThreadStart) { - ((ThreadStart)thread.mDelegate)(); + ((ThreadStart)dlg)(); } else { - ((ParameterizedThreadStart)thread.mDelegate)(thread.mThreadStartArg); + ((ParameterizedThreadStart)dlg)(threadStartArg); } + delete dlg; } public static this() @@ -173,6 +181,7 @@ namespace System.Threading extern void ManualThreadInit(); extern void StartInternal(); extern void SetStackStart(void* ptr); + extern void ThreadStarted(); public void Start(bool autoDelete = true) { @@ -335,10 +344,9 @@ namespace System.Threading mMaxStackSize = maxStackSize; } - public ~this() { - // Make sure we're not deleting manually it mAutoDelete is set + // Make sure we're not deleting manually if mAutoDelete is set Debug.Assert((!mAutoDelete) || (CurrentThread == this)); // Delegate to the unmanaged portion. InternalFinalize(); diff --git a/BeefRT/dbg/DbgInternal.cpp b/BeefRT/dbg/DbgInternal.cpp index 4bed7521..a653edaa 100644 --- a/BeefRT/dbg/DbgInternal.cpp +++ b/BeefRT/dbg/DbgInternal.cpp @@ -547,8 +547,11 @@ void Internal::Dbg_ObjectPreCustomDelete(bf::System::Object* object) { BF_ASSERT((BFRTFLAGS & BfRtFlags_ObjectHasDebugFlags) != 0); - const char* errorPtr = NULL; + if ((object->mObjectFlags & BfObjectFlag_AppendAlloc) != 0) + return; + const char* errorPtr = NULL; + if ((object->mObjectFlags & BfObjectFlag_StackAlloc) != 0) errorPtr = "Attempting to delete stack-allocated object"; if ((object->mObjectFlags & BfObjectFlag_Deleted) != 0) @@ -564,8 +567,7 @@ void Internal::Dbg_ObjectPreCustomDelete(bf::System::Object* object) errorStr += StrFormat(" (%s)0x%@\n", typeName.c_str(), object); SETUP_ERROR(errorStr.c_str(), 2); BF_DEBUG_BREAK(); - BFRTCALLBACKS.DebugMessageData_Fatal(); - return; + BFRTCALLBACKS.DebugMessageData_Fatal(); } } diff --git a/BeefRT/rt/Thread.cpp b/BeefRT/rt/Thread.cpp index 655e71f4..23c36536 100644 --- a/BeefRT/rt/Thread.cpp +++ b/BeefRT/rt/Thread.cpp @@ -120,16 +120,21 @@ static void BF_CALLTYPE CStartProc(void* threadParam) #endif auto internalThread = thread->GetInternalThread(); + + // Hold lock until we get ThreadStarted callback + internalThread->mCritSect.Lock(); + + internalThread->mStartedEvent.Set(true); internalThread->mThreadHandle = BfpThread_GetCurrent(); internalThread->mStackStart = (intptr)&thread; internalThread->ThreadStarted(); - + bool isAutoDelete = gBfRtCallbacks.Thread_IsAutoDelete(thread); gBfRtCallbacks.Thread_ThreadProc(thread); bool isLastThread = BfpSystem_InterlockedExchangeAdd32((uint32*)&gLiveThreadCount, -1) == 1; //printf("Stopping thread\n"); - + bool wantsDelete = false; // { @@ -143,8 +148,7 @@ static void BF_CALLTYPE CStartProc(void* threadParam) if (internalThread->mThread == NULL) { // If the thread was already deleted then we need to delete ourselves now - wantsDelete = true; - internalThread = NULL; + wantsDelete = true; } } @@ -194,6 +198,9 @@ void Thread::StartInternal() BfpSystem_InterlockedExchangeAdd32((uint32*)&gLiveThreadCount, 1); BfInternalThread* internalThread = SetupInternalThread(); + + Beefy::AutoCrit autoCrit(internalThread->mCritSect); + internalThread->mStarted = true; internalThread->mThread = this; #ifdef _WIN32 internalThread->mThreadHandle = BfpThread_Create(CStartProc, (void*)this, GetMaxStackSize(), (BfpThreadCreateFlags)(BfpThreadCreateFlag_StackSizeReserve | BfpThreadCreateFlag_Suspended), &internalThread->mThreadId); @@ -205,6 +212,12 @@ void Thread::StartInternal() #endif } +void Thread::ThreadStarted() +{ + auto internalThread = GetInternalThread(); + internalThread->mCritSect.Unlock(); +} + int Thread::GetThreadId() { return (int)GetInternalThread()->mThreadId; @@ -221,11 +234,22 @@ void Thread::InternalFinalize() auto internalThread = GetInternalThread(); if (internalThread == NULL) return; - + bool wantsJoin = false; + + bool started = false; // { Beefy::AutoCrit autoCrit(internalThread->mCritSect); + started = internalThread->mStarted; + } + + if (started) + internalThread->mStartedEvent.WaitFor(); + + // + { + Beefy::AutoCrit autoCrit(internalThread->mCritSect); if ((!internalThread->mDone) && (internalThread->mJoinOnDelete)) { if (this != BfGetCurrentThread()) @@ -255,6 +279,9 @@ void Thread::InternalFinalize() SetInternalThread(NULL); } + if (internalThread->mIsManualInit) + wantsDelete = true; + if (wantsDelete) delete internalThread; } @@ -283,53 +310,3 @@ void Thread::MemoryBarrier() { BF_FULL_MEMORY_FENCE(); } - -////////////////////////////////////////////////////////////////////////// - -// BfInternalThread::BfInternalThread() -// { -// #ifdef BF_GC_SUPPORTED -// mBFIThreadData = NULL; -// #endif -// -// mThread = NULL; -// mThreadHandle = 0; -// mStarted = false; -// mRunning = false; -// mDone = false; -// mIsSuspended = false; -// } -// -// BfInternalThread::~BfInternalThread() -// { -// if (mThreadHandle != 0) -// { -// BfpThread_Release(mThreadHandle); -// } -// } -// -// void BfInternalThread::ManualThreadInit(bf::System::Threading::Thread* thread) -// { -// bf::System::Threading::Thread* newThread = thread; -// -// mStarted = true; -// mThread = newThread; -// newThread->SetInternalThread(this); -// mThreadId = BfpThread_GetCurrentId(); -// mThreadHandle = BfpThread_GetCurrent(); -// mStackStart = ((intptr)&newThread + 0xFFF) & ~(intptr)0xFFF; -// ThreadStarted(); -// } - -// void BfInternalThread::ThreadStarted() -// { -// BF_ASSERT((gBfRtFlags & BfRtFlags_ObjectHasDebugFlags) == 0); -// int threadPriority = BfpThread_GetPriority(mThreadHandle, NULL); -// mRunning = true; -// } -// -// void BfInternalThread::ThreadStopped() -// { -// BF_ASSERT((gBfRtFlags & BfRtFlags_ObjectHasDebugFlags) == 0); -// mRunning = false; -// } diff --git a/BeefRT/rt/Thread.h b/BeefRT/rt/Thread.h index 59433ec5..d71a2f74 100644 --- a/BeefRT/rt/Thread.h +++ b/BeefRT/rt/Thread.h @@ -55,6 +55,7 @@ namespace bf BFRT_EXPORT static Thread* GetCurrentThreadNative(); BFRT_EXPORT unsigned long GetProcessDefaultStackSize(); BFRT_EXPORT void StartInternal(); + BFRT_EXPORT void ThreadStarted(); BFRT_EXPORT void SetStackStart(void* ptr); BFRT_EXPORT void InternalFinalize(); BFRT_EXPORT bool IsBackgroundNative(); @@ -107,9 +108,11 @@ public: bool mDone; bool mStarted; bool mJoinOnDelete; + bool mIsManualInit; BfpThread* mThreadHandle; intptr mThreadId; Beefy::CritSect mCritSect; + Beefy::SyncEvent mStartedEvent; BfInternalThread() { @@ -120,6 +123,7 @@ public: mDone = false; mIsSuspended = false; mJoinOnDelete = true; + mIsManualInit = false; mStackStart = 0; mThreadId = 0; } @@ -136,7 +140,9 @@ public: { bf::System::Threading::Thread* newThread = thread; + mIsManualInit = true; mStarted = true; + mStartedEvent.Set(true); mThread = newThread; newThread->SetInternalThread(this); mThreadId = BfpThread_GetCurrentId(); diff --git a/BeefySysLib/platform/posix/PosixCommon.cpp b/BeefySysLib/platform/posix/PosixCommon.cpp index 9e55deda..ebbc35b8 100644 --- a/BeefySysLib/platform/posix/PosixCommon.cpp +++ b/BeefySysLib/platform/posix/PosixCommon.cpp @@ -1219,6 +1219,10 @@ struct BfpThread { } + ~BfpThread() + { + } + void Release() { int refCount = __sync_fetch_and_sub(&mRefCount, 1) - 1; @@ -1240,11 +1244,13 @@ static __thread BfpThreadInfo gCurrentThreadInfo; void* ThreadFunc(void* threadParam) { BfpThread* thread = (BfpThread*)threadParam; + gCurrentThread = thread; thread->mStartProc(thread->mThreadParam); #ifndef BFP_HAS_PTHREAD_TIMEDJOIN_NP BfpEvent_Set(thread->mDoneEvent, true); -#endif +#endif + thread->Release(); return NULL; } @@ -1300,6 +1306,7 @@ BFP_EXPORT void BFP_CALLTYPE BfpThread_Release(BfpThread* thread) pthread_detach(thread->mPThread); thread->mPThreadReleased = true; } + thread->Release(); } @@ -1485,6 +1492,7 @@ BFP_EXPORT BfpCritSect* BFP_CALLTYPE BfpCritSect_Create() BFP_EXPORT void BFP_CALLTYPE BfpCritSect_Release(BfpCritSect* critSect) { pthread_mutex_destroy(&critSect->mPMutex); + delete critSect; } BFP_EXPORT void BFP_CALLTYPE BfpCritSect_Enter(BfpCritSect* critSect) @@ -1564,6 +1572,7 @@ BFP_EXPORT void BFP_CALLTYPE BfpEvent_Release(BfpEvent* event) { pthread_cond_destroy(&event->mCondVariable); pthread_mutex_destroy(&event->mMutex); + delete event; } BFP_EXPORT void BFP_CALLTYPE BfpEvent_Set(BfpEvent* event, bool requireManualReset) @@ -2266,7 +2275,7 @@ BFP_EXPORT void BFP_CALLTYPE BfpFile_GetFullPath(const char* inPath, char* outPa else { char* cwdPtr = getcwd(NULL, 0); - Beefy::String cwdPath = cwdPtr; + Beefy::String cwdPath = cwdPtr; free(cwdPtr); str = GetAbsPath(inPath, cwdPath); } @@ -2324,6 +2333,7 @@ BFP_EXPORT BfpFindFileData* BFP_CALLTYPE BfpFindFileData_FindFirstFile(const cha if (!BfpFindFileData_FindNextFile(findData)) { OUTRESULT(BfpFileResult_NoResults); + closedir(findData->mDirStruct); delete findData; return NULL; } @@ -2448,6 +2458,7 @@ BFP_EXPORT int64 BFP_CALLTYPE BfpFindFileData_GetFileSize(BfpFindFileData* findD BFP_EXPORT void BFP_CALLTYPE BfpFindFileData_Release(BfpFindFileData* findData) { + closedir(findData->mDirStruct); delete findData; } diff --git a/BeefySysLib/util/BeefPerf.cpp b/BeefySysLib/util/BeefPerf.cpp index 87d1d889..49ffeef1 100644 --- a/BeefySysLib/util/BeefPerf.cpp +++ b/BeefySysLib/util/BeefPerf.cpp @@ -870,7 +870,7 @@ void* BpManager::AllocBytes(int size) void BpManager::FreeBytes(void* ptr) { - delete (uint8*)ptr; + delete [] (uint8*)ptr; } void BpManager::FinishWorkThread() diff --git a/BeefySysLib/util/BitSet.h b/BeefySysLib/util/BitSet.h index 41f94f05..a57da20d 100644 --- a/BeefySysLib/util/BitSet.h +++ b/BeefySysLib/util/BitSet.h @@ -43,7 +43,7 @@ public: ~BitSet() { - delete this->mBits; + delete [] this->mBits; } void Resize(int numBits) diff --git a/BeefySysLib/util/Dictionary.h b/BeefySysLib/util/Dictionary.h index fbb05dd4..321a38e5 100644 --- a/BeefySysLib/util/Dictionary.h +++ b/BeefySysLib/util/Dictionary.h @@ -429,7 +429,7 @@ public: } } - delete mEntries; + delete [] mEntries; } Dictionary& operator=(const Dictionary& rhs) diff --git a/IDE/src/BeefConfig.bf b/IDE/src/BeefConfig.bf index 11cb923e..58b31796 100644 --- a/IDE/src/BeefConfig.bf +++ b/IDE/src/BeefConfig.bf @@ -25,6 +25,7 @@ namespace IDE public List mEntries = new List() ~ DeleteContainerAndItems!(_); public Monitor mMonitor = new .() ~ delete _; public WaitEvent mEvent = new .() ~ delete _; + public Thread mThread ~ delete _; public ~this() { @@ -75,8 +76,9 @@ namespace IDE public void StartResolve() { - var thread = new Thread(new => Resolve); - thread.Start(true); + delete mThread; + mThread = new Thread(new => Resolve); + mThread.Start(false); } } diff --git a/IDE/src/IDEApp.bf b/IDE/src/IDEApp.bf index 58e0c8e0..4e96300b 100644 --- a/IDE/src/IDEApp.bf +++ b/IDE/src/IDEApp.bf @@ -11554,11 +11554,13 @@ namespace IDE public void CreateSpellChecker() { +#if !CLI mSpellChecker = new SpellChecker(); if (mSpellChecker.Init(scope String(mInstallDir, "en_US")) case .Err) { DeleteAndNullify!(mSpellChecker); } +#endif } public FileVersionInfo GetVersionInfo(out DateTime exeTime) diff --git a/IDEHelper/Backend/BeIRCodeGen.cpp b/IDEHelper/Backend/BeIRCodeGen.cpp index f3d6af99..58f1d8d4 100644 --- a/IDEHelper/Backend/BeIRCodeGen.cpp +++ b/IDEHelper/Backend/BeIRCodeGen.cpp @@ -2854,16 +2854,16 @@ void BeIRCodeGen::HandleNextCmd() CMD_PARAM(int, typeId); CMD_PARAM(BeMDNode*, type); auto& typeEntry = GetTypeEntry(typeId); - typeEntry.mDIType = (BeDbgType*)type; + typeEntry.mDIType = BeValueDynCast(type); if (typeEntry.mInstDIType == NULL) - typeEntry.mInstDIType = (BeDbgType*)type; + typeEntry.mInstDIType = BeValueDynCast(type); } break; case BfIRCmd_DbgSetInstType: { CMD_PARAM(int, typeId); CMD_PARAM(BeMDNode*, type); - GetTypeEntry(typeId).mInstDIType = (BeDbgType*)type; + GetTypeEntry(typeId).mInstDIType = BeValueDynCast(type); } break; case BfIRCmd_DbgGetType: @@ -2955,7 +2955,7 @@ void BeIRCodeGen::HandleNextCmd() dbgType->mName = name; dbgType->mSize = (int)(sizeInBits / 8); dbgType->mAlign = (int)(alignInBits / 8); - dbgType->mDerivedFrom = (BeDbgType*)derivedFrom; + dbgType->mDerivedFrom = BeValueDynCast(derivedFrom); dbgType->mDefFile = (BeDbgFile*)file; dbgType->mDefLine = lineNum - 1; dbgType->mIsFullyDefined = true; @@ -2981,7 +2981,7 @@ void BeIRCodeGen::HandleNextCmd() dbgType->mSize = (int)(sizeInBits / 8); dbgType->mAlign = (int)(alignInBits / 8); dbgType->mIsFullyDefined = true; - dbgType->mElementType = (BeDbgType*)underlyingType; + dbgType->mElementType = BeValueDynCast(underlyingType); for (auto member : members) { if (auto enumMember = BeValueDynCast(member)) @@ -3101,7 +3101,7 @@ void BeIRCodeGen::HandleNextCmd() auto dbgArray = mBeModule->mDbgModule->mTypes.Alloc(); dbgArray->mSize = (int)(sizeInBits / 8); dbgArray->mAlign = (int)(alignInBits / 8); - dbgArray->mElement = (BeDbgType*)elementType; + dbgArray->mElement = BeValueDynCast(elementType); dbgArray->mNumElements = numElements; SetResult(curId, dbgArray); @@ -3212,9 +3212,11 @@ void BeIRCodeGen::HandleNextCmd() CMD_PARAM(int64, sizeInBits); CMD_PARAM(int64, alignInBits); - auto dbgType = (BeDbgType*)mdType; - dbgType->mSize = (int)(sizeInBits / 8); - dbgType->mAlign = (int)(alignInBits / 8); + if (auto dbgType = BeValueDynCast(mdType)) + { + dbgType->mSize = (int)(sizeInBits / 8); + dbgType->mAlign = (int)(alignInBits / 8); + } } break; case BfIRCmd_DbgReplaceAllUses: @@ -3244,7 +3246,7 @@ void BeIRCodeGen::HandleNextCmd() } else if (auto dbgType = BeValueDynCast(diNode)) { - dbgType->mElementType = (BeDbgType*)diBaseType; + dbgType->mElementType = BeValueDynCast(diBaseType); dbgType->SetMembers(members); } else @@ -3279,7 +3281,7 @@ void BeIRCodeGen::HandleNextCmd() auto dbgMember = mBeModule->mOwnedValues.Alloc(); dbgMember->mName = name; - dbgMember->mType = (BeDbgType*)type; + dbgMember->mType = BeValueDynCast(type); dbgMember->mOffset = (int)(offsetInBits / 8); dbgMember->mFlags = flags; @@ -3300,7 +3302,7 @@ void BeIRCodeGen::HandleNextCmd() auto dbgMember = mBeModule->mOwnedValues.Alloc(); dbgMember->mName = name; - dbgMember->mType = (BeDbgType*)type; + dbgMember->mType = BeValueDynCast(type); dbgMember->mOffset = -1; dbgMember->mStaticValue = val; dbgMember->mFlags = flags; @@ -3317,7 +3319,7 @@ void BeIRCodeGen::HandleNextCmd() CMD_PARAM(int, flags); auto dbgInheritance = mBeModule->mAlloc.Alloc(); - dbgInheritance->mBaseType = (BeDbgType*)baseType; + dbgInheritance->mBaseType = BeValueDynCast(baseType); SetResult(curId, dbgInheritance); } @@ -3358,7 +3360,7 @@ void BeIRCodeGen::HandleNextCmd() for (auto arg : genericArgs) { BF_ASSERT(arg != NULL); - dbgFunc->mGenericArgs.Add((BeDbgType*)arg); + dbgFunc->mGenericArgs.Add(BeValueDynCast(arg)); } for (auto genericConstValue : genericConstValueArgs) dbgFunc->mGenericConstValueArgs.Add(genericConstValue); @@ -3457,9 +3459,9 @@ void BeIRCodeGen::HandleNextCmd() auto dbgFuncType = mBeModule->mOwnedValues.Alloc(); if (!elements.empty()) { - dbgFuncType->mReturnType = (BeDbgType*)elements[0]; + dbgFuncType->mReturnType = BeValueDynCast(elements[0]); for (int i = 1; i < (int)elements.size(); i++) - dbgFuncType->mParams.push_back((BeDbgType*)elements[i]); + dbgFuncType->mParams.push_back(BeValueDynCast(elements[i])); } SetResult(curId, dbgFuncType); diff --git a/IDEHelper/Beef/BfCommon.h b/IDEHelper/Beef/BfCommon.h index 14a56bd9..507a00b8 100644 --- a/IDEHelper/Beef/BfCommon.h +++ b/IDEHelper/Beef/BfCommon.h @@ -68,8 +68,9 @@ public: }; BfSizedArray() - { + { mSize = 0; + mVals = NULL; } BfSizedArray(const llvm::SmallVectorImpl& refVec) diff --git a/IDEHelper/Compiler/BfAst.h b/IDEHelper/Compiler/BfAst.h index b0a3deab..67cd72d2 100644 --- a/IDEHelper/Compiler/BfAst.h +++ b/IDEHelper/Compiler/BfAst.h @@ -104,6 +104,13 @@ struct BfVariant return mSingle; return (double)mInt64; } + + BfVariant() + { + mTypeCode = BfTypeCode_None; + mWarnType = 0; + mUInt64 = 0; + } }; enum BfToken : uint8 diff --git a/IDEHelper/Compiler/BfCompiler.cpp b/IDEHelper/Compiler/BfCompiler.cpp index 91fc1471..a68f7aff 100644 --- a/IDEHelper/Compiler/BfCompiler.cpp +++ b/IDEHelper/Compiler/BfCompiler.cpp @@ -370,8 +370,7 @@ BfCompiler::BfCompiler(BfSystem* bfSystem, bool isResolveOnly) mHadCancel = false; mCompileState = CompileState_None; - //mMaxInterfaceSlots = 4; - mContext = new BfContext(this); + //mMaxInterfaceSlots = 4; mHotData = NULL; mHotState = NULL; mHotResolveData = NULL; @@ -479,8 +478,7 @@ BfCompiler::BfCompiler(BfSystem* bfSystem, bool isResolveOnly) mLastAutocompleteModule = NULL; - //if (isResolveOnly) - //mCeMachine = NULL; + mContext = new BfContext(this); mCeMachine = new CeMachine(this); mCurCEExecuteId = -1; } diff --git a/IDEHelper/Compiler/BfContext.cpp b/IDEHelper/Compiler/BfContext.cpp index 5cba1ce6..ecb3dd7d 100644 --- a/IDEHelper/Compiler/BfContext.cpp +++ b/IDEHelper/Compiler/BfContext.cpp @@ -34,8 +34,7 @@ USING_NS_BF; using namespace llvm; BfContext::BfContext(BfCompiler* compiler) : - mTypeDefTypeRefPool(true), - mNamedTypeRefPool(true) + mTypeDefTypeRefPool(true, true) { mCompiler = compiler; mSystem = compiler->mSystem; diff --git a/IDEHelper/Compiler/BfContext.h b/IDEHelper/Compiler/BfContext.h index 0dfc629f..e2501b29 100644 --- a/IDEHelper/Compiler/BfContext.h +++ b/IDEHelper/Compiler/BfContext.h @@ -424,8 +424,6 @@ public: BfAllocPool mArrayTypeInstancePool; BfAllocPool mGenericParamTypePool; BfAllocPool mTypeDefTypeRefPool; - BfAllocPool mNamedTypeRefPool; - BfAllocPool mGenericTypeRefPool; BfAllocPool mConcreteInterfaceTypePool; BfAllocPool mConstExprValueTypePool; BfAllocPool mDelegateTypePool; diff --git a/IDEHelper/Compiler/BfIRCodeGen.cpp b/IDEHelper/Compiler/BfIRCodeGen.cpp index bf72393b..b63cb2b8 100644 --- a/IDEHelper/Compiler/BfIRCodeGen.cpp +++ b/IDEHelper/Compiler/BfIRCodeGen.cpp @@ -2864,7 +2864,7 @@ void BfIRCodeGen::HandleNextCmd() bool isFakeIntrinsic = (int)intrinsics[intrinId].mID == -2; if (isFakeIntrinsic) { - auto intrinsicData = mAlloc.Alloc(); + auto intrinsicData = mIntrinsicData.Alloc(); intrinsicData->mName = intrinName; intrinsicData->mIntrinsic = (BfIRIntrinsic)intrinId; intrinsicData->mReturnType = returnType; @@ -2884,7 +2884,7 @@ void BfIRCodeGen::HandleNextCmd() if (platName.IsEmpty()) { - auto intrinsicData = mAlloc.Alloc(); + auto intrinsicData = mIntrinsicData.Alloc(); intrinsicData->mName = platIntrinName; intrinsicData->mIntrinsic = BfIRIntrinsic__PLATFORM; intrinsicData->mReturnType = returnType; diff --git a/IDEHelper/Compiler/BfIRCodeGen.h b/IDEHelper/Compiler/BfIRCodeGen.h index b2c7721c..9a7c1428 100644 --- a/IDEHelper/Compiler/BfIRCodeGen.h +++ b/IDEHelper/Compiler/BfIRCodeGen.h @@ -121,6 +121,7 @@ public: Dictionary mAlignedTypeToNormalType; Dictionary mTypeToTypeIdMap; HashSet mLockedBlocks; + OwnedArray mIntrinsicData; public: void InitTarget(); diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index d3990af2..c4ed52e8 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -966,14 +966,14 @@ void BfModule::RemoveModuleData() } void BfModule::Init(bool isFullRebuild) -{ +{ mContext->mFinishedModuleWorkList.Remove(this); if ((mCompiler->mIsResolveOnly) && (this != mContext->mUnreifiedModule)) BF_ASSERT(mIsReified); if (!mIsScratchModule) - { + { mCompiler->mStats.mModulesStarted++; if (mIsReified) mCompiler->mStats.mReifiedModuleCount++; @@ -981,7 +981,7 @@ void BfModule::Init(bool isFullRebuild) } mIsHotModule = (mProject != NULL) && (mCompiler->mOptions.mHotProject != NULL) && (mCompiler->mOptions.mHotProject->ContainsReference(mProject)); - + mFuncReferences.Clear(); mClassVDataRefs.Clear(); mClassVDataExtRefs.Clear(); @@ -990,22 +990,25 @@ void BfModule::Init(bool isFullRebuild) CleanupFileInstances(); mStaticFieldRefs.Clear(); //mInterfaceSlotRefs.Clear(); - + // If we are just doing an extension then the ownede types aren't rebuilt. // If we set mRevision then QueueMethodSpecializations wouldn't actually queue up required specializations // and we'd end up with link errors if the original module uniquely referred to any generic methods if (isFullRebuild) - mRevision = mCompiler->mRevision; + mRevision = mCompiler->mRevision; BF_ASSERT(mCurTypeInstance == NULL); - + mIsModuleMutable = true; BF_ASSERT((mBfIRBuilder == NULL) || (mCompiler->mIsResolveOnly)); + if (!mIsComptimeModule) + { #ifdef _DEBUG - EnsureIRBuilder(mCompiler->mLastAutocompleteModule == this); + EnsureIRBuilder(mCompiler->mLastAutocompleteModule == this); #else - EnsureIRBuilder(false); + EnsureIRBuilder(false); #endif + } mCurMethodState = NULL; mAwaitingInitFinish = true; @@ -1151,7 +1154,7 @@ void BfModule::SetupIRBuilder(bool dbgVerifyCodeGen) if (mIsScratchModule) { mBfIRBuilder->mIgnoreWrites = true; - BF_ASSERT(!dbgVerifyCodeGen); + BF_ASSERT(!dbgVerifyCodeGen); } #ifdef _DEBUG if (mCompiler->mIsResolveOnly) @@ -6561,6 +6564,7 @@ BfIRValue BfModule::CreateTypeData(BfType* type, Dictionary& usedStrin { reflectKind = (BfReflectKind)(reflectKind | GetUserReflectKind(attr.mType)); } + delete customAttrs; } return reflectKind; }; @@ -12225,6 +12229,9 @@ void BfModule::ProcessTypeInstCustomAttributes(int& packing, bool& isUnion, bool // Checking to see if we're an attribute or not void BfModule::ProcessCustomAttributeData() { + if (mCurTypeInstance->mAttributeData != NULL) + return; + bool isAttribute = false; auto checkTypeInst = mCurTypeInstance->mBaseType; while (checkTypeInst != NULL) diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 8a4cd0c4..0b827985 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -4110,7 +4110,9 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy } else { - typeInstance->mCustomAttributes = GetCustomAttributes(typeDef->mTypeDeclaration->mAttributes, attrTarget); + + typeInstance->mCustomAttributes = new BfCustomAttributes(); + GetCustomAttributes(typeInstance->mCustomAttributes, typeDef->mTypeDeclaration->mAttributes, attrTarget); } } } @@ -4127,7 +4129,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy prevSkipTypeProtectionChecks.Restore(); typeInstance->mInstSize = std::max(0, typeInstance->mInstSize); typeInstance->mInstAlign = std::max(0, typeInstance->mInstAlign); - + ProcessCustomAttributeData(); int packing = 0; bool isUnion = false; @@ -8355,7 +8357,6 @@ BfType* BfModule::ResolveGenericType(BfType* unspecializedType, BfTypeVector* ty BfDelegateInfo* delegateInfo = delegateType->GetDelegateInfo(); delegateInfo->mParams.Clear(); - BfTypeDef* typeDef = new BfTypeDef(); typeDef->mProject = baseDelegateType->mTypeDef->mProject; @@ -9852,6 +9853,7 @@ void BfModule::GetDelegateTypeRefAttributes(BfDelegateTypeRef* delegateTypeRef, callingConvention = (BfCallingConvention)constant->mInt32; } } + delete customAttributes; } } diff --git a/IDEHelper/Compiler/BfParser.cpp b/IDEHelper/Compiler/BfParser.cpp index beec3718..35a3c132 100644 --- a/IDEHelper/Compiler/BfParser.cpp +++ b/IDEHelper/Compiler/BfParser.cpp @@ -3642,7 +3642,7 @@ void BfParser::HadSrcRealloc() memset(jumpTable, 0, jumpTableSize * sizeof(BfLineStartEntry)); memcpy(jumpTable, mJumpTable, mJumpTableSize * sizeof(BfLineStartEntry)); - delete mJumpTable; + delete [] mJumpTable; mJumpTable = jumpTable; mJumpTableSize = jumpTableSize; diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp index ca3f5781..9f561e13 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp @@ -1574,9 +1574,13 @@ BfMethodInstanceGroup::BfMethodInstanceGroup(BfMethodInstanceGroup&& prev) noexc mOwner = prev.mOwner; mDefault = prev.mDefault; mMethodSpecializationMap = prev.mMethodSpecializationMap; + mDefaultCustomAttributes = prev.mDefaultCustomAttributes; mMethodIdx = prev.mMethodIdx; mRefCount = prev.mRefCount; mOnDemandKind = prev.mOnDemandKind; + mExplicitlyReflected = prev.mExplicitlyReflected; + mHasEmittedReference = prev.mHasEmittedReference; + if (mDefault != NULL) mDefault->mMethodInstanceGroup = this; if (mMethodSpecializationMap != NULL) @@ -1584,9 +1588,8 @@ BfMethodInstanceGroup::BfMethodInstanceGroup(BfMethodInstanceGroup&& prev) noexc for (auto& pair : *mMethodSpecializationMap) pair.mValue->mMethodInstanceGroup = this; } - mDefaultCustomAttributes = prev.mDefaultCustomAttributes; + prev.mDefaultCustomAttributes = NULL; - prev.mRefCount = 0; prev.mDefault = NULL; prev.mMethodSpecializationMap = NULL; @@ -2716,10 +2719,17 @@ void BfClosureType::Finish() BfDelegateType::~BfDelegateType() { mMethodInstanceGroups.Clear(); - delete mTypeDef; + delete mTypeDef; mTypeDef = NULL; } +void BfDelegateType::Dispose() +{ + delete mTypeDef; + mTypeDef = NULL; + BfTypeInstance::Dispose(); +} + ////////////////////////////////////////////////////////////////////////// BfTupleType::BfTupleType() @@ -2766,6 +2776,17 @@ void BfTupleType::Init(BfProject* bfProject, BfTypeInstance* valueTypeInstance) mCreatedTypeDef = true; } +void BfTupleType::Dispose() +{ + if (mCreatedTypeDef) + { + delete mTypeDef; + mTypeDef = NULL; + mCreatedTypeDef = false; + } + BfTypeInstance::Dispose(); +} + BfFieldDef* BfTupleType::AddField(const StringImpl& name) { return BfDefBuilder::AddField(mTypeDef, NULL, name); @@ -2790,8 +2811,8 @@ void BfTupleType::Finish() BfBoxedType::~BfBoxedType() { - if ((mTypeDef != NULL) && (mTypeDef->mEmitParent != NULL)) - mTypeDef = NULL; + //if ((mTypeDef != NULL) && (mTypeDef->mEmitParent != NULL)) + mTypeDef = NULL; } BfType* BfBoxedType::GetModifiedElementType() @@ -2940,7 +2961,7 @@ BfVariant BfResolvedTypeSet::EvaluateToVariant(LookupContext* ctx, BfExpression* outType = NULL; BfConstResolver constResolver(ctx->mModule); - BfVariant variant = { BfTypeCode_None }; + BfVariant variant; constResolver.mAllowGenericConstValue = true; constResolver.mBfEvalExprFlags = BfEvalExprFlags_NoCast; constResolver.mExpectingType = ctx->mModule->GetPrimitiveType(BfTypeCode_Int64); diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.h b/IDEHelper/Compiler/BfResolvedTypeUtils.h index 08570a19..b4952612 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.h +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.h @@ -2007,7 +2007,7 @@ public: ~BfTypeInstance(); - void Dispose(); + virtual void Dispose(); void ReleaseData(); virtual bool IsInstanceOf(BfTypeDef* typeDef) override { if (typeDef == NULL) return false; return typeDef->GetDefinition() == mTypeDef->GetDefinition(); } @@ -2245,6 +2245,7 @@ public: } ~BfDelegateType(); + virtual void Dispose() override; virtual bool IsOnDemand() override { return true; } virtual bool IsDelegate() override { return mTypeDef->mIsDelegate; } @@ -2277,6 +2278,7 @@ public: ~BfTupleType(); void Init(BfProject* bfProject, BfTypeInstance* valueTypeInstance); + virtual void Dispose() override; BfFieldDef* AddField(const StringImpl& name); void Finish(); diff --git a/IDEHelper/Compiler/BfSource.cpp b/IDEHelper/Compiler/BfSource.cpp index 648637ee..0458081b 100644 --- a/IDEHelper/Compiler/BfSource.cpp +++ b/IDEHelper/Compiler/BfSource.cpp @@ -41,12 +41,7 @@ BfSource::~BfSource() delete mSourceData; if (mSrcAllocSize >= 0) - delete mSrc; - - for (auto typeDef : mTypeDefs) - { - NOP; - } + delete [] mSrc; } bool BfSource::WantsStats() @@ -84,7 +79,7 @@ int BfSource::AllocChars(int charCount) if (mSrc != NULL) { memcpy(newSrc, mSrc, mSrcLength); - delete mSrc; + delete [] mSrc; } mSrc = newSrc; mSrcAllocSize = newAllocSize; diff --git a/IDEHelper/Compiler/BfSource.h b/IDEHelper/Compiler/BfSource.h index 8588adc6..10848d15 100644 --- a/IDEHelper/Compiler/BfSource.h +++ b/IDEHelper/Compiler/BfSource.h @@ -49,7 +49,7 @@ public: { BF_ASSERT(mExteriorNodes.mSize >= 0); BF_ASSERT(mExteriorNodes.mSize < 0x00FFFFFF); - delete mSrc; + delete [] mSrc; } virtual BfParserData* ToParserData() diff --git a/IDEHelper/Compiler/BfSystem.cpp b/IDEHelper/Compiler/BfSystem.cpp index b74a4c4e..ae5200f2 100644 --- a/IDEHelper/Compiler/BfSystem.cpp +++ b/IDEHelper/Compiler/BfSystem.cpp @@ -2108,7 +2108,7 @@ void BfSystem::ProcessAtomGraveyard() { deletedAtoms.Add(atom); auto itr = mAtomMap.Remove(atom->mString); - delete atom->mString.mPtr; + free((void*)atom->mString.mPtr); delete atom; } } diff --git a/IDEHelper/Compiler/BfUtil.h b/IDEHelper/Compiler/BfUtil.h index 92fb28cf..55f198a6 100644 --- a/IDEHelper/Compiler/BfUtil.h +++ b/IDEHelper/Compiler/BfUtil.h @@ -146,11 +146,13 @@ public: Array mVals; T* mNext; bool mOwnsAll; + bool mZeroAlloc; public: - BfAllocPool(bool ownsAll = false) + BfAllocPool(bool ownsAll = false, bool zeroAlloc = false) { mOwnsAll = ownsAll; + mZeroAlloc = zeroAlloc; mNext = NULL; } @@ -160,8 +162,13 @@ public: delete mNext; for (auto val : mVals) { - val->~T(); - free(val); + if (mZeroAlloc) + { + val->~T(); + free(val); + } + else + delete val; } } @@ -176,10 +183,15 @@ public: mVals.pop_back(); return val; } - //val = new T(); - void* addr = malloc(sizeof(T)); - memset(addr, 0, sizeof(T)); - val = new(addr) T(); + + if (mZeroAlloc) + { + void* addr = malloc(sizeof(T)); + memset(addr, 0, sizeof(T)); + val = new(addr) T(); + } + else + val = new T(); if (mOwnsAll) mVals.push_back(val); return val; diff --git a/IDEHelper/Compiler/CeMachine.cpp b/IDEHelper/Compiler/CeMachine.cpp index c9439a73..1bc1db80 100644 --- a/IDEHelper/Compiler/CeMachine.cpp +++ b/IDEHelper/Compiler/CeMachine.cpp @@ -5087,6 +5087,7 @@ BfTypedValue CeContext::Call(CeCallSource callSource, BfModule* module, BfMethod retAddr = stackPtr - memStart; } + delete mCeMachine->mAppendAllocInfo; mCeMachine->mAppendAllocInfo = NULL; BfType* returnType = NULL; @@ -6705,7 +6706,7 @@ bool CeContext::Execute(CeFunction* startFunction, uint8* startStackPtr, uint8* CE_CHECKADDR(outStdInAddr, ptrSize); if (outStdOutAddr != 0) CE_CHECKADDR(outStdOutAddr, ptrSize); - if (outStdErrAddr != NULL) + if (outStdErrAddr != 0) CE_CHECKADDR(outStdErrAddr, ptrSize); BfpFile* outStdIn = NULL; @@ -8526,6 +8527,8 @@ CeMachine::~CeMachine() void CeMachine::Init() { + BF_ASSERT(mCeModule == NULL); + mCeModule = new BfModule(mCompiler->mContext, "__constEval"); mCeModule->mIsSpecialModule = true; //mCeModule->mIsScratchModule = true; @@ -8537,6 +8540,7 @@ void CeMachine::Init() mCeModule->mIsReified = false; mCeModule->Init(); + BF_ASSERT(mCeModule->mBfIRBuilder == NULL); mCeModule->mBfIRBuilder = new BfIRBuilder(mCeModule); mCeModule->mBfIRBuilder->mDbgVerifyCodeGen = true; mCeModule->FinishInit();