1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-16 07:14:09 +02:00

Fixes for mixins in const exprs

This commit is contained in:
Brian Fiete 2020-06-15 09:00:57 -07:00
parent 98d0b90789
commit 63dc33a970
3 changed files with 13 additions and 7 deletions

View file

@ -3181,7 +3181,7 @@ BfTypedValue BfExprEvaluator::LookupIdentifier(BfAstNode* refNode, const StringI
if (autoComplete != NULL) if (autoComplete != NULL)
autoComplete->CheckLocalRef(identifierNode, varDecl); autoComplete->CheckLocalRef(identifierNode, varDecl);
if (((mModule->mCurMethodState->mClosureState == NULL) || (mModule->mCurMethodState->mClosureState->mCapturing)) && if (((mModule->mCurMethodState->mClosureState == NULL) || (mModule->mCurMethodState->mClosureState->mCapturing)) &&
(mModule->mCompiler->mResolvePassData != NULL) && (mModule->mCurMethodInstance != NULL)) (mModule->mCompiler->mResolvePassData != NULL) && (mModule->mCurMethodInstance != NULL) && (!mModule->mCurMethodState->IsTemporary()))
mModule->mCompiler->mResolvePassData->HandleLocalReference(identifierNode, varDecl->mNameNode, mModule->mCurTypeInstance->mTypeDef, rootMethodState->mMethodInstance->mMethodDef, varDecl->mLocalVarId); mModule->mCompiler->mResolvePassData->HandleLocalReference(identifierNode, varDecl->mNameNode, mModule->mCurTypeInstance->mTypeDef, rootMethodState->mMethodInstance->mMethodDef, varDecl->mLocalVarId);
} }
@ -13634,9 +13634,9 @@ void BfExprEvaluator::InjectMixin(BfAstNode* targetSrc, BfTypedValue target, boo
localVar->mIsReadOnly = arg->mTypedValue.IsReadOnly(); localVar->mIsReadOnly = arg->mTypedValue.IsReadOnly();
} }
_AddLocalVariable(localVar, exprEvaluator); _AddLocalVariable(localVar, exprEvaluator);
endLocalIdx++; endLocalIdx++;
++argExprEvaluatorItr; ++argExprEvaluatorItr;
} }
@ -13682,9 +13682,9 @@ void BfExprEvaluator::InjectMixin(BfAstNode* targetSrc, BfTypedValue target, boo
localIdx++; localIdx++;
} }
argExprEvaluatorItr = argExprEvaluators.begin(); argExprEvaluatorItr = argExprEvaluators.begin();
for ( ; localIdx < endLocalIdx; localIdx++) for (; localIdx < endLocalIdx; localIdx++)
{ {
auto exprEvaluator = *argExprEvaluatorItr; auto exprEvaluator = *argExprEvaluatorItr;
BfLocalVariable* localVar = curMethodState->mLocals[localIdx]; BfLocalVariable* localVar = curMethodState->mLocals[localIdx];
@ -13692,14 +13692,14 @@ void BfExprEvaluator::InjectMixin(BfAstNode* targetSrc, BfTypedValue target, boo
if ((exprEvaluator != NULL) && (exprEvaluator->mResultLocalVar != NULL)) if ((exprEvaluator != NULL) && (exprEvaluator->mResultLocalVar != NULL))
{ {
auto inLocalVar = exprEvaluator->mResultLocalVar; auto inLocalVar = exprEvaluator->mResultLocalVar;
if (localVar->mIsAssigned) if (localVar->mIsAssigned)
inLocalVar->mIsAssigned = true; inLocalVar->mIsAssigned = true;
if (localVar->mReadFromId != -1) if (localVar->mReadFromId != -1)
inLocalVar->mReadFromId = mModule->mCurMethodState->GetRootMethodState()->mCurAccessId++; inLocalVar->mReadFromId = mModule->mCurMethodState->GetRootMethodState()->mCurAccessId++;
} }
++argExprEvaluatorItr; ++argExprEvaluatorItr;
} }
if (auto blockBody = BfNodeDynCast<BfBlock>(methodDef->mBody)) if (auto blockBody = BfNodeDynCast<BfBlock>(methodDef->mBody))
if (blockBody->mCloseBrace != NULL) if (blockBody->mCloseBrace != NULL)

View file

@ -1118,6 +1118,11 @@ public:
return mMixinState->mLocalsStartIdx; return mMixinState->mLocalsStartIdx;
return 0; return 0;
} }
bool IsTemporary()
{
return mTempKind != TempKind_None;
}
}; };
class BfDeferredMethodCallData; class BfDeferredMethodCallData;

View file

@ -3400,6 +3400,7 @@ bool BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
return true; return true;
disableYield.Release(); disableYield.Release();
prevTypeState.Restore();
if (canDoMethodProcessing) if (canDoMethodProcessing)
{ {