1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 04:22:20 +02:00

Improved @this

This commit is contained in:
Brian Fiete 2022-02-15 06:48:27 -05:00
parent 22a3b47de2
commit 9dcafb7db8
2 changed files with 9 additions and 2 deletions

View file

@ -4326,8 +4326,11 @@ BfTypedValue BfExprEvaluator::LookupIdentifier(BfAstNode* refNode, const StringI
{ {
if (mModule->mCurMethodState->mClosureState->mCapturing) if (mModule->mCurMethodState->mClosureState->mCapturing)
{ {
mModule->mCurMethodState->mClosureState->mCapturedDelegateSelf = true; if (mModule->mCurMethodState->mClosureState->mDelegateType != NULL)
return mModule->GetDefaultTypedValue(mModule->ResolveTypeDef(mModule->mCompiler->mDelegateTypeDef)); {
mModule->mCurMethodState->mClosureState->mCapturedDelegateSelf = true;
return mModule->GetDefaultTypedValue(mModule->mCurMethodState->mClosureState->mDelegateType);
}
} }
else else
{ {
@ -13112,6 +13115,8 @@ BfLambdaInstance* BfExprEvaluator::GetLambdaInstance(BfLambdaBindExpression* lam
else else
closureState.mReturnType = mModule->mContext->mBfObjectType; closureState.mReturnType = mModule->mContext->mBfObjectType;
closureState.mCapturing = true; closureState.mCapturing = true;
if (delegateTypeInstance->IsDelegate())
closureState.mDelegateType = delegateTypeInstance;
closureState.mDeclaringMethodIsMutating = mModule->mCurMethodInstance->mMethodDef->mIsMutating; closureState.mDeclaringMethodIsMutating = mModule->mCurMethodInstance->mMethodDef->mIsMutating;
methodState.mClosureState = &closureState; methodState.mClosureState = &closureState;
closureState.mClosureType = outerClosure; closureState.mClosureType = outerClosure;

View file

@ -696,6 +696,7 @@ public:
BfClosureInstanceInfo* mClosureInstanceInfo; BfClosureInstanceInfo* mClosureInstanceInfo;
BfMethodDef* mClosureMethodDef; BfMethodDef* mClosureMethodDef;
BfType* mReturnType; BfType* mReturnType;
BfTypeInstance* mDelegateType;
BfTypeInstance* mClosureType; BfTypeInstance* mClosureType;
BfDeferredLocalMethod* mActiveDeferredLocalMethod; BfDeferredLocalMethod* mActiveDeferredLocalMethod;
Array<BfLocalVariable> mConstLocals; // Locals not inserted into the captured 'this' Array<BfLocalVariable> mConstLocals; // Locals not inserted into the captured 'this'
@ -719,6 +720,7 @@ public:
mReturnTypeInferState = BfReturnTypeInferState_None; mReturnTypeInferState = BfReturnTypeInferState_None;
mActiveDeferredLocalMethod = NULL; mActiveDeferredLocalMethod = NULL;
mReturnType = NULL; mReturnType = NULL;
mDelegateType = NULL;
mClosureType = NULL; mClosureType = NULL;
} }
}; };