mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-10 04:22:20 +02:00
Fixed crash when using a failed closure
This commit is contained in:
parent
c92bc523db
commit
bb34a468bb
4 changed files with 9 additions and 5 deletions
|
@ -389,6 +389,7 @@ BfCompiler::BfCompiler(BfSystem* bfSystem, bool isResolveOnly)
|
||||||
mDbgRawAllocDataTypeDef = NULL;
|
mDbgRawAllocDataTypeDef = NULL;
|
||||||
mDeferredCallTypeDef = NULL;
|
mDeferredCallTypeDef = NULL;
|
||||||
mDelegateTypeDef = NULL;
|
mDelegateTypeDef = NULL;
|
||||||
|
mActionTypeDef = NULL;
|
||||||
mEnumTypeDef = NULL;
|
mEnumTypeDef = NULL;
|
||||||
mFriendAttributeTypeDef = NULL;
|
mFriendAttributeTypeDef = NULL;
|
||||||
mCheckedAttributeTypeDef = NULL;
|
mCheckedAttributeTypeDef = NULL;
|
||||||
|
@ -5916,6 +5917,7 @@ bool BfCompiler::DoCompile(const StringImpl& outputDirectory)
|
||||||
mDbgRawAllocDataTypeDef = _GetRequiredType("System.DbgRawAllocData");
|
mDbgRawAllocDataTypeDef = _GetRequiredType("System.DbgRawAllocData");
|
||||||
mDeferredCallTypeDef = _GetRequiredType("System.DeferredCall");
|
mDeferredCallTypeDef = _GetRequiredType("System.DeferredCall");
|
||||||
mDelegateTypeDef = _GetRequiredType("System.Delegate");
|
mDelegateTypeDef = _GetRequiredType("System.Delegate");
|
||||||
|
mActionTypeDef = _GetRequiredType("System.Action");
|
||||||
mEnumTypeDef = _GetRequiredType("System.Enum");
|
mEnumTypeDef = _GetRequiredType("System.Enum");
|
||||||
mFriendAttributeTypeDef = _GetRequiredType("System.FriendAttribute");
|
mFriendAttributeTypeDef = _GetRequiredType("System.FriendAttribute");
|
||||||
mCheckedAttributeTypeDef = _GetRequiredType("System.CheckedAttribute");
|
mCheckedAttributeTypeDef = _GetRequiredType("System.CheckedAttribute");
|
||||||
|
|
|
@ -338,8 +338,9 @@ public:
|
||||||
BfTypeDef* mClassVDataTypeDef;
|
BfTypeDef* mClassVDataTypeDef;
|
||||||
|
|
||||||
BfTypeDef* mDbgRawAllocDataTypeDef;
|
BfTypeDef* mDbgRawAllocDataTypeDef;
|
||||||
BfTypeDef* mDeferredCallTypeDef;
|
BfTypeDef* mDeferredCallTypeDef;
|
||||||
BfTypeDef* mDelegateTypeDef;
|
BfTypeDef* mDelegateTypeDef;
|
||||||
|
BfTypeDef* mActionTypeDef;
|
||||||
BfTypeDef* mEnumTypeDef;
|
BfTypeDef* mEnumTypeDef;
|
||||||
BfTypeDef* mStringTypeDef;
|
BfTypeDef* mStringTypeDef;
|
||||||
BfTypeDef* mTypeTypeDef;
|
BfTypeDef* mTypeTypeDef;
|
||||||
|
|
|
@ -464,7 +464,7 @@ bool BfMethodMatcher::InferGenericArgument(BfMethodInstance* methodInstance, BfT
|
||||||
auto argInvokeMethod = mModule->GetRawMethodByName(argType->ToTypeInstance(), "Invoke");
|
auto argInvokeMethod = mModule->GetRawMethodByName(argType->ToTypeInstance(), "Invoke");
|
||||||
auto wantInvokeMethod = mModule->GetRawMethodByName(wantType->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);
|
InferGenericArgument(methodInstance, argInvokeMethod->mReturnType, wantInvokeMethod->mReturnType, BfIRValue(), checkedTypeSet);
|
||||||
for (int argIdx = 0; argIdx < (int)argInvokeMethod->GetParamCount(); argIdx++)
|
for (int argIdx = 0; argIdx < (int)argInvokeMethod->GetParamCount(); argIdx++)
|
||||||
|
@ -9604,13 +9604,13 @@ BfLambdaInstance* BfExprEvaluator::GetLambdaInstance(BfLambdaBindExpression* lam
|
||||||
sBindCount++;
|
sBindCount++;
|
||||||
|
|
||||||
bool isFunctionBind = false;
|
bool isFunctionBind = false;
|
||||||
|
|
||||||
BfTypeInstance* delegateTypeInstance = NULL;
|
BfTypeInstance* delegateTypeInstance = NULL;
|
||||||
BfMethodInstance* invokeMethodInstance = NULL;
|
BfMethodInstance* invokeMethodInstance = NULL;
|
||||||
if (mExpectingType == NULL)
|
if (mExpectingType == NULL)
|
||||||
{
|
{
|
||||||
mModule->Fail("Cannot infer delegate type", lambdaBindExpr);
|
mModule->Fail("Cannot infer delegate type", lambdaBindExpr);
|
||||||
delegateTypeInstance = mModule->mContext->mBfObjectType;
|
delegateTypeInstance = mModule->ResolveTypeDef(mModule->mCompiler->mActionTypeDef)->ToTypeInstance();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -9620,7 +9620,7 @@ BfLambdaInstance* BfExprEvaluator::GetLambdaInstance(BfLambdaBindExpression* lam
|
||||||
{
|
{
|
||||||
if (lambdaBindExpr->mFatArrowToken != NULL)
|
if (lambdaBindExpr->mFatArrowToken != NULL)
|
||||||
mModule->Fail("Can only bind lambdas to delegate types", lambdaBindExpr->mFatArrowToken);
|
mModule->Fail("Can only bind lambdas to delegate types", lambdaBindExpr->mFatArrowToken);
|
||||||
delegateTypeInstance = mModule->mContext->mBfObjectType;
|
delegateTypeInstance = mModule->ResolveTypeDef(mModule->mCompiler->mActionTypeDef)->ToTypeInstance();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -1760,6 +1760,7 @@ void BfTypeInstance::CalcHotVirtualData(Array<int>* ifaceMapping)
|
||||||
BfClosureType::BfClosureType(BfTypeInstance* srcDelegate, Val128 closureHash) :
|
BfClosureType::BfClosureType(BfTypeInstance* srcDelegate, Val128 closureHash) :
|
||||||
mSource(srcDelegate->mTypeDef->mSystem)
|
mSource(srcDelegate->mTypeDef->mSystem)
|
||||||
{
|
{
|
||||||
|
BF_ASSERT(srcDelegate->IsDelegate());
|
||||||
mSrcDelegate = srcDelegate;
|
mSrcDelegate = srcDelegate;
|
||||||
mTypeDef = mSrcDelegate->mTypeDef;
|
mTypeDef = mSrcDelegate->mTypeDef;
|
||||||
mCreatedTypeDef = false;
|
mCreatedTypeDef = false;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue