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

Fixed sized array const-lookup dependency issue

This commit is contained in:
Brian Fiete 2021-10-13 12:09:12 -07:00
parent 1e3d0308bf
commit 8a32ce5a69
6 changed files with 18 additions and 4 deletions

View file

@ -1156,9 +1156,11 @@ void BfContext::TypeDataChanged(BfDependedType* dType, bool isNonStaticDataChang
{
bool hadChange = false;
if ((dependencyFlags & BfDependencyMap::DependencyFlag_DerivedFrom) ||
(dependencyFlags & BfDependencyMap::DependencyFlag_ValueTypeMemberData) ||
(dependencyFlags & BfDependencyMap::DependencyFlag_NameReference))
if ((dependencyFlags &
(BfDependencyMap::DependencyFlag_DerivedFrom |
BfDependencyMap::DependencyFlag_ValueTypeMemberData) |
BfDependencyMap::DependencyFlag_NameReference |
BfDependencyMap::DependencyFlag_ValueTypeSizeDep) != 0)
{
hadChange = true;
}

View file

@ -131,6 +131,7 @@ public:
ResolveKind_UnionInnerType,
ResolveKind_LocalVariable,
ResolveKind_Attributes,
ResolveKind_FieldType,
ResolveKind_ConstField
};

View file

@ -4422,7 +4422,7 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar
}
mModule->PopulateType(resolvedFieldType, BfPopulateType_Data);
mModule->AddDependency(curCheckType, mModule->mCurTypeInstance, BfDependencyMap::DependencyFlag_ReadFields);
mModule->AddDependency(curCheckType, mModule->mCurTypeInstance, field->mIsConst ? BfDependencyMap::DependencyFlag_ConstValue : BfDependencyMap::DependencyFlag_ReadFields);
if (fieldInstance->mHadConstEval)
{
mModule->AddDependency(curCheckType, mModule->mCurTypeInstance, BfDependencyMap::DependencyFlag_ConstEvalConstField);

View file

@ -3365,6 +3365,12 @@ void BfModule::AddDependency(BfType* usedType, BfType* userType, BfDependencyMap
if (usedType == userType)
return;
if (((flags & BfDependencyMap::DependencyFlag_ConstValue) != 0) && (mContext->mCurTypeState != NULL) && (mContext->mCurTypeState->mResolveKind == BfTypeState::ResolveKind_FieldType))
{
// This can be an `int32[UsedType.cVal]` type reference
flags = (BfDependencyMap::DependencyFlags)(flags | BfDependencyMap::DependencyFlag_ValueTypeSizeDep);
}
if ((mCurMethodInstance != NULL) && (mCurMethodInstance->mIsAutocompleteMethod))
{
if (userType->IsMethodRef())

View file

@ -2597,6 +2597,8 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
DoTypeInstanceMethodProcessing(typeInstance);
return true;
}
if (typeInstance->mDefineState == BfTypeDefineState_DefinedAndMethodsSlotted)
return true;
return false;
};
@ -3641,6 +3643,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
continue;
SetAndRestoreValue<BfFieldDef*> prevTypeRef(mContext->mCurTypeState->mCurFieldDef, field);
SetAndRestoreValue<BfTypeState::ResolveKind> prevResolveKind(mContext->mCurTypeState->mResolveKind, BfTypeState::ResolveKind_FieldType);
BfType* resolvedFieldType = NULL;
@ -4427,6 +4430,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
CheckAddFailType();
BF_ASSERT_REL(typeInstance->mDefineState != BfTypeDefineState_DefinedAndMethodsSlotting);
BF_ASSERT_REL(typeInstance->mDefineState != BfTypeDefineState_DefinedAndMethodsSlotted);
BfLogSysM("Setting mNeedsMethodProcessing=true on %p\n", typeInstance);
typeInstance->mNeedsMethodProcessing = true;

View file

@ -115,6 +115,7 @@ public:
DependencyFlag_NameReference = 0x1000000,
DependencyFlag_VirtualCall = 0x2000000,
DependencyFlag_WeakReference = 0x4000000, // Keeps alive but won't rebuild
DependencyFlag_ValueTypeSizeDep = 0x8000000, // IE: int32[DepType.cVal]
DependencyFlag_DependentUsageMask = ~(DependencyFlag_UnspecializedType | DependencyFlag_MethodGenericArg | DependencyFlag_GenericArgRef)
};