From 37fc1a08e15598477f6f92ddffbbd43682e58303 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Wed, 15 Jul 2020 15:32:06 -0700 Subject: [PATCH] Fix for globals namespace conflicting with extension name --- IDEHelper/Compiler/BfCompiler.cpp | 20 ++++++++++---------- IDEHelper/Compiler/BfDefBuilder.cpp | 15 +++++++++++---- IDEHelper/Compiler/BfSystem.cpp | 5 +++++ 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/IDEHelper/Compiler/BfCompiler.cpp b/IDEHelper/Compiler/BfCompiler.cpp index ef52e9ea..6baa645d 100644 --- a/IDEHelper/Compiler/BfCompiler.cpp +++ b/IDEHelper/Compiler/BfCompiler.cpp @@ -2841,7 +2841,7 @@ void BfCompiler::UpdateRevisedTypes() if (nextTypeDef->mNextRevision != NULL) nextTypeDef = nextTypeDef->mNextRevision; if ((nextTypeDef->mIsCombinedPartial) || (nextTypeDef->mDefState == BfTypeDef::DefState_Deleted) || (nextTypeDef->mTypeCode == BfTypeCode_Extension) || - (typeDef->mFullName != nextTypeDef->mFullName) || (typeDef->mGenericParamDefs.size() != nextTypeDef->mGenericParamDefs.size())) + (typeDef->mFullNameEx != nextTypeDef->mFullNameEx) || (typeDef->mGenericParamDefs.size() != nextTypeDef->mGenericParamDefs.size())) { nextTypeDefItr.MoveToNextHashMatch(); continue; @@ -2935,7 +2935,7 @@ void BfCompiler::UpdateRevisedTypes() Array prevSoloExtensions; mSystem->mTypeDefs.CheckRehash(); - + // Process the typedefs one bucket at a time. When we are combining extensions or partials (globals) into a single definition then // we will be making multiple passes over the bucket that contains that name for (int bucketIdx = 0; bucketIdx < mSystem->mTypeDefs.mHashSize; bucketIdx++) @@ -2980,13 +2980,11 @@ void BfCompiler::UpdateRevisedTypes() { auto checkTypeDefEntry = mSystem->mTypeDefs.mHashHeads[bucketIdx]; while (checkTypeDefEntry != NULL) - { - auto checkTypeDef = checkTypeDefEntry->mValue; - if ((checkTypeDefEntry->mHash == outerTypeDefEntry->mHash) && - (checkTypeDef->NameEquals(outerTypeDef))) - { + { + // This clears the mPartialUsed flag for the whole bucket + auto checkTypeDef = checkTypeDefEntry->mValue; + if ((checkTypeDef->mIsPartial) || (checkTypeDef->mIsCombinedPartial)) checkTypeDef->mPartialUsed = false; - } checkTypeDefEntry = checkTypeDefEntry->mNext; } hadPartials = true; @@ -3018,7 +3016,7 @@ void BfCompiler::UpdateRevisedTypes() (checkTypeDef->mTypeCode == BfTypeCode_Object) || (checkTypeDef->mTypeCode == BfTypeCode_Enum) || (checkTypeDef->mTypeCode == BfTypeCode_Interface)) - { + { rootTypeDef = checkTypeDef; rootTypeDefEntry = checkTypeDefEntry; } @@ -3162,7 +3160,7 @@ void BfCompiler::UpdateRevisedTypes() continue; } } - + if (checkTypeDef->mTypeCode == BfTypeCode_Extension) { // This was an extension that was orphaned but now we're taking it back @@ -3230,6 +3228,8 @@ void BfCompiler::UpdateRevisedTypes() checkTypeDef->mIsPartial = true; checkTypeDef->mDefState = BfTypeDef::DefState_Defined; mSystem->AddToCompositePartial(mPassInstance, compositeTypeDef, checkTypeDef); + + BfLogSysM("AddToCompositePartial %p added to %p\n", checkTypeDef, compositeTypeDef); } mSystem->FinishCompositePartial(compositeTypeDef); diff --git a/IDEHelper/Compiler/BfDefBuilder.cpp b/IDEHelper/Compiler/BfDefBuilder.cpp index e193699e..620585f5 100644 --- a/IDEHelper/Compiler/BfDefBuilder.cpp +++ b/IDEHelper/Compiler/BfDefBuilder.cpp @@ -1448,7 +1448,7 @@ void BfDefBuilder::Visit(BfTypeDeclaration* typeDeclaration) mCurTypeDef->mIsPartial = true; isExtension = true; } - + BfAtomComposite fullName; if (!expandedName.IsEmpty()) fullName.Set(mCurTypeDef->mNamespace.mParts, mCurTypeDef->mNamespace.mSize, &expandedName[0], (int)expandedName.size()); @@ -1643,9 +1643,16 @@ void BfDefBuilder::Visit(BfTypeDeclaration* typeDeclaration) mCurTypeDef->mNameEx->mRefCount++; } if (!fullName.IsEmpty()) - { - mCurTypeDef->mFullNameEx = fullName; - mCurTypeDef->mFullNameEx.mParts[mCurTypeDef->mFullNameEx.mSize - 1] = mCurTypeDef->mNameEx; + { + if (mCurTypeDef->IsGlobalsContainer()) + { + mCurTypeDef->mFullNameEx.Set(fullName.mParts, fullName.mSize, &mCurTypeDef->mNameEx, 1); + } + else + { + mCurTypeDef->mFullNameEx = fullName; + mCurTypeDef->mFullNameEx.mParts[mCurTypeDef->mFullNameEx.mSize - 1] = mCurTypeDef->mNameEx; + } } if (auto defineBlock = BfNodeDynCast(typeDeclaration->mDefineNode)) diff --git a/IDEHelper/Compiler/BfSystem.cpp b/IDEHelper/Compiler/BfSystem.cpp index e25e857c..d7a94ebd 100644 --- a/IDEHelper/Compiler/BfSystem.cpp +++ b/IDEHelper/Compiler/BfSystem.cpp @@ -841,6 +841,8 @@ void BfTypeDef::ReportMemory(MemReporter* memReporter) bool BfTypeDef::NameEquals(BfTypeDef* otherTypeDef) { + if (mName != otherTypeDef->mName) + return false; // We can't just check mFullnames, because a namespace of "A" with a type named "B.C" would match // a namespace of "A.B" with a type named "C" if (mNamespace.mSize != otherTypeDef->mNamespace.mSize) @@ -2596,6 +2598,9 @@ void BfSystem::InjectNewRevision(BfTypeDef* typeDef) BF_ASSERT(typeDef->mNameEx == nextTypeDef->mNameEx); //typeDef->mNameEx = nextTypeDef->mNameEx; //typeDef->mFullName = nextTypeDef->mFullName; + + BF_ASSERT(typeDef->mFullNameEx == nextTypeDef->mFullNameEx); + typeDef->mProtection = nextTypeDef->mProtection; if ((typeDef->mTypeCode != BfTypeCode_Extension) && (!typeDef->mIsCombinedPartial)) BF_ASSERT(nextTypeDef->mTypeCode != BfTypeCode_Extension);