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

Added field and instantiation restrictions to extended opaques

This commit is contained in:
Brian Fiete 2025-02-15 13:21:47 -08:00
parent 5000a8a824
commit 765906dd70
3 changed files with 19 additions and 10 deletions

View file

@ -3488,6 +3488,7 @@ void BfCompiler::UpdateRevisedTypes()
compositeTypeDef->mTypeCode = rootTypeDef->mTypeCode; compositeTypeDef->mTypeCode = rootTypeDef->mTypeCode;
compositeTypeDef->mFullName = rootTypeDef->mFullName; compositeTypeDef->mFullName = rootTypeDef->mFullName;
compositeTypeDef->mFullNameEx = rootTypeDef->mFullNameEx; compositeTypeDef->mFullNameEx = rootTypeDef->mFullNameEx;
compositeTypeDef->mIsOpaque = rootTypeDef->mIsOpaque;
compositeTypeDef->mIsFunction = rootTypeDef->mIsFunction; compositeTypeDef->mIsFunction = rootTypeDef->mIsFunction;
compositeTypeDef->mIsDelegate = rootTypeDef->mIsDelegate; compositeTypeDef->mIsDelegate = rootTypeDef->mIsDelegate;
compositeTypeDef->mIsCombinedPartial = true; compositeTypeDef->mIsCombinedPartial = true;

View file

@ -5595,6 +5595,21 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
if ((!fieldDef->mIsConst) && (!fieldDef->mIsStatic)) if ((!fieldDef->mIsConst) && (!fieldDef->mIsStatic))
{ {
BfAstNode* nameRefNode = NULL;
if (auto fieldDecl = fieldDef->GetFieldDeclaration())
nameRefNode = fieldDecl->mNameNode;
else if (auto paramDecl = fieldDef->GetParamDeclaration())
nameRefNode = paramDecl->mNameNode;
if (nameRefNode == NULL)
nameRefNode = fieldDef->mTypeRef;
if ((!resolvedFieldType->IsValuelessType()) && (typeDef->mIsOpaque))
{
Fail(StrFormat("Opaque type '%s' attempted to declare non-static field '%s'", TypeToString(typeInstance).c_str(), fieldDef->mName.c_str()), nameRefNode, true);
resolvedFieldType = GetPrimitiveType(BfTypeCode_None);
fieldInstance->mResolvedType = resolvedFieldType;
}
PopulateType(resolvedFieldType, resolvedFieldType->IsValueType() ? BfPopulateType_Data : BfPopulateType_Declaration); PopulateType(resolvedFieldType, resolvedFieldType->IsValueType() ? BfPopulateType_Data : BfPopulateType_Declaration);
if (resolvedFieldType->WantsGCMarking()) if (resolvedFieldType->WantsGCMarking())
typeInstance->mWantsGCMarking = true; typeInstance->mWantsGCMarking = true;
@ -5611,15 +5626,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
if (fieldDef->mIsExtern) if (fieldDef->mIsExtern)
{ {
Fail("Cannot declare instance member as 'extern'", fieldDef->GetFieldDeclaration()->mExternSpecifier, true); Fail("Cannot declare instance member as 'extern'", fieldDef->GetFieldDeclaration()->mExternSpecifier, true);
} }
BfAstNode* nameRefNode = NULL;
if (auto fieldDecl = fieldDef->GetFieldDeclaration())
nameRefNode = fieldDecl->mNameNode;
else if (auto paramDecl = fieldDef->GetParamDeclaration())
nameRefNode = paramDecl->mNameNode;
if (nameRefNode == NULL)
nameRefNode = fieldDef->mTypeRef;
if (!allowInstanceFields) if (!allowInstanceFields)
{ {
@ -5677,7 +5684,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
} }
else if (!resolvedFieldType->IsObject()) else if (!resolvedFieldType->IsObject())
Fail("Append fields must be classes", nameRefNode, true); Fail("Append fields must be classes", nameRefNode, true);
} }
BF_ASSERT(dataSize >= 0); BF_ASSERT(dataSize >= 0);
fieldInstance->mDataSize = dataSize; fieldInstance->mDataSize = dataSize;

View file

@ -3207,6 +3207,7 @@ void BfSystem::AddToCompositePartial(BfPassInstance* passInstance, BfTypeDef* co
typeDef->mSystem = partialTypeDef->mSystem; typeDef->mSystem = partialTypeDef->mSystem;
typeDef->mTypeCode = partialTypeDef->mTypeCode; typeDef->mTypeCode = partialTypeDef->mTypeCode;
typeDef->mShow = partialTypeDef->mShow; typeDef->mShow = partialTypeDef->mShow;
typeDef->mIsOpaque = partialTypeDef->mIsOpaque;
typeDef->mIsFunction = partialTypeDef->mIsFunction; typeDef->mIsFunction = partialTypeDef->mIsFunction;
typeDef->mIsDelegate = partialTypeDef->mIsDelegate; typeDef->mIsDelegate = partialTypeDef->mIsDelegate;
typeDef->mNestDepth = partialTypeDef->mNestDepth; typeDef->mNestDepth = partialTypeDef->mNestDepth;