mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-09 03:52:19 +02:00
Generic resolution fix
This commit is contained in:
parent
5d55409841
commit
7f9a272e23
3 changed files with 58 additions and 41 deletions
|
@ -2344,7 +2344,16 @@ bool BfMethodMatcher::CheckMethod(BfTypeInstance* targetTypeInstance, BfTypeInst
|
||||||
// If we allowed this then it would allow too many matches (and allow conversion to any type during CastToValue)
|
// If we allowed this then it would allow too many matches (and allow conversion to any type during CastToValue)
|
||||||
goto NoMatch;
|
goto NoMatch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool doFullTypeResolve = false;
|
||||||
|
if (returnType->IsUnspecializedTypeVariation())
|
||||||
|
{
|
||||||
|
returnType = typeUnspecMethodInstance->mReturnType;
|
||||||
|
doFullTypeResolve = true;
|
||||||
|
}
|
||||||
if ((genericArgumentsSubstitute != NULL) && (returnType->IsUnspecializedType()))
|
if ((genericArgumentsSubstitute != NULL) && (returnType->IsUnspecializedType()))
|
||||||
|
doFullTypeResolve = true;
|
||||||
|
if (doFullTypeResolve)
|
||||||
{
|
{
|
||||||
auto resolvedType = mModule->ResolveGenericType(returnType, typeGenericArguments, genericArgumentsSubstitute, mModule->mCurTypeInstance, false);
|
auto resolvedType = mModule->ResolveGenericType(returnType, typeGenericArguments, genericArgumentsSubstitute, mModule->mCurTypeInstance, false);
|
||||||
if (resolvedType == NULL)
|
if (resolvedType == NULL)
|
||||||
|
@ -6383,7 +6392,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, BfMethodInstance*
|
||||||
mModule->mCurMethodState->mCancelledDeferredCall = true;
|
mModule->mCurMethodState->mCancelledDeferredCall = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (methodDef->mIsNoReturn)
|
if ((methodDef->mIsNoReturn) && ((mBfEvalExprFlags & BfEvalExprFlags_Comptime) == 0))
|
||||||
{
|
{
|
||||||
mModule->mCurMethodState->SetHadReturn(true);
|
mModule->mCurMethodState->SetHadReturn(true);
|
||||||
mModule->mCurMethodState->mLeftBlockUncond = true;
|
mModule->mCurMethodState->mLeftBlockUncond = true;
|
||||||
|
|
|
@ -21653,50 +21653,55 @@ void BfModule::ProcessMethod(BfMethodInstance* methodInstance, bool isInlineDup,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto innerMethodDef = innerMethodInstance.mMethodInstance->mMethodDef;
|
auto innerMethodDef = innerMethodInstance.mMethodInstance->mMethodDef;
|
||||||
BF_ASSERT(innerMethodDef == methodDef);
|
if ((innerMethodDef == methodDef != NULL) && (!CompareMethodSignatures(methodInstance, innerMethodInstance.mMethodInstance)))
|
||||||
|
|
||||||
SizedArray<BfIRValue, 8> innerParams;
|
|
||||||
BfExprEvaluator exprEvaluator(this);
|
|
||||||
|
|
||||||
if (!innerType->IsValuelessType())
|
|
||||||
{
|
{
|
||||||
BfIRValue thisValue = mBfIRBuilder->CreateInBoundsGEP(mCurMethodState->mLocals[0]->mValue, 0, 1);
|
InternalError("Boxing method passthrough error");
|
||||||
BfTypedValue innerVal(thisValue, innerType, true);
|
|
||||||
if (boxedType->IsBoxedStructPtr())
|
|
||||||
{
|
|
||||||
innerVal = LoadValue(innerVal);
|
|
||||||
innerVal = BfTypedValue(innerVal.mValue, innerType, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
exprEvaluator.PushThis(NULL, innerVal, innerMethodInstance.mMethodInstance, innerParams);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 1; i < (int)mCurMethodState->mLocals.size(); i++)
|
|
||||||
{
|
|
||||||
BfLocalVariable* localVar = mCurMethodState->mLocals[i];
|
|
||||||
BfTypedValue localVal = exprEvaluator.LoadLocal(localVar, true);
|
|
||||||
exprEvaluator.PushArg(localVal, innerParams);
|
|
||||||
}
|
|
||||||
if (!innerMethodInstance.mFunc)
|
|
||||||
{
|
|
||||||
BF_ASSERT(innerType->IsUnspecializedType());
|
|
||||||
}
|
|
||||||
else if ((!mIsComptimeModule) && (methodInstance->GetStructRetIdx() != -1))
|
|
||||||
{
|
|
||||||
mBfIRBuilder->PopulateType(methodInstance->mReturnType);
|
|
||||||
auto returnType = BfTypedValue(mBfIRBuilder->GetArgument(methodInstance->GetStructRetIdx()), methodInstance->mReturnType, true);
|
|
||||||
exprEvaluator.mReceivingValue = &returnType;
|
|
||||||
auto retVal = exprEvaluator.CreateCall(NULL, innerMethodInstance.mMethodInstance, innerMethodInstance.mFunc, true, innerParams, NULL, BfCreateCallFlags_TailCall);
|
|
||||||
BF_ASSERT(exprEvaluator.mReceivingValue == NULL); // Ensure it was actually used
|
|
||||||
mBfIRBuilder->CreateRetVoid();
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mBfIRBuilder->PopulateType(methodInstance->mReturnType);
|
SizedArray<BfIRValue, 8> innerParams;
|
||||||
auto retVal = exprEvaluator.CreateCall(NULL, innerMethodInstance.mMethodInstance, innerMethodInstance.mFunc, true, innerParams, NULL, BfCreateCallFlags_TailCall);
|
BfExprEvaluator exprEvaluator(this);
|
||||||
if (mCurMethodInstance->mReturnType->IsValueType())
|
|
||||||
retVal = LoadValue(retVal);
|
if (!innerType->IsValuelessType())
|
||||||
CreateReturn(retVal.mValue);
|
{
|
||||||
|
BfIRValue thisValue = mBfIRBuilder->CreateInBoundsGEP(mCurMethodState->mLocals[0]->mValue, 0, 1);
|
||||||
|
BfTypedValue innerVal(thisValue, innerType, true);
|
||||||
|
if (boxedType->IsBoxedStructPtr())
|
||||||
|
{
|
||||||
|
innerVal = LoadValue(innerVal);
|
||||||
|
innerVal = BfTypedValue(innerVal.mValue, innerType, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
exprEvaluator.PushThis(NULL, innerVal, innerMethodInstance.mMethodInstance, innerParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 1; i < (int)mCurMethodState->mLocals.size(); i++)
|
||||||
|
{
|
||||||
|
BfLocalVariable* localVar = mCurMethodState->mLocals[i];
|
||||||
|
BfTypedValue localVal = exprEvaluator.LoadLocal(localVar, true);
|
||||||
|
exprEvaluator.PushArg(localVal, innerParams);
|
||||||
|
}
|
||||||
|
if (!innerMethodInstance.mFunc)
|
||||||
|
{
|
||||||
|
BF_ASSERT(innerType->IsUnspecializedType());
|
||||||
|
}
|
||||||
|
else if ((!mIsComptimeModule) && (methodInstance->GetStructRetIdx() != -1))
|
||||||
|
{
|
||||||
|
mBfIRBuilder->PopulateType(methodInstance->mReturnType);
|
||||||
|
auto returnType = BfTypedValue(mBfIRBuilder->GetArgument(methodInstance->GetStructRetIdx()), methodInstance->mReturnType, true);
|
||||||
|
exprEvaluator.mReceivingValue = &returnType;
|
||||||
|
auto retVal = exprEvaluator.CreateCall(NULL, innerMethodInstance.mMethodInstance, innerMethodInstance.mFunc, true, innerParams, NULL, BfCreateCallFlags_TailCall);
|
||||||
|
BF_ASSERT(exprEvaluator.mReceivingValue == NULL); // Ensure it was actually used
|
||||||
|
mBfIRBuilder->CreateRetVoid();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mBfIRBuilder->PopulateType(methodInstance->mReturnType);
|
||||||
|
auto retVal = exprEvaluator.CreateCall(NULL, innerMethodInstance.mMethodInstance, innerMethodInstance.mFunc, true, innerParams, NULL, BfCreateCallFlags_TailCall);
|
||||||
|
if (mCurMethodInstance->mReturnType->IsValueType())
|
||||||
|
retVal = LoadValue(retVal);
|
||||||
|
CreateReturn(retVal.mValue);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3472,6 +3472,9 @@ void BfModule::DoPopulateType_TypeAlias(BfTypeAliasType* typeAlias)
|
||||||
|
|
||||||
void BfModule::DoPopulateType_InitSearches(BfTypeInstance* typeInstance)
|
void BfModule::DoPopulateType_InitSearches(BfTypeInstance* typeInstance)
|
||||||
{
|
{
|
||||||
|
if (typeInstance->IsBoxed())
|
||||||
|
return;
|
||||||
|
|
||||||
auto typeDef = typeInstance->mTypeDef;
|
auto typeDef = typeInstance->mTypeDef;
|
||||||
|
|
||||||
auto _AddStaticSearch = [&](BfTypeDef* typeDef)
|
auto _AddStaticSearch = [&](BfTypeDef* typeDef)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue