mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-12 05:14:10 +02:00
Fixed sized array size calculation with object elements during rebuild
This commit is contained in:
parent
b50d2becfc
commit
cb177bc759
1 changed files with 18 additions and 4 deletions
|
@ -1368,6 +1368,9 @@ void BfModule::PopulateType(BfType* resolvedTypeRef, BfPopulateType populateType
|
||||||
|
|
||||||
BfSizedArrayType* arrayType = (BfSizedArrayType*)resolvedTypeRef;
|
BfSizedArrayType* arrayType = (BfSizedArrayType*)resolvedTypeRef;
|
||||||
auto elementType = arrayType->mElementType;
|
auto elementType = arrayType->mElementType;
|
||||||
|
int elementSize = 0;
|
||||||
|
int elementAlign = 0;
|
||||||
|
int elementStride = 0;
|
||||||
if (elementType->IsValueType())
|
if (elementType->IsValueType())
|
||||||
{
|
{
|
||||||
resolvedTypeRef->mDefineState = BfTypeDefineState_ResolvingBaseType;
|
resolvedTypeRef->mDefineState = BfTypeDefineState_ResolvingBaseType;
|
||||||
|
@ -1387,26 +1390,32 @@ void BfModule::PopulateType(BfType* resolvedTypeRef, BfPopulateType populateType
|
||||||
}
|
}
|
||||||
resolvedTypeRef->mDefineState = arrayType->mElementType->mDefineState;
|
resolvedTypeRef->mDefineState = arrayType->mElementType->mDefineState;
|
||||||
AddDependency(elementType, resolvedTypeRef, BfDependencyMap::DependencyFlag_ValueTypeMemberData);
|
AddDependency(elementType, resolvedTypeRef, BfDependencyMap::DependencyFlag_ValueTypeMemberData);
|
||||||
|
elementSize = arrayType->mElementType->mSize;
|
||||||
|
elementAlign = arrayType->mElementType->mAlign;
|
||||||
|
elementStride = arrayType->mElementType->GetStride();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
PopulateType(arrayType->mElementType, BfPopulateType_Identity);
|
PopulateType(arrayType->mElementType, BfPopulateType_Identity);
|
||||||
resolvedTypeRef->mDefineState = BfTypeDefineState_Defined;
|
resolvedTypeRef->mDefineState = BfTypeDefineState_Defined;
|
||||||
AddDependency(elementType, resolvedTypeRef, BfDependencyMap::DependencyFlag_PtrMemberData);
|
AddDependency(elementType, resolvedTypeRef, BfDependencyMap::DependencyFlag_PtrMemberData);
|
||||||
|
elementSize = mSystem->mPtrSize;
|
||||||
|
elementAlign = mSystem->mPtrSize;
|
||||||
|
elementStride = mSystem->mPtrSize;
|
||||||
}
|
}
|
||||||
if (arrayType->mElementCount > 0)
|
if (arrayType->mElementCount > 0)
|
||||||
{
|
{
|
||||||
arrayType->mSize = (int)(arrayType->mElementType->GetStride() * arrayType->mElementCount);
|
arrayType->mSize = (int)(elementStride * arrayType->mElementCount);
|
||||||
if (arrayType->mElementType->mSize > 0)
|
if (elementSize > 0)
|
||||||
{
|
{
|
||||||
int64 maxElements = 0x7FFFFFFF / arrayType->mElementType->GetStride();
|
int64 maxElements = 0x7FFFFFFF / elementStride;
|
||||||
if (arrayType->mElementCount > maxElements)
|
if (arrayType->mElementCount > maxElements)
|
||||||
{
|
{
|
||||||
Fail(StrFormat("Array size overflow: %s", TypeToString(arrayType).c_str()));
|
Fail(StrFormat("Array size overflow: %s", TypeToString(arrayType).c_str()));
|
||||||
arrayType->mSize = 0x7FFFFFFF;
|
arrayType->mSize = 0x7FFFFFFF;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
arrayType->mAlign = std::max((int32)arrayType->mElementType->mAlign, 1);
|
arrayType->mAlign = std::max(elementAlign, 1);
|
||||||
}
|
}
|
||||||
else if (arrayType->mElementCount < 0)
|
else if (arrayType->mElementCount < 0)
|
||||||
{
|
{
|
||||||
|
@ -10690,6 +10699,11 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
|
||||||
{
|
{
|
||||||
//BP_ZONE("BfModule::ResolveTypeRef");
|
//BP_ZONE("BfModule::ResolveTypeRef");
|
||||||
|
|
||||||
|
if ((!mCompiler->mIsResolveOnly) && (typeRef->ToString() == "BufferType[Enum.GetCount<GpuBufferType>()]"))
|
||||||
|
{
|
||||||
|
NOP;
|
||||||
|
}
|
||||||
|
|
||||||
if (typeRef == NULL)
|
if (typeRef == NULL)
|
||||||
{
|
{
|
||||||
AssertErrorState();
|
AssertErrorState();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue