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

Fixed bugs with type extensions

This commit is contained in:
Brian Fiete 2019-09-10 11:27:53 -07:00
parent 55f3bdfa54
commit 38a650fc2e
5 changed files with 81 additions and 15 deletions

View file

@ -1502,6 +1502,10 @@ bool BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
for (auto baseTypeRef : typeDef->mBaseTypes)
{
SetAndRestoreValue<BfTypeReference*> prevTypeRef(mContext->mCurTypeState->mCurBaseTypeRef, baseTypeRef);
SetAndRestoreValue<bool> prevIgnoreError(mIgnoreErrors, true);
SetAndRestoreValue<bool> prevSkipTypeProtectionChecks(typeInstance->mSkipTypeProtectionChecks, true);
auto baseType = ResolveTypeRef(baseTypeRef, BfPopulateType_Declaration);
if (baseType != NULL)
{
@ -3811,6 +3815,10 @@ void BfModule::DoTypeInstanceMethodProcessing(BfTypeInstance* typeInstance)
if (ifaceMethodInst == NULL)
continue;
// Don't even try to match generics
if (!ifaceMethodInst->mMethodDef->mGenericParams.IsEmpty())
continue;
auto iReturnType = ifaceMethodInst->mReturnType;
if (iReturnType->IsSelf())
iReturnType = typeInstance;
@ -3931,7 +3939,7 @@ void BfModule::DoTypeInstanceMethodProcessing(BfTypeInstance* typeInstance)
}
}
if ((bestMethodInst->mMethodDef->HasBody()) && (matchedMethod == NULL))
if ((bestMethodInst->mMethodDef->HasBody()) && (bestMethodInst->mMethodDef->mGenericParams.size() == 0) && (matchedMethod == NULL))
{
auto methodDef = bestMethodInst->mMethodDef;
BfGetMethodInstanceFlags flags = BfGetMethodInstanceFlag_ForeignMethodDef;
@ -3939,10 +3947,10 @@ void BfModule::DoTypeInstanceMethodProcessing(BfTypeInstance* typeInstance)
flags = (BfGetMethodInstanceFlags)(flags | BfGetMethodInstanceFlag_UnspecializedPass);
auto methodInst = GetMethodInstance(typeInstance, methodDef, BfTypeVector(), flags, ifaceInst);
if (methodInst)
{
{
*matchedMethodRef = methodInst.mMethodInstance;
BfMethodInstance* newMethodInstance = *matchedMethodRef;
BfMethodInstance* newMethodInstance = methodInst.mMethodInstance;
BF_ASSERT(newMethodInstance->mIsForeignMethodDef);
if (newMethodInstance->mMethodInstanceGroup->mOnDemandKind == BfMethodOnDemandKind_Decl_AwaitingReference)
mOnDemandMethodCount++;
@ -4053,7 +4061,7 @@ void BfModule::AddMethodToWorkList(BfMethodInstance* methodInstance)
return;
BF_ASSERT(mCompiler->mCompileState != BfCompiler::CompileState_VData);
if (methodInstance->mIsReified)
if ((methodInstance->mIsReified) && (!methodInstance->mIsUnspecialized))
{
BF_ASSERT(mCompiler->mCompileState != BfCompiler::CompileState_Unreified);
}