1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-09 12:02:21 +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(); 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 // 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 // we will be making multiple passes over the bucket that contains that name
for (int bucketIdx = 0; bucketIdx < mSystem->mTypeDefs.mHashSize; bucketIdx++) for (int bucketIdx = 0; bucketIdx < mSystem->mTypeDefs.mHashSize; bucketIdx++)
@ -2965,6 +2978,7 @@ void BfCompiler::UpdateRevisedTypes()
BfTypeDefMap::Entry* rootTypeDefEntry = NULL; BfTypeDefMap::Entry* rootTypeDefEntry = NULL;
BfTypeDef* rootTypeDef = NULL; BfTypeDef* rootTypeDef = NULL;
BfTypeDef* compositeTypeDef = NULL; BfTypeDef* compositeTypeDef = NULL;
BfProject* compositeProject = NULL;
auto latestOuterTypeDef = outerTypeDef->GetLatest(); auto latestOuterTypeDef = outerTypeDef->GetLatest();
if ((outerTypeDef->mTypeCode == BfTypeCode_Extension) && (!outerTypeDef->mIsPartial)) if ((outerTypeDef->mTypeCode == BfTypeCode_Extension) && (!outerTypeDef->mIsPartial))
@ -3019,6 +3033,7 @@ void BfCompiler::UpdateRevisedTypes()
{ {
rootTypeDef = checkTypeDef; rootTypeDef = checkTypeDef;
rootTypeDefEntry = checkTypeDefEntry; rootTypeDefEntry = checkTypeDefEntry;
compositeProject = rootTypeDef->mProject;
} }
checkTypeDefEntry = checkTypeDefEntry->mNext; 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 // 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; rootTypeDefEntry = outerTypeDefEntry;
compositeProject = rootTypeDef->mProject;
// Find composite type, there is no explicit position for this // Find composite type, there is no explicit position for this
auto checkTypeDefEntry = mSystem->mTypeDefs.mHashHeads[bucketIdx]; auto checkTypeDefEntry = mSystem->mTypeDefs.mHashHeads[bucketIdx];
@ -3054,8 +3070,29 @@ void BfCompiler::UpdateRevisedTypes()
if (!checkTypeDef->mIsCombinedPartial) if (!checkTypeDef->mIsCombinedPartial)
{ {
// Select the innermost project for the composite project def // 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; 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; checkTypeDefEntry = checkTypeDefEntry->mNext;
continue; continue;
@ -3102,7 +3139,7 @@ void BfCompiler::UpdateRevisedTypes()
{ {
compositeTypeDef = new BfTypeDef(); compositeTypeDef = new BfTypeDef();
compositeTypeDef->mSystem = rootTypeDef->mSystem; compositeTypeDef->mSystem = rootTypeDef->mSystem;
compositeTypeDef->mProject = rootTypeDef->mProject; compositeTypeDef->mProject = compositeProject;
compositeTypeDef->mName = rootTypeDef->mName; compositeTypeDef->mName = rootTypeDef->mName;
compositeTypeDef->mName->mRefCount++; compositeTypeDef->mName->mRefCount++;
mSystem->TrackName(compositeTypeDef); mSystem->TrackName(compositeTypeDef);
@ -3156,7 +3193,7 @@ void BfCompiler::UpdateRevisedTypes()
{ {
auto checkTypeDef = checkTypeDefEntry->mValue; auto checkTypeDef = checkTypeDefEntry->mValue;
bool isValidProject = checkTypeDef->mProject->ContainsReference(rootTypeDef->mProject); bool isValidProject = checkTypeDef->mProject->ContainsReference(compositeProject);
if (checkTypeDef != rootTypeDef) if (checkTypeDef != rootTypeDef)
{ {

View file

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