1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 19:48: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

@ -184,6 +184,21 @@ bool BfModule::FinishGenericParams(BfType* resolvedTypeRef)
if (!typeDef->mPartials.empty())
{
BitSet prevConstraintsPassedSet;
if (!genericTypeInst->IsUnspecializedType())
{
if (genericTypeInst->mGenericTypeInfo->mGenericExtensionInfo != NULL)
{
auto genericExtensionInfo = genericTypeInst->mGenericTypeInfo->mGenericExtensionInfo;
prevConstraintsPassedSet = genericExtensionInfo->mConstraintsPassedSet;
genericExtensionInfo->mConstraintsPassedSet.Clear();
}
}
int extensionCount = 0;
BfLogSysM("BfModule::FinishGenericParams %p\n", resolvedTypeRef);
for (auto partialTypeDef : typeDef->mPartials)
{
if (!partialTypeDef->IsExtension())
@ -222,6 +237,13 @@ bool BfModule::FinishGenericParams(BfType* resolvedTypeRef)
auto genericExEntry = BuildGenericExtensionInfo(genericTypeInst, partialTypeDef);
if (genericExEntry == NULL)
continue;
auto genericExtensionInfo = genericTypeInst->mGenericTypeInfo->mGenericExtensionInfo;
if (extensionCount == 0)
genericExtensionInfo->mConstraintsPassedSet.Resize(typeDef->mPartials.mSize);
extensionCount++;
if (!genericTypeInst->IsUnspecializedType())
{
SetAndRestoreValue<bool> prevIgnoreErrors(mIgnoreErrors, true);
@ -249,7 +271,18 @@ bool BfModule::FinishGenericParams(BfType* resolvedTypeRef)
}
}
}
}
if (genericExEntry->mConstraintsPassed)
genericExtensionInfo->mConstraintsPassedSet.Set(partialTypeDef->mPartialIdx);
BfLogSysM("BfModule::FinishGenericParams %p partialTypeDef:%p passed:%d\n", resolvedTypeRef, partialTypeDef, genericExEntry->mConstraintsPassed);
}
}
auto genericExtensionInfo = genericTypeInst->mGenericTypeInfo->mGenericExtensionInfo;
if ((extensionCount > 0) && (!prevConstraintsPassedSet.IsEmpty()) && (genericExtensionInfo->mConstraintsPassedSet != prevConstraintsPassedSet))
{
mContext->RebuildDependentTypes_MidCompile(genericTypeInst, "mConstraintsPassedSet changed");
}
}
else
@ -1224,7 +1257,8 @@ void BfModule::PopulateType(BfType* resolvedTypeRef, BfPopulateType populateType
if (resolvedTypeRef->IsTypeAlias())
{
// Always populate these all the way
populateType = BfPopulateType_Data;
if (populateType != BfPopulateType_IdentityNoRemapAlias)
populateType = BfPopulateType_Data;
}
if (resolvedTypeRef->IsSizedArray())
@ -2730,7 +2764,7 @@ void BfModule::DoPopulateType_SetGenericDependencies(BfTypeInstance* genericType
}
}
void BfModule::DoPopulateType_TypeAlias(BfTypeInstance* typeAlias)
void BfModule::DoPopulateType_TypeAlias(BfTypeAliasType* typeAlias)
{
SetAndRestoreValue<BfTypeInstance*> prevTypeInstance(mCurTypeInstance, typeAlias);
SetAndRestoreValue<BfMethodInstance*> prevMethodInstance(mCurMethodInstance, NULL);
@ -2766,6 +2800,8 @@ void BfModule::DoPopulateType_TypeAlias(BfTypeInstance* typeAlias)
aliasToType = ResolveTypeRef(typeAliasDecl->mAliasToType, BfPopulateType_IdentityNoRemapAlias);
}
BfLogSysM("DoPopulateType_TypeAlias %p %s = %p %s\n", typeAlias, TypeToString(typeAlias).c_str(), aliasToType, (aliasToType != NULL) ? TypeToString(aliasToType).c_str() : NULL);
if (aliasToType != NULL)
{
if (aliasToType->IsConstExprValue())
@ -2776,16 +2812,19 @@ void BfModule::DoPopulateType_TypeAlias(BfTypeInstance* typeAlias)
}
if (aliasToType != NULL)
{
{
AddDependency(aliasToType, typeAlias, BfDependencyMap::DependencyFlag_DerivedFrom);
}
else
mContext->mFailTypes.Add(typeAlias);
if (typeAlias->mTypeFailed)
aliasToType = NULL;
aliasToType = NULL;
((BfTypeAliasType*)typeAlias)->mAliasToType = aliasToType;
if ((typeAlias->mAliasToType != NULL) && (typeAlias->mAliasToType != aliasToType) && (!typeAlias->mDependencyMap.IsEmpty()))
mContext->RebuildDependentTypes_MidCompile(typeAlias, "type alias remapped");
typeAlias->mAliasToType = aliasToType;
if (aliasToType != NULL)
{
@ -3188,9 +3227,10 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
if (resolvedTypeRef->IsTypeAlias())
{
prevTypeState.Restore();
DoPopulateType_TypeAlias(typeInstance);
DoPopulateType_TypeAlias((BfTypeAliasType*)typeInstance);
typeInstance->mTypeIncomplete = false;
resolvedTypeRef->mRebuildFlags = BfTypeRebuildFlag_None;
resolvedTypeRef->mDefineState = BfTypeDefineState_DefinedAndMethodsSlotted;
return;
}
@ -4453,19 +4493,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
if (!typeInstance->mCeTypeInfo->mNext->mFailed)
{
if ((typeInstance->mCeTypeInfo->mHash != typeInstance->mCeTypeInfo->mNext->mHash) && (!typeInstance->mCeTypeInfo->mHash.IsZero()))
{
int prevDeletedTypes = mCompiler->mStats.mTypesDeleted;
if (mCompiler->mIsResolveOnly)
mCompiler->mNeedsFullRefresh = true;
BfLogSysM("Type %p hash changed, rebuilding dependent types\n", typeInstance);
mContext->RebuildDependentTypes(typeInstance);
if (mCompiler->mStats.mTypesDeleted != prevDeletedTypes)
{
BfLogSysM("Type %p hash changed, rebuilding dependent types - updating after deleting types\n", typeInstance);
mContext->UpdateAfterDeletingTypes();
}
}
mContext->RebuildDependentTypes_MidCompile(typeInstance, "comptime hash changed");
typeInstance->mCeTypeInfo->mOnCompileMap = typeInstance->mCeTypeInfo->mNext->mOnCompileMap;
typeInstance->mCeTypeInfo->mTypeIFaceMap = typeInstance->mCeTypeInfo->mNext->mTypeIFaceMap;
typeInstance->mCeTypeInfo->mHash = typeInstance->mCeTypeInfo->mNext->mHash;
@ -8922,9 +8950,11 @@ BfType* BfModule::ResolveTypeResult(BfTypeReference* typeRef, BfType* resolvedTy
{
if (mCurTypeInstance != NULL)
AddDependency(resolvedTypeRef, mCurTypeInstance, BfDependencyMap::DependencyFlag_NameReference);
if (resolvedTypeRef->mDefineState == BfTypeDefineState_Undefined)
PopulateType(resolvedTypeRef);
if ((typeInstance->mCustomAttributes != NULL) && (!typeRef->IsTemporary()))
CheckErrorAttributes(typeInstance, NULL, typeInstance->mCustomAttributes, typeRef);
resolvedTypeRef = resolvedTypeRef->GetUnderlyingType();
CheckErrorAttributes(typeInstance, NULL, typeInstance->mCustomAttributes, typeRef);
resolvedTypeRef = resolvedTypeRef->GetUnderlyingType();
if (resolvedTypeRef != NULL)
typeInstance = resolvedTypeRef->ToTypeInstance();
else
@ -11088,7 +11118,7 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
#ifdef _DEBUG
if (BfResolvedTypeSet::Hash(refType, &lookupCtx) != resolvedEntry->mHash)
{
int refHash = BfResolvedTypeSet::Hash(typeRef, &lookupCtx);
int refHash = BfResolvedTypeSet::Hash(typeRef, &lookupCtx, BfResolvedTypeSet::BfHashFlag_AllowRef);
int typeHash = BfResolvedTypeSet::Hash(refType, &lookupCtx);
BF_ASSERT(refHash == typeHash);
}