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

Fixed dependency issue with array arguments in specialized methods

This commit is contained in:
Brian Fiete 2020-08-01 07:49:50 -07:00
parent ae89a29fd8
commit fb960747ec
2 changed files with 29 additions and 20 deletions

View file

@ -3056,22 +3056,23 @@ void BfModule::AddDependency(BfType* usedType, BfType* userType, BfDependencyMap
// } // }
// } // }
BfType* origUsedType = usedType; // TODO: It seems this was bogus - it kept the root array from being marked as a dependency (for example)
bool isDataAccess = ((flags & (BfDependencyMap::DependencyFlag_ReadFields | BfDependencyMap::DependencyFlag_LocalUsage | BfDependencyMap::DependencyFlag_Allocates)) != 0); // BfType* origUsedType = usedType;
if (isDataAccess) bool isDataAccess = ((flags & (BfDependencyMap::DependencyFlag_ReadFields | BfDependencyMap::DependencyFlag_LocalUsage | BfDependencyMap::DependencyFlag_Allocates)) != 0);
{ // if (isDataAccess)
while (true) // {
{ // while (true)
if ((usedType->IsPointer()) || (usedType->IsRef()) || (usedType->IsSizedArray())) // {
usedType = usedType->GetUnderlyingType(); // if ((usedType->IsPointer()) || (usedType->IsRef()) || (usedType->IsSizedArray()))
else if (usedType->IsArray()) // usedType = usedType->GetUnderlyingType();
{ // else if (usedType->IsArray())
usedType = ((BfTypeInstance*)usedType)->mGenericTypeInfo->mTypeGenericArguments[0]; // {
} // usedType = ((BfTypeInstance*)usedType)->mGenericTypeInfo->mTypeGenericArguments[0];
else // }
break; // else
} // break;
} // }
// }
if ((mCurMethodState != NULL) && (mCurMethodState->mHotDataReferenceBuilder != NULL) && (usedType != mCurTypeInstance) && (isDataAccess)) if ((mCurMethodState != NULL) && (mCurMethodState->mHotDataReferenceBuilder != NULL) && (usedType != mCurTypeInstance) && (isDataAccess))
{ {
@ -3146,7 +3147,7 @@ void BfModule::AddDependency(BfType* usedType, BfType* userType, BfDependencyMap
} }
auto depFlag = flags; auto depFlag = flags;
if ((flags & (BfDependencyMap::DependencyFlag_MethodGenericArg | BfDependencyMap::DependencyFlag_TypeGenericArg)) == 0) if ((flags & (BfDependencyMap::DependencyFlag_MethodGenericArg | BfDependencyMap::DependencyFlag_TypeGenericArg)) != 0)
depFlag = BfDependencyMap::DependencyFlag_GenericArgRef; // Will cause a rebuild but not an outright deletion of the type depFlag = BfDependencyMap::DependencyFlag_GenericArgRef; // Will cause a rebuild but not an outright deletion of the type
auto underlyingType = usedType->GetUnderlyingType(); auto underlyingType = usedType->GetUnderlyingType();
@ -9773,7 +9774,9 @@ String BfModule::MethodToString(BfMethodInstance* methodInst, BfMethodNameFlags
if (paramKind == BfParamKind_Params) if (paramKind == BfParamKind_Params)
methodName += "params "; methodName += "params ";
typeNameFlags = BfTypeNameFlag_ResolveGenericParamNames; typeNameFlags = BfTypeNameFlags_None;
if (allowResolveGenericParamNames)
typeNameFlags = BfTypeNameFlag_ResolveGenericParamNames;
BfType* type = methodInst->GetParamType(paramIdx); BfType* type = methodInst->GetParamType(paramIdx);
if ((methodGenericArgs != NULL) && (type->IsUnspecializedType())) if ((methodGenericArgs != NULL) && (type->IsUnspecializedType()))
type = ResolveGenericType(type, NULL, methodGenericArgs); type = ResolveGenericType(type, NULL, methodGenericArgs);
@ -9801,6 +9804,11 @@ String BfModule::MethodToString(BfMethodInstance* methodInst, BfMethodNameFlags
return methodName; return methodName;
} }
void BfModule::pv(BfType* type)
{
OutputDebugStrF("%s\n", TypeToString(type).c_str());
}
static void AddAttributeTargetName(BfAttributeTargets& flagsLeft, BfAttributeTargets checkFlag, String& str, String addString) static void AddAttributeTargetName(BfAttributeTargets& flagsLeft, BfAttributeTargets checkFlag, String& str, String addString)
{ {
if ((flagsLeft & checkFlag) == 0) if ((flagsLeft & checkFlag) == 0)
@ -20159,9 +20167,9 @@ void BfModule::DoMethodDeclaration(BfMethodDeclaration* methodDeclaration, bool
BF_ASSERT(boxedType->mElementType->ToTypeInstance()->mModule->mHadBuildError || mContext->mFailTypes.Contains(boxedType->mElementType->ToTypeInstance())); BF_ASSERT(boxedType->mElementType->ToTypeInstance()->mModule->mHadBuildError || mContext->mFailTypes.Contains(boxedType->mElementType->ToTypeInstance()));
} }
} }
if (!methodInstance->IsSpecializedGenericMethod()) if (!methodInstance->IsSpecializedGenericMethod())
AddDependency(resolvedParamType, typeInstance, BfDependencyMap::DependencyFlag_ParamOrReturnValue); AddDependency(resolvedParamType, typeInstance, BfDependencyMap::DependencyFlag_ParamOrReturnValue);
PopulateType(resolvedParamType, BfPopulateType_Declaration); PopulateType(resolvedParamType, BfPopulateType_Declaration);
AddDependency(resolvedParamType, mCurTypeInstance, BfDependencyMap::DependencyFlag_LocalUsage); AddDependency(resolvedParamType, mCurTypeInstance, BfDependencyMap::DependencyFlag_LocalUsage);

View file

@ -1446,6 +1446,7 @@ public:
StringT<128> TypeToString(BfType* resolvedType, BfTypeNameFlags typeNameFlags, Array<String>* genericMethodParamNameOverrides = NULL); StringT<128> TypeToString(BfType* resolvedType, BfTypeNameFlags typeNameFlags, Array<String>* genericMethodParamNameOverrides = NULL);
void DoTypeToString(StringImpl& str, BfType* resolvedType, BfTypeNameFlags typeNameFlags = BfTypeNameFlags_None, Array<String>* genericMethodParamNameOverrides = NULL); void DoTypeToString(StringImpl& str, BfType* resolvedType, BfTypeNameFlags typeNameFlags = BfTypeNameFlags_None, Array<String>* genericMethodParamNameOverrides = NULL);
String MethodToString(BfMethodInstance* methodInst, BfMethodNameFlags methodNameFlags = BfMethodNameFlag_ResolveGenericParamNames, BfTypeVector* methodGenericArgs = NULL); String MethodToString(BfMethodInstance* methodInst, BfMethodNameFlags methodNameFlags = BfMethodNameFlag_ResolveGenericParamNames, BfTypeVector* methodGenericArgs = NULL);
void pv(BfType* type);
void CurrentAddToConstHolder(BfIRValue& irVal); void CurrentAddToConstHolder(BfIRValue& irVal);
void ClearConstData(); void ClearConstData();
BfTypedValue GetTypedValueFromConstant(BfConstant* constant, BfIRConstHolder* constHolder, BfType* wantType); BfTypedValue GetTypedValueFromConstant(BfConstant* constant, BfIRConstHolder* constHolder, BfType* wantType);