1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 12:32:20 +02:00

Fixed some comptime dependency rebuilding issues with aliases/extensions

This commit is contained in:
Brian Fiete 2022-02-16 18:28:23 -05:00
parent 1cd198cea9
commit 434a7406de
22 changed files with 394 additions and 86 deletions

View file

@ -77,7 +77,8 @@ BfContext::BfContext(BfCompiler* compiler) :
mValueTypeDeinitSentinel = (BfMethodInstance*)1;
mCurStringObjectPoolId = 0;
mCurStringObjectPoolId = 0;
mHasReifiedQueuedRebuildTypes = false;
}
void BfReportMemory();
@ -945,6 +946,9 @@ void BfContext::RebuildType(BfType* type, bool deleteOnDemandTypes, bool rebuild
return;
}
if (typeInst->mIsReified)
mHasReifiedQueuedRebuildTypes = true;
typeInst->mRebuildFlags = (BfTypeRebuildFlags)(typeInst->mRebuildFlags & ~BfTypeRebuildFlag_AddedToWorkList);
bool addToWorkList = true;
@ -1131,8 +1135,8 @@ void BfContext::RebuildType(BfType* type, bool deleteOnDemandTypes, bool rebuild
genericTypeInstance->mGenericTypeInfo->mGenericParams.Clear();
genericTypeInstance->mGenericTypeInfo->mValidatedGenericConstraints = false;
genericTypeInstance->mGenericTypeInfo->mHadValidateErrors = false;
delete genericTypeInstance->mGenericTypeInfo->mGenericExtensionInfo;
genericTypeInstance->mGenericTypeInfo->mGenericExtensionInfo = NULL;
if (genericTypeInstance->mGenericTypeInfo->mGenericExtensionInfo != NULL)
genericTypeInstance->mGenericTypeInfo->mGenericExtensionInfo->Clear();
genericTypeInstance->mGenericTypeInfo->mProjectsReferenced.Clear();
}
@ -1182,6 +1186,22 @@ void BfContext::RebuildDependentTypes(BfDependedType* dType)
TypeMethodSignaturesChanged(typeInst);
}
void BfContext::RebuildDependentTypes_MidCompile(BfDependedType* dType, const String& reason)
{
dType->mRebuildFlags = (BfTypeRebuildFlags)(dType->mRebuildFlags | BfTypeRebuildFlag_ChangedMidCompile);
int prevDeletedTypes = mCompiler->mStats.mTypesDeleted;
if (mCompiler->mIsResolveOnly)
mCompiler->mNeedsFullRefresh = true;
BfLogSysM("Rebuilding dependent types MidCompile Type:%p Reason:%s\n", dType, reason.c_str());
RebuildDependentTypes(dType);
if (mCompiler->mStats.mTypesDeleted != prevDeletedTypes)
{
BfLogSysM("Rebuilding dependent types MidCompile Type:%p Reason:%s - updating after deleting types\n", dType, reason.c_str());
UpdateAfterDeletingTypes();
}
}
// Dependencies cascade as such:
// DerivedFrom / StructMemberData: these change the layout of memory for the dependent classes,
// so not only do the dependent classes need to be rebuild, but any other classes relying on those derived classes
@ -1254,7 +1274,7 @@ void BfContext::TypeDataChanged(BfDependedType* dType, bool isNonStaticDataChang
}
if (dependentType->mRevision != mCompiler->mRevision)
{
{
// We need to include DependencyFlag_ParamOrReturnValue because it could be a struct that changes its splatting ability
// We can't ONLY check against structs, though, because a type could change from a class to a struct
if (dependencyFlags &
@ -1264,6 +1284,12 @@ void BfContext::TypeDataChanged(BfDependedType* dType, bool isNonStaticDataChang
{
RebuildType(dependentType);
}
else if (((dependencyFlags & BfDependencyMap::DependencyFlag_NameReference) != 0) &&
((dType->mRebuildFlags & BfTypeRebuildFlag_ChangedMidCompile) != 0) &&
(dType->IsTypeAlias()))
{
RebuildType(dependentType);
}
}
}
else
@ -1276,7 +1302,7 @@ void BfContext::TypeDataChanged(BfDependedType* dType, bool isNonStaticDataChang
}
}
if (dType->mRevision != mCompiler->mRevision)
if (dType->mRevision != mCompiler->mRevision)
RebuildType(dType);
}