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:
parent
20d0dcf8de
commit
e9ef8ed27c
2 changed files with 69 additions and 64 deletions
|
@ -3237,11 +3237,6 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar
|
||||||
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('@'))
|
||||||
|
|
|
@ -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);
|
|
||||||
BF_ASSERT(payloadType->IsTuple());
|
|
||||||
resolvedFieldType = payloadType;
|
|
||||||
fieldInstance->mIsEnumPayloadCase = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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'
|
|
||||||
AssertErrorState();
|
|
||||||
resolvedFieldType = GetPrimitiveType(BfTypeCode_Var);
|
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'
|
||||||
|
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue