1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-09 03:52:19 +02:00

Fixed globals project selection for typedef

This commit is contained in:
Brian Fiete 2020-07-16 16:02:54 -07:00
parent 328f489324
commit 7f31b29607
2 changed files with 46 additions and 10 deletions

View file

@ -2936,6 +2936,19 @@ void BfCompiler::UpdateRevisedTypes()
mSystem->mTypeDefs.CheckRehash();
Array<BfProject*> 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;
@ -3034,6 +3049,7 @@ void BfCompiler::UpdateRevisedTypes()
// For explicit partials there is no 'root type' so we want to select any partial in the 'innermost' project
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)))
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)
{

View file

@ -11956,7 +11956,6 @@ BfModuleMethodInstance BfModule::GetMethodInstance(BfTypeInstance* typeInst, BfM
if (methodInstance->mMethodProcessRequest != NULL)
{
// Disconnect method process request
BF_ASSERT(methodInstance->mMethodProcessRequest->mFromModule == mContext->mUnreifiedModule);
methodInstance->mMethodProcessRequest->mMethodInstance = NULL;
methodInstance->mMethodProcessRequest = NULL;
}