From 4449952235cbbf4bfc24bbae2262ddc036b25a08 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Thu, 22 Oct 2020 06:31:31 -0700 Subject: [PATCH] More methodref fixes --- IDEHelper/Compiler/BfExprEvaluator.cpp | 26 ++++++++++++++++++-------- IDEHelper/Compiler/BfModule.cpp | 7 +++++-- IDEHelper/Compiler/BfModule.h | 2 ++ 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index a09b97ef..03fe4570 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -1069,7 +1069,6 @@ BfTypedValue BfMethodMatcher::ResolveArgTypedValue(BfResolvedArg& resolvedArg, B BfTypedValue argTypedValue = resolvedArg.mTypedValue; if ((resolvedArg.mArgFlags & BfArgFlag_DelegateBindAttempt) != 0) { - //TODO: See if we can bind it to a delegate type BfExprEvaluator exprEvaluator(mModule); exprEvaluator.mExpectingType = checkType; BF_ASSERT(resolvedArg.mExpression->IsA()); @@ -1078,11 +1077,15 @@ BfTypedValue BfMethodMatcher::ResolveArgTypedValue(BfResolvedArg& resolvedArg, B if (exprEvaluator.CanBindDelegate(delegateBindExpr, &boundMethodInstance, origCheckType, genericArgumentsSubstitute)) { if (delegateBindExpr->mNewToken == NULL) - { + { if (boundMethodInstance->GetOwner()->IsFunction()) { return BfTypedValue(mModule->mBfIRBuilder->GetFakeVal(), boundMethodInstance->GetOwner()); } + else if (boundMethodInstance->mDisallowCalling) + { + argTypedValue = BfTypedValue(mModule->mBfIRBuilder->GetFakeVal(), checkType); + } else { resolvedArg.mExpectedType = checkType; @@ -10378,6 +10381,13 @@ void BfExprEvaluator::Visit(BfDelegateBindExpression* delegateBindExpr) return; } + if (bindResult.mMethodInstance->mDisallowCalling) + { + BF_ASSERT(mModule->mBfIRBuilder->mIgnoreWrites); + mResult = mModule->GetDefaultTypedValue(mExpectingType, false, BfDefaultValueKind_Addr); + return; + } + auto methodRefType = mModule->CreateMethodRefType(bindResult.mMethodInstance); mModule->AddDependency(methodRefType, mModule->mCurTypeInstance, BfDependencyMap::DependencyFlag_Calls); mModule->AddCallDependency(bindResult.mMethodInstance); @@ -10931,12 +10941,6 @@ BfLambdaInstance* BfExprEvaluator::GetLambdaInstance(BfLambdaBindExpression* lam if (invokeMethodInstance != NULL) { - if (mModule->mBfIRBuilder->mIgnoreWrites) - { - mResult = mModule->GetDefaultTypedValue(mExpectingType, false, BfDefaultValueKind_Addr); - return NULL; - } - BfLocalMethod* localMethod = new BfLocalMethod(); localMethod->mMethodName = "anon"; localMethod->mSystem = mModule->mSystem; @@ -10951,6 +10955,12 @@ BfLambdaInstance* BfExprEvaluator::GetLambdaInstance(BfLambdaBindExpression* lam auto moduleMethodInstance = mModule->GetLocalMethodInstance(localMethod, BfTypeVector()); + if (moduleMethodInstance.mMethodInstance->mDisallowCalling) + { + mResult = mModule->GetDefaultTypedValue(mExpectingType, false, BfDefaultValueKind_Addr); + return NULL; + } + auto methodRefType = mModule->CreateMethodRefType(moduleMethodInstance.mMethodInstance); mModule->AddDependency(methodRefType, mModule->mCurTypeInstance, BfDependencyMap::DependencyFlag_Calls); mModule->AddCallDependency(moduleMethodInstance.mMethodInstance); diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 7dd1ab8d..930f8d4f 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -17141,7 +17141,7 @@ void BfModule::EmitGCFindTLSMembers() void BfModule::ProcessMethod(BfMethodInstance* methodInstance, bool isInlineDup) { BP_ZONE_F("BfModule::ProcessMethod %s", BP_DYN_STR(methodInstance->mMethodDef->mName.c_str())); - + if (mAwaitingInitFinish) FinishInit(); @@ -19694,6 +19694,8 @@ BfModuleMethodInstance BfModule::GetLocalMethodInstance(BfLocalMethod* localMeth BfDeferredLocalAssignData deferredLocalAssignData(rootMethodState->mCurScope); deferredLocalAssignData.mVarIdBarrier = rootMethodState->mCurLocalVarId; SetAndRestoreValue prevDLA(rootMethodState->mDeferredLocalAssignData, &deferredLocalAssignData); + if (!mIgnoreErrors) + localMethod->mDidBodyErrorPass = true; _VisitLambdaBody(); RestoreScopeState(); @@ -19907,7 +19909,8 @@ BfModuleMethodInstance BfModule::GetLocalMethodInstance(BfLocalMethod* localMeth // Since we handle errors & warnings in the capture phase, we don't need to process any local methods for resolve-only (unless we're doing a mDbgVerifyCodeGen) if ((!localMethod->mDeclOnly) && (!methodInstance->IsOrInUnspecializedVariation()) && - (!mWantsIRIgnoreWrites) && (methodDef->mMethodType != BfMethodType_Mixin)) + (methodDef->mMethodType != BfMethodType_Mixin) && + ((!mWantsIRIgnoreWrites) || (!localMethod->mDidBodyErrorPass))) { BP_ZONE("BfDeferredLocalMethod:create"); diff --git a/IDEHelper/Compiler/BfModule.h b/IDEHelper/Compiler/BfModule.h index 46270c98..0973f07c 100644 --- a/IDEHelper/Compiler/BfModule.h +++ b/IDEHelper/Compiler/BfModule.h @@ -220,6 +220,7 @@ public: BfMixinState* mDeclMixinState; OwnedVector mDirectTypeRefs; bool mDeclOnly; + bool mDidBodyErrorPass; BfLocalMethod* mNextWithSameName; public: @@ -237,6 +238,7 @@ public: mDeclMethodState = NULL; mDeclMixinState = NULL; mDeclOnly = false; + mDidBodyErrorPass = false; mNextWithSameName = NULL; } ~BfLocalMethod();