diff --git a/IDEHelper/Compiler/BfCompiler.cpp b/IDEHelper/Compiler/BfCompiler.cpp index 02b4c178..91d79d29 100644 --- a/IDEHelper/Compiler/BfCompiler.cpp +++ b/IDEHelper/Compiler/BfCompiler.cpp @@ -389,6 +389,7 @@ BfCompiler::BfCompiler(BfSystem* bfSystem, bool isResolveOnly) mDbgRawAllocDataTypeDef = NULL; mDeferredCallTypeDef = NULL; mDelegateTypeDef = NULL; + mActionTypeDef = NULL; mEnumTypeDef = NULL; mFriendAttributeTypeDef = NULL; mCheckedAttributeTypeDef = NULL; @@ -5916,6 +5917,7 @@ bool BfCompiler::DoCompile(const StringImpl& outputDirectory) mDbgRawAllocDataTypeDef = _GetRequiredType("System.DbgRawAllocData"); mDeferredCallTypeDef = _GetRequiredType("System.DeferredCall"); mDelegateTypeDef = _GetRequiredType("System.Delegate"); + mActionTypeDef = _GetRequiredType("System.Action"); mEnumTypeDef = _GetRequiredType("System.Enum"); mFriendAttributeTypeDef = _GetRequiredType("System.FriendAttribute"); mCheckedAttributeTypeDef = _GetRequiredType("System.CheckedAttribute"); diff --git a/IDEHelper/Compiler/BfCompiler.h b/IDEHelper/Compiler/BfCompiler.h index f5d8f84c..e2a2ae01 100644 --- a/IDEHelper/Compiler/BfCompiler.h +++ b/IDEHelper/Compiler/BfCompiler.h @@ -338,8 +338,9 @@ public: BfTypeDef* mClassVDataTypeDef; BfTypeDef* mDbgRawAllocDataTypeDef; - BfTypeDef* mDeferredCallTypeDef; + BfTypeDef* mDeferredCallTypeDef; BfTypeDef* mDelegateTypeDef; + BfTypeDef* mActionTypeDef; BfTypeDef* mEnumTypeDef; BfTypeDef* mStringTypeDef; BfTypeDef* mTypeTypeDef; diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 4f6bb4de..296b741e 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -464,7 +464,7 @@ bool BfMethodMatcher::InferGenericArgument(BfMethodInstance* methodInstance, BfT auto argInvokeMethod = mModule->GetRawMethodByName(argType->ToTypeInstance(), "Invoke"); auto wantInvokeMethod = mModule->GetRawMethodByName(wantType->ToTypeInstance(), "Invoke"); - if (argInvokeMethod->GetParamCount() == wantInvokeMethod->GetParamCount()) + if ((argInvokeMethod != NULL) && (wantInvokeMethod != NULL) && (argInvokeMethod->GetParamCount() == wantInvokeMethod->GetParamCount())) { InferGenericArgument(methodInstance, argInvokeMethod->mReturnType, wantInvokeMethod->mReturnType, BfIRValue(), checkedTypeSet); for (int argIdx = 0; argIdx < (int)argInvokeMethod->GetParamCount(); argIdx++) @@ -9604,13 +9604,13 @@ BfLambdaInstance* BfExprEvaluator::GetLambdaInstance(BfLambdaBindExpression* lam sBindCount++; bool isFunctionBind = false; - + BfTypeInstance* delegateTypeInstance = NULL; BfMethodInstance* invokeMethodInstance = NULL; if (mExpectingType == NULL) { mModule->Fail("Cannot infer delegate type", lambdaBindExpr); - delegateTypeInstance = mModule->mContext->mBfObjectType; + delegateTypeInstance = mModule->ResolveTypeDef(mModule->mCompiler->mActionTypeDef)->ToTypeInstance(); } else { @@ -9620,7 +9620,7 @@ BfLambdaInstance* BfExprEvaluator::GetLambdaInstance(BfLambdaBindExpression* lam { if (lambdaBindExpr->mFatArrowToken != NULL) mModule->Fail("Can only bind lambdas to delegate types", lambdaBindExpr->mFatArrowToken); - delegateTypeInstance = mModule->mContext->mBfObjectType; + delegateTypeInstance = mModule->ResolveTypeDef(mModule->mCompiler->mActionTypeDef)->ToTypeInstance(); } else { diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp index c7361313..65808f4a 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp @@ -1760,6 +1760,7 @@ void BfTypeInstance::CalcHotVirtualData(Array* ifaceMapping) BfClosureType::BfClosureType(BfTypeInstance* srcDelegate, Val128 closureHash) : mSource(srcDelegate->mTypeDef->mSystem) { + BF_ASSERT(srcDelegate->IsDelegate()); mSrcDelegate = srcDelegate; mTypeDef = mSrcDelegate->mTypeDef; mCreatedTypeDef = false;