mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-10 04:22:20 +02:00
Fixed const eval issues with generics
This commit is contained in:
parent
abd883212f
commit
301f9eb1c1
3 changed files with 63 additions and 16 deletions
|
@ -5078,12 +5078,10 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, BfMethodInstance*
|
||||||
|
|
||||||
if (mModule->mCompiler->mCEMachine != NULL)
|
if (mModule->mCompiler->mCEMachine != NULL)
|
||||||
{
|
{
|
||||||
if ((mModule->mIsConstModule) && (!methodInstance->mReturnType->IsVar()))
|
bool doConstReturn = false;
|
||||||
{
|
|
||||||
mModule->mCompiler->mCEMachine->QueueMethod(methodInstance, func);
|
if ((mBfEvalExprFlags & BfEvalExprFlags_ConstEval) != 0)
|
||||||
}
|
{
|
||||||
else if ((mBfEvalExprFlags & BfEvalExprFlags_ConstEval) != 0)
|
|
||||||
{
|
|
||||||
if (mFunctionBindResult != NULL)
|
if (mFunctionBindResult != NULL)
|
||||||
{
|
{
|
||||||
forceBind = true;
|
forceBind = true;
|
||||||
|
@ -5091,6 +5089,10 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, BfMethodInstance*
|
||||||
else if ((mBfEvalExprFlags & BfEvalExprFlags_InCascade) != 0)
|
else if ((mBfEvalExprFlags & BfEvalExprFlags_InCascade) != 0)
|
||||||
{
|
{
|
||||||
mModule->Fail("Const evaluation not allowed with cascade operator", targetSrc);
|
mModule->Fail("Const evaluation not allowed with cascade operator", targetSrc);
|
||||||
|
}
|
||||||
|
else if (methodInstance->mIsUnspecialized)
|
||||||
|
{
|
||||||
|
doConstReturn = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -5101,7 +5103,34 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, BfMethodInstance*
|
||||||
BF_ASSERT(!constRet.mType->IsVar());
|
BF_ASSERT(!constRet.mType->IsVar());
|
||||||
return constRet;
|
return constRet;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (mModule->mIsConstModule)
|
||||||
|
{
|
||||||
|
if (methodInstance->mIsUnspecialized)
|
||||||
|
{
|
||||||
|
doConstReturn = true;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mModule->mCompiler->mCEMachine->QueueMethod(methodInstance, func);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (doConstReturn)
|
||||||
|
{
|
||||||
|
if ((returnType->IsVar()) && (mExpectingType != NULL))
|
||||||
|
returnType = mExpectingType;
|
||||||
|
if (returnType->IsRef())
|
||||||
|
{
|
||||||
|
return _GetDefaultReturnValue();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return mModule->GetDefaultTypedValue(returnType, true, BfDefaultValueKind_Undef);
|
||||||
|
}
|
||||||
|
|
||||||
|
return _GetDefaultReturnValue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1655,7 +1655,6 @@ BfLocalVariable* BfModule::HandleVariableDeclaration(BfVariableDeclaration* varD
|
||||||
initValue = constResolver.Resolve(varDecl->mInitializer, resolvedType, BfConstResolveFlag_RemapFromStringId);
|
initValue = constResolver.Resolve(varDecl->mInitializer, resolvedType, BfConstResolveFlag_RemapFromStringId);
|
||||||
if (!initValue)
|
if (!initValue)
|
||||||
initValue = GetDefaultTypedValue(resolvedType);
|
initValue = GetDefaultTypedValue(resolvedType);
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (varDecl->mInitializer->IsA<BfUninitializedExpression>())
|
else if (varDecl->mInitializer->IsA<BfUninitializedExpression>())
|
||||||
{
|
{
|
||||||
|
|
|
@ -2714,13 +2714,27 @@ BfError* CeMachine::Fail(const CeFrame& curFrame, const StringImpl& str)
|
||||||
err = str;
|
err = str;
|
||||||
err += " ";
|
err += " ";
|
||||||
}
|
}
|
||||||
|
|
||||||
err += StrFormat("in const evaluation of ");
|
auto contextMethodInstance = mCurModule->mCurMethodInstance;
|
||||||
if (ceFunction->mMethodInstance != NULL)
|
if (stackIdx > 1)
|
||||||
err += mCeModule->MethodToString(ceFunction->mMethodInstance, BfMethodNameFlag_OmitParams);
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
err += mCeModule->MethodToString(ceFunction->mCeInnerFunctionInfo->mOwner->mMethodInstance, BfMethodNameFlag_OmitParams);
|
auto func = mCallStack[stackIdx - 1].mFunction;
|
||||||
|
contextMethodInstance = func->mCeFunctionInfo->mMethodInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
err += StrFormat("in const evaluation of ");
|
||||||
|
|
||||||
|
//
|
||||||
|
{
|
||||||
|
SetAndRestoreValue<BfTypeInstance*> prevTypeInstance(mCeModule->mCurTypeInstance, (contextMethodInstance != NULL) ? contextMethodInstance->GetOwner() : NULL);
|
||||||
|
SetAndRestoreValue<BfMethodInstance*> prevMethodInstance(mCeModule->mCurMethodInstance, contextMethodInstance);
|
||||||
|
|
||||||
|
if (ceFunction->mMethodInstance != NULL)
|
||||||
|
err += mCeModule->MethodToString(ceFunction->mMethodInstance, BfMethodNameFlag_OmitParams);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
err += mCeModule->MethodToString(ceFunction->mCeInnerFunctionInfo->mOwner->mMethodInstance, BfMethodNameFlag_OmitParams);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (emitEntry != NULL)
|
if (emitEntry != NULL)
|
||||||
|
@ -2831,6 +2845,8 @@ addr_ce CeMachine::GetReflectType(int typeId)
|
||||||
if (!mReflectMap.TryAdd(typeId, NULL, &addrPtr))
|
if (!mReflectMap.TryAdd(typeId, NULL, &addrPtr))
|
||||||
return *addrPtr;
|
return *addrPtr;
|
||||||
|
|
||||||
|
SetAndRestoreValue<bool> ignoreWrites(mCeModule->mBfIRBuilder->mIgnoreWrites, false);
|
||||||
|
|
||||||
if (mCeModule->mContext->mBfTypeType == NULL)
|
if (mCeModule->mContext->mBfTypeType == NULL)
|
||||||
mCeModule->mContext->ReflectInit();
|
mCeModule->mContext->ReflectInit();
|
||||||
|
|
||||||
|
@ -2981,9 +2997,12 @@ void CeMachine::DerefMethodInfo(CeFunctionInfo* ceFunctionInfo)
|
||||||
return;
|
return;
|
||||||
BF_ASSERT(ceFunctionInfo->mMethodInstance == NULL);
|
BF_ASSERT(ceFunctionInfo->mMethodInstance == NULL);
|
||||||
|
|
||||||
auto itr = mNamedFunctionMap.Find(ceFunctionInfo->mName);
|
if (!ceFunctionInfo->mName.IsEmpty())
|
||||||
if (itr->mValue == ceFunctionInfo)
|
{
|
||||||
mNamedFunctionMap.Remove(itr);
|
auto itr = mNamedFunctionMap.Find(ceFunctionInfo->mName);
|
||||||
|
if (itr->mValue == ceFunctionInfo)
|
||||||
|
mNamedFunctionMap.Remove(itr);
|
||||||
|
}
|
||||||
delete ceFunctionInfo;
|
delete ceFunctionInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue