diff --git a/IDEHelper/Compiler/BfCompiler.cpp b/IDEHelper/Compiler/BfCompiler.cpp index a15e4eb9..d36e854a 100644 --- a/IDEHelper/Compiler/BfCompiler.cpp +++ b/IDEHelper/Compiler/BfCompiler.cpp @@ -2936,6 +2936,19 @@ void BfCompiler::UpdateRevisedTypes() mSystem->mTypeDefs.CheckRehash(); + Array corlibProjects; + // + { + BfAtomComposite objectName; + mSystem->ParseAtomComposite("System.Object", objectName); + for (auto itr = mSystem->mTypeDefs.TryGet(objectName); itr != mSystem->mTypeDefs.end(); ++itr) + { + BfTypeDef* typeDef = *itr; + if ((typeDef->mFullName == objectName) && (typeDef->mTypeCode == BfTypeCode_Object)) + corlibProjects.Add(typeDef->mProject); + } + } + // 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++) @@ -2965,6 +2978,7 @@ void BfCompiler::UpdateRevisedTypes() BfTypeDefMap::Entry* rootTypeDefEntry = NULL; BfTypeDef* rootTypeDef = NULL; BfTypeDef* compositeTypeDef = NULL; + BfProject* compositeProject = NULL; auto latestOuterTypeDef = outerTypeDef->GetLatest(); if ((outerTypeDef->mTypeCode == BfTypeCode_Extension) && (!outerTypeDef->mIsPartial)) @@ -3019,6 +3033,7 @@ void BfCompiler::UpdateRevisedTypes() { rootTypeDef = checkTypeDef; rootTypeDefEntry = checkTypeDefEntry; + compositeProject = rootTypeDef->mProject; } checkTypeDefEntry = checkTypeDefEntry->mNext; @@ -3032,8 +3047,9 @@ void BfCompiler::UpdateRevisedTypes() else if ((outerTypeDef->mIsExplicitPartial) && (!outerTypeDef->mPartialUsed)) { // For explicit partials there is no 'root type' so we want to select any partial in the 'innermost' project - rootTypeDef = outerTypeDef; + rootTypeDef = outerTypeDef; rootTypeDefEntry = outerTypeDefEntry; + compositeProject = rootTypeDef->mProject; // Find composite type, there is no explicit position for this auto checkTypeDefEntry = mSystem->mTypeDefs.mHashHeads[bucketIdx]; @@ -3054,8 +3070,29 @@ void BfCompiler::UpdateRevisedTypes() if (!checkTypeDef->mIsCombinedPartial) { // Select the innermost project for the composite project def - if ((rootTypeDef->mProject != checkTypeDef->mProject) && (rootTypeDef->mProject->ContainsReference(checkTypeDef->mProject))) - rootTypeDef = checkTypeDef; + if (compositeProject != checkTypeDef->mProject) + { + if (checkTypeDef->mProject->ContainsReference(compositeProject)) + { + // Fine, already contains it + } + else if (compositeProject->ContainsReference(checkTypeDef->mProject)) + { + rootTypeDef = checkTypeDef; + rootTypeDefEntry = checkTypeDefEntry; + compositeProject = rootTypeDef->mProject; + } + else + { + // Try 'corlib' + for (auto corlibProject : corlibProjects) + { + if ((rootTypeDef->mProject->ContainsReference(corlibProject)) && + (checkTypeDef->mProject->ContainsReference(corlibProject))) + compositeProject = corlibProject; + } + } + } checkTypeDefEntry = checkTypeDefEntry->mNext; continue; @@ -3102,7 +3139,7 @@ void BfCompiler::UpdateRevisedTypes() { compositeTypeDef = new BfTypeDef(); compositeTypeDef->mSystem = rootTypeDef->mSystem; - compositeTypeDef->mProject = rootTypeDef->mProject; + compositeTypeDef->mProject = compositeProject; compositeTypeDef->mName = rootTypeDef->mName; compositeTypeDef->mName->mRefCount++; mSystem->TrackName(compositeTypeDef); @@ -3156,7 +3193,7 @@ void BfCompiler::UpdateRevisedTypes() { auto checkTypeDef = checkTypeDefEntry->mValue; - bool isValidProject = checkTypeDef->mProject->ContainsReference(rootTypeDef->mProject); + bool isValidProject = checkTypeDef->mProject->ContainsReference(compositeProject); if (checkTypeDef != rootTypeDef) { diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 61e5aad2..f6fc50b4 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -3233,7 +3233,7 @@ void BfModule::PopulateGlobalContainersList(const BfGlobalLookup& globalLookup) if ((typeDef->mFullName == findStr) && (typeDef->mIsCombinedPartial) && (typeDef->IsGlobalsContainer())) { if (typeDef->mProject->ContainsReference(typeDef->mProject)) - { + { BfGlobalContainerEntry globalEntry; globalEntry.mTypeDef = typeDef; globalEntry.mTypeInst = NULL; @@ -4574,7 +4574,7 @@ BfIRValue BfModule::CreateTypeDataRef(BfType* type) else { typeDataName += "sBfTypeData."; - BfMangler::Mangle(typeDataName, mCompiler->GetMangleKind(), type, this); + BfMangler::Mangle(typeDataName, mCompiler->GetMangleKind(), type, this); } BfLogSysM("Creating TypeData %s\n", typeDataName.c_str()); @@ -4684,7 +4684,7 @@ BfIRValue BfModule::CreateTypeData(BfType* type, Dictionary& usedStrin typeDataName += "sBfTypeData."; BfMangler::Mangle(typeDataName, mCompiler->GetMangleKind(), type, mContext->mScratchModule); } - + int typeCode = BfTypeCode_None; if (typeInstance != NULL) @@ -11955,8 +11955,7 @@ BfModuleMethodInstance BfModule::GetMethodInstance(BfTypeInstance* typeInst, BfM { if (methodInstance->mMethodProcessRequest != NULL) { - // Disconnect method process request - BF_ASSERT(methodInstance->mMethodProcessRequest->mFromModule == mContext->mUnreifiedModule); + // Disconnect method process request methodInstance->mMethodProcessRequest->mMethodInstance = NULL; methodInstance->mMethodProcessRequest = NULL; }