mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-08 19:48:20 +02:00
Made a different restricted temp address
for return values
This commit is contained in:
parent
963f4fedfc
commit
a2a1b486a2
3 changed files with 8 additions and 6 deletions
|
@ -536,6 +536,7 @@ enum BfTypedValueKind
|
|||
BfTypedValueKind_Addr,
|
||||
BfTypedValueKind_ReadOnlyAddr,
|
||||
BfTypedValueKind_TempAddr,
|
||||
BfTypedValueKind_RestrictedTempAddr,
|
||||
BfTypedValueKind_ReadOnlyTempAddr,
|
||||
BfTypedValueKind_ThisAddr,
|
||||
BfTypedValueKind_BaseAddr,
|
||||
|
@ -647,7 +648,7 @@ public:
|
|||
|
||||
bool IsTempAddr() const
|
||||
{
|
||||
return ((mKind == BfTypedValueKind_ReadOnlyTempAddr) || (mKind == BfTypedValueKind_TempAddr));
|
||||
return ((mKind == BfTypedValueKind_ReadOnlyTempAddr) || (mKind == BfTypedValueKind_RestrictedTempAddr) || (mKind == BfTypedValueKind_TempAddr));
|
||||
}
|
||||
|
||||
bool IsReadOnly() const
|
||||
|
@ -727,6 +728,7 @@ public:
|
|||
mKind = BfTypedValueKind_ReadOnlyAddr;
|
||||
break;
|
||||
case BfTypedValueKind_TempAddr:
|
||||
case BfTypedValueKind_RestrictedTempAddr:
|
||||
mKind = BfTypedValueKind_ReadOnlyTempAddr;
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -4516,7 +4516,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfMethodInstance* methodInstance, BfIRV
|
|||
{
|
||||
auto val = mModule->GetDefaultTypedValue(returnType, true, (methodInstance->GetStructRetIdx() != -1) ? BfDefaultValueKind_Addr : BfDefaultValueKind_Value);
|
||||
if (val.mKind == BfTypedValueKind_Addr)
|
||||
val.mKind = BfTypedValueKind_TempAddr;
|
||||
val.mKind = BfTypedValueKind_RestrictedTempAddr;
|
||||
return val;
|
||||
}
|
||||
};
|
||||
|
@ -4543,7 +4543,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfMethodInstance* methodInstance, BfIRV
|
|||
|
||||
if (sret == NULL)
|
||||
{
|
||||
sretVal = BfTypedValue(mModule->CreateAlloca(returnType), returnType, BfTypedValueKind_TempAddr);
|
||||
sretVal = BfTypedValue(mModule->CreateAlloca(returnType), returnType, BfTypedValueKind_RestrictedTempAddr);
|
||||
sret = &sretVal;
|
||||
}
|
||||
}
|
||||
|
@ -5008,7 +5008,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfMethodInstance* methodInstance, BfIRV
|
|||
loweredIRType = mModule->mBfIRBuilder->GetPointerTo(loweredIRType);
|
||||
auto castedRetVal = mModule->mBfIRBuilder->CreateBitCast(retVal, loweredIRType);
|
||||
mModule->mBfIRBuilder->CreateStore(callInst, castedRetVal);
|
||||
result = BfTypedValue(retVal, methodInstance->mReturnType, BfTypedValueKind_TempAddr);
|
||||
result = BfTypedValue(retVal, methodInstance->mReturnType, BfTypedValueKind_RestrictedTempAddr);
|
||||
}
|
||||
else
|
||||
result = BfTypedValue(callInst, methodInstance->mReturnType);
|
||||
|
@ -8440,7 +8440,7 @@ void BfExprEvaluator::Visit(BfInitializerExpression* initExpr)
|
|||
StringT<128> findName;
|
||||
identifierNode->ToString(findName);
|
||||
fieldResult = LookupField(identifierNode, initValue, findName, BfLookupFieldFlag_IsImplicitThis);
|
||||
if (fieldResult.mKind == BfTypedValueKind_TempAddr)
|
||||
if ((fieldResult.mKind == BfTypedValueKind_TempAddr) || (fieldResult.mKind == BfTypedValueKind_RestrictedTempAddr))
|
||||
fieldResult.mKind = BfTypedValueKind_Addr;
|
||||
|
||||
wasValidInitKind = true;
|
||||
|
|
|
@ -11102,7 +11102,7 @@ bool BfModule::CheckModifyValue(BfTypedValue& typedValue, BfAstNode* refNode, co
|
|||
return false;
|
||||
}
|
||||
|
||||
if (typedValue.mKind == BfTypedValueKind_TempAddr)
|
||||
if (typedValue.mKind == BfTypedValueKind_RestrictedTempAddr)
|
||||
{
|
||||
Fail(StrFormat("Cannot %s temporary value", modifyType), refNode);
|
||||
return false;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue