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

Properly detecting circular data references in sized arrays

This commit is contained in:
Brian Fiete 2020-07-19 06:13:03 -07:00
parent 87ca2f71af
commit a457ebcbc5

View file

@ -991,11 +991,26 @@ bool BfModule::PopulateType(BfType* resolvedTypeRef, BfPopulateType populateType
{ {
resolvedTypeRef->mRevision = mRevision; resolvedTypeRef->mRevision = mRevision;
bool typeFailed = false;
BfSizedArrayType* arrayType = (BfSizedArrayType*)resolvedTypeRef; BfSizedArrayType* arrayType = (BfSizedArrayType*)resolvedTypeRef;
auto elementType = arrayType->mElementType; auto elementType = arrayType->mElementType;
if (elementType->IsValueType()) if (elementType->IsValueType())
{ {
PopulateType(arrayType->mElementType, BfPopulateType_Data); resolvedTypeRef->mDefineState = BfTypeDefineState_ResolvingBaseType;
BfTypeState typeState(mCurTypeInstance, mContext->mCurTypeState);
typeState.mPopulateType = populateType;
SetAndRestoreValue<BfTypeState*> prevTypeState(mContext->mCurTypeState, &typeState);
if (!CheckCircularDataError())
{
PopulateType(arrayType->mElementType, BfPopulateType_Data);
}
else
{
typeFailed = true;
PopulateType(arrayType->mElementType, BfPopulateType_Identity);
}
resolvedTypeRef->mDefineState = arrayType->mElementType->mDefineState; resolvedTypeRef->mDefineState = arrayType->mElementType->mDefineState;
AddDependency(elementType, resolvedTypeRef, BfDependencyMap::DependencyFlag_ValueTypeMemberData); AddDependency(elementType, resolvedTypeRef, BfDependencyMap::DependencyFlag_ValueTypeMemberData);
} }
@ -1016,7 +1031,8 @@ bool BfModule::PopulateType(BfType* resolvedTypeRef, BfPopulateType populateType
arrayType->mAlign = 1; arrayType->mAlign = 1;
} }
arrayType->mWantsGCMarking = elementType->WantsGCMarking(); if (!typeFailed)
arrayType->mWantsGCMarking = elementType->WantsGCMarking();
resolvedTypeRef->mDefineState = BfTypeDefineState_DefinedAndMethodsSlotted; resolvedTypeRef->mDefineState = BfTypeDefineState_DefinedAndMethodsSlotted;
resolvedTypeRef->mRebuildFlags = BfTypeRebuildFlag_None; resolvedTypeRef->mRebuildFlags = BfTypeRebuildFlag_None;