mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-10 04:22:20 +02:00
Appended field type population issue fixed, circular ref handled
This commit is contained in:
parent
f326df71d9
commit
7278e090a1
2 changed files with 14 additions and 4 deletions
|
@ -3781,7 +3781,7 @@ void BfIRBuilder::CreateTypeDefinition_Data(BfModule* populateModule, BfTypeInst
|
||||||
{
|
{
|
||||||
auto fieldTypeInst = fieldInstance->mResolvedType->ToTypeInstance();
|
auto fieldTypeInst = fieldInstance->mResolvedType->ToTypeInstance();
|
||||||
|
|
||||||
if (fieldInstance->mDataSize != fieldTypeInst->mInstSize)
|
if (fieldInstance->mDataSize > fieldTypeInst->mInstSize)
|
||||||
{
|
{
|
||||||
SizedArray<BfIRType, 2> types;
|
SizedArray<BfIRType, 2> types;
|
||||||
types.push_back(MapTypeInst(fieldTypeInst));
|
types.push_back(MapTypeInst(fieldTypeInst));
|
||||||
|
@ -3789,7 +3789,7 @@ void BfIRBuilder::CreateTypeDefinition_Data(BfModule* populateModule, BfTypeInst
|
||||||
resolvedFieldIRType = CreateStructType(types);
|
resolvedFieldIRType = CreateStructType(types);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
resolvedFieldIRType = MapTypeInst(fieldTypeInst);
|
resolvedFieldIRType = MapTypeInst(fieldTypeInst);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fieldInstance->mDataOffset > dataPos)
|
if (fieldInstance->mDataOffset > dataPos)
|
||||||
|
|
|
@ -5137,9 +5137,18 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
|
||||||
SetAndRestoreValue<BfFieldDef*> prevTypeRef(mContext->mCurTypeState->mCurFieldDef, fieldDef);
|
SetAndRestoreValue<BfFieldDef*> prevTypeRef(mContext->mCurTypeState->mCurFieldDef, fieldDef);
|
||||||
SetAndRestoreValue<BfTypeState::ResolveKind> prevResolveKind(mContext->mCurTypeState->mResolveKind, BfTypeState::ResolveKind_FieldType);
|
SetAndRestoreValue<BfTypeState::ResolveKind> prevResolveKind(mContext->mCurTypeState->mResolveKind, BfTypeState::ResolveKind_FieldType);
|
||||||
|
|
||||||
|
PopulateType(resolvedFieldType, BfPopulateType_Data);
|
||||||
|
|
||||||
auto fieldTypeInst = resolvedFieldType->ToTypeInstance();
|
auto fieldTypeInst = resolvedFieldType->ToTypeInstance();
|
||||||
dataSize = fieldTypeInst->mInstSize;
|
dataSize = BF_MAX(fieldTypeInst->mInstSize, 0);
|
||||||
alignSize = fieldTypeInst->mInstAlign;
|
alignSize = BF_MAX(fieldTypeInst->mInstAlign, 1);
|
||||||
|
|
||||||
|
if (fieldTypeInst->mTypeFailed)
|
||||||
|
{
|
||||||
|
TypeFailed(fieldTypeInst);
|
||||||
|
fieldInstance->mResolvedType = GetPrimitiveType(BfTypeCode_Var);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if ((typeInstance != NULL) && (fieldTypeInst->mTypeDef->mIsAbstract))
|
if ((typeInstance != NULL) && (fieldTypeInst->mTypeDef->mIsAbstract))
|
||||||
{
|
{
|
||||||
|
@ -5208,6 +5217,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
|
||||||
Fail("Append fields must be classes", nameRefNode, true);
|
Fail("Append fields must be classes", nameRefNode, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BF_ASSERT(dataSize >= 0);
|
||||||
fieldInstance->mDataSize = dataSize;
|
fieldInstance->mDataSize = dataSize;
|
||||||
if (!isUnion)
|
if (!isUnion)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue