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

Fix for sized array with const member size

This commit is contained in:
Brian Fiete 2020-03-09 13:10:34 -07:00
parent 20d0dcf8de
commit e9ef8ed27c
2 changed files with 69 additions and 64 deletions

View file

@ -3236,12 +3236,7 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar
BfTypeInstance* startCheckType = mModule->mCurTypeInstance; BfTypeInstance* startCheckType = mModule->mCurTypeInstance;
mPropDef = NULL; mPropDef = NULL;
mPropDefBypassVirtual = false; mPropDefBypassVirtual = false;
if ((target.mType != NULL) && (mModule->mCurMethodState != NULL))
{
mModule->PopulateType(target.mType, BfPopulateType_BaseType);
}
if (target) if (target)
{ {
if ((!target.mType->IsValueType()) && (target.IsAddr())) if ((!target.mType->IsValueType()) && (target.IsAddr()))
@ -3265,6 +3260,9 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar
startCheckType = target.mType->ToTypeInstance(); startCheckType = target.mType->ToTypeInstance();
} }
if ((startCheckType != NULL) && (startCheckType->mBaseType == NULL))
mModule->PopulateType(startCheckType, BfPopulateType_BaseType);
String findName; String findName;
int varSkipCount = 0; int varSkipCount = 0;
if (fieldName.StartsWith('@')) if (fieldName.StartsWith('@'))

View file

@ -2236,76 +2236,83 @@ bool BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
} }
int enumCaseEntryIdx = 0; int enumCaseEntryIdx = 0;
for (auto field : typeDef->mFields) for (int pass = 0; pass < 2; pass++)
{ {
auto fieldInstance = &typeInstance->mFieldInstances[field->mIdx]; for (auto field : typeDef->mFields)
if ((fieldInstance->mResolvedType != NULL) || (!fieldInstance->mFieldIncluded))
continue;
SetAndRestoreValue<BfFieldDef*> prevTypeRef(mContext->mCurTypeState->mCurFieldDef, field);
BfType* resolvedFieldType = NULL;
if (field->IsEnumCaseEntry())
{ {
fieldInstance->mDataIdx = -(enumCaseEntryIdx++) - 1; // Do consts then non-consts. Somewhat of a hack for using consts as sized array size
resolvedFieldType = typeInstance; if (field->mIsConst != (pass == 0))
continue;
BfType* payloadType = NULL; auto fieldInstance = &typeInstance->mFieldInstances[field->mIdx];
if (field->mTypeRef != NULL) if ((fieldInstance->mResolvedType != NULL) || (!fieldInstance->mFieldIncluded))
payloadType = ResolveTypeRef(field->mTypeRef, BfPopulateType_Data, BfResolveTypeRefFlag_NoResolveGenericParam); continue;
if (payloadType == NULL)
SetAndRestoreValue<BfFieldDef*> prevTypeRef(mContext->mCurTypeState->mCurFieldDef, field);
BfType* resolvedFieldType = NULL;
if (field->IsEnumCaseEntry())
{ {
if (!typeInstance->IsTypedPrimitive()) fieldInstance->mDataIdx = -(enumCaseEntryIdx++) - 1;
payloadType = CreateTupleType(BfTypeVector(), Array<String>()); resolvedFieldType = typeInstance;
BfType* payloadType = NULL;
if (field->mTypeRef != NULL)
payloadType = ResolveTypeRef(field->mTypeRef, BfPopulateType_Data, BfResolveTypeRefFlag_NoResolveGenericParam);
if (payloadType == NULL)
{
if (!typeInstance->IsTypedPrimitive())
payloadType = CreateTupleType(BfTypeVector(), Array<String>());
}
if (payloadType != NULL)
{
AddDependency(payloadType, typeInstance, BfDependencyMap::DependencyFlag_ValueTypeMemberData);
BF_ASSERT(payloadType->IsTuple());
resolvedFieldType = payloadType;
fieldInstance->mIsEnumPayloadCase = true;
}
} }
if (payloadType != NULL) else if ((field->mTypeRef != NULL) && ((field->mTypeRef->IsExact<BfVarTypeReference>()) || (field->mTypeRef->IsExact<BfLetTypeReference>()) || (field->mTypeRef->IsExact<BfDeclTypeRef>())))
{ {
AddDependency(payloadType, typeInstance, BfDependencyMap::DependencyFlag_ValueTypeMemberData); resolvedFieldType = GetPrimitiveType(BfTypeCode_Var);
BF_ASSERT(payloadType->IsTuple());
resolvedFieldType = payloadType; DeferredResolveEntry resolveEntry;
fieldInstance->mIsEnumPayloadCase = true; resolveEntry.mFieldDef = field;
resolveEntry.mTypeArrayIdx = (int)llvmFieldTypes.size();
deferredVarResolves.push_back(resolveEntry);
fieldInstance->mIsInferredType = true;
// For 'let', make read-only
} }
} else
else if ((field->mTypeRef != NULL) && ((field->mTypeRef->IsExact<BfVarTypeReference>()) || (field->mTypeRef->IsExact<BfLetTypeReference>()) || (field->mTypeRef->IsExact<BfDeclTypeRef>())))
{
resolvedFieldType = GetPrimitiveType(BfTypeCode_Var);
DeferredResolveEntry resolveEntry;
resolveEntry.mFieldDef = field;
resolveEntry.mTypeArrayIdx = (int)llvmFieldTypes.size();
deferredVarResolves.push_back(resolveEntry);
fieldInstance->mIsInferredType = true;
// For 'let', make read-only
}
else
{
resolvedFieldType = ResolveTypeRef(field->mTypeRef, BfPopulateType_Declaration, BfResolveTypeRefFlag_NoResolveGenericParam);
if (resolvedFieldType == NULL)
{ {
// Failed, just put in placeholder 'var' resolvedFieldType = ResolveTypeRef(field->mTypeRef, BfPopulateType_Declaration, BfResolveTypeRefFlag_NoResolveGenericParam);
AssertErrorState(); if (resolvedFieldType == NULL)
resolvedFieldType = GetPrimitiveType(BfTypeCode_Var); {
// Failed, just put in placeholder 'var'
AssertErrorState();
resolvedFieldType = GetPrimitiveType(BfTypeCode_Var);
}
} }
}
if (resolvedFieldType->IsMethodRef()) if (resolvedFieldType->IsMethodRef())
{ {
auto methodRefType = (BfMethodRefType*)resolvedFieldType; auto methodRefType = (BfMethodRefType*)resolvedFieldType;
} }
if (fieldInstance->mResolvedType == NULL) if (fieldInstance->mResolvedType == NULL)
fieldInstance->mResolvedType = resolvedFieldType; fieldInstance->mResolvedType = resolvedFieldType;
if (field->mIsConst) if (field->mIsConst)
{ {
// Resolve in ResolveConstField after we finish populating entire FieldInstance list // Resolve in ResolveConstField after we finish populating entire FieldInstance list
} }
else if (field->mIsStatic) else if (field->mIsStatic)
{ {
// Don't allocate this until after we're finished populating entire FieldInstance list, // Don't allocate this until after we're finished populating entire FieldInstance list,
// because we may have re-entry and create multiple instances of this static field // because we may have re-entry and create multiple instances of this static field
}
} }
} }