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:
parent
1cd198cea9
commit
434a7406de
22 changed files with 394 additions and 86 deletions
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue