mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-22 01:37:59 +02:00
Improvements to overflow arithmetic
This commit is contained in:
parent
eb375362a1
commit
bf97431cdb
12 changed files with 91 additions and 45 deletions
|
@ -1513,6 +1513,12 @@ const char* Beefy::BfTokenToString(BfToken token)
|
|||
return "&+";
|
||||
case BfToken_AndStar:
|
||||
return "&*";
|
||||
case BfToken_AndMinusEquals:
|
||||
return "&-=";
|
||||
case BfToken_AndPlusEquals:
|
||||
return "&+=";
|
||||
case BfToken_AndStarEquals:
|
||||
return "&*=";
|
||||
case BfToken_OrEquals:
|
||||
return "|=";
|
||||
case BfToken_XorEquals:
|
||||
|
@ -1620,6 +1626,12 @@ BfBinaryOp Beefy::BfAssignOpToBinaryOp(BfAssignmentOp assignmentOp)
|
|||
return BfBinaryOp_Multiply;
|
||||
case BfAssignmentOp_Divide:
|
||||
return BfBinaryOp_Divide;
|
||||
case BfAssignmentOp_OverflowAdd:
|
||||
return BfBinaryOp_OverflowAdd;
|
||||
case BfAssignmentOp_OverflowSubtract:
|
||||
return BfBinaryOp_OverflowSubtract;
|
||||
case BfAssignmentOp_OverflowMultiply:
|
||||
return BfBinaryOp_OverflowMultiply;
|
||||
case BfAssignmentOp_Modulus:
|
||||
return BfBinaryOp_Modulus;
|
||||
case BfAssignmentOp_ShiftLeft:
|
||||
|
@ -1898,7 +1910,13 @@ BfAssignmentOp Beefy::BfTokenToAssignmentOp(BfToken token)
|
|||
case BfToken_MinusEquals:
|
||||
return BfAssignmentOp_Subtract;
|
||||
case BfToken_MultiplyEquals:
|
||||
return BfAssignmentOp_Multiply;
|
||||
return BfAssignmentOp_Multiply;
|
||||
case BfToken_AndPlusEquals:
|
||||
return BfAssignmentOp_OverflowAdd;
|
||||
case BfToken_AndMinusEquals:
|
||||
return BfAssignmentOp_OverflowSubtract;
|
||||
case BfToken_AndStarEquals:
|
||||
return BfAssignmentOp_OverflowMultiply;
|
||||
case BfToken_DivideEquals:
|
||||
return BfAssignmentOp_Divide;
|
||||
case BfToken_ModulusEquals:
|
||||
|
|
|
@ -205,7 +205,6 @@ enum BfToken : uint8
|
|||
BfToken_PlusEquals,
|
||||
BfToken_MinusEquals,
|
||||
BfToken_MultiplyEquals,
|
||||
|
||||
BfToken_DivideEquals,
|
||||
BfToken_ModulusEquals,
|
||||
BfToken_ShiftLeftEquals,
|
||||
|
@ -214,6 +213,9 @@ enum BfToken : uint8
|
|||
BfToken_AndMinus,
|
||||
BfToken_AndPlus,
|
||||
BfToken_AndStar,
|
||||
BfToken_AndMinusEquals,
|
||||
BfToken_AndPlusEquals,
|
||||
BfToken_AndStarEquals,
|
||||
BfToken_OrEquals,
|
||||
BfToken_XorEquals,
|
||||
BfToken_NullCoalsceEquals,
|
||||
|
@ -1843,6 +1845,9 @@ enum BfAssignmentOp
|
|||
BfAssignmentOp_Add,
|
||||
BfAssignmentOp_Subtract,
|
||||
BfAssignmentOp_Multiply,
|
||||
BfAssignmentOp_OverflowAdd,
|
||||
BfAssignmentOp_OverflowSubtract,
|
||||
BfAssignmentOp_OverflowMultiply,
|
||||
BfAssignmentOp_Divide,
|
||||
BfAssignmentOp_Modulus,
|
||||
BfAssignmentOp_ShiftLeft,
|
||||
|
|
|
@ -22667,6 +22667,8 @@ void BfExprEvaluator::PerformBinaryOperation(BfType* resultType, BfIRValue convL
|
|||
|
||||
auto _GetOverflowKind = [&](bool wantOverflow)
|
||||
{
|
||||
if (resultType->IsFloat())
|
||||
return BfOverflowCheckKind_None;
|
||||
if (!wantOverflow)
|
||||
return BfOverflowCheckKind_None;
|
||||
if (mModule->GetDefaultCheckedKind() != BfCheckedKind_Checked)
|
||||
|
|
|
@ -1559,17 +1559,35 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate)
|
|||
}
|
||||
else if (mSrc[mSrcIdx] == '+')
|
||||
{
|
||||
mToken = BfToken_AndPlus;
|
||||
if (mSrc[mSrcIdx + 1] == '=')
|
||||
{
|
||||
mToken = BfToken_AndPlusEquals;
|
||||
++mSrcIdx;
|
||||
}
|
||||
else
|
||||
mToken = BfToken_AndPlus;
|
||||
mTokenEnd = ++mSrcIdx;
|
||||
}
|
||||
else if (mSrc[mSrcIdx] == '-')
|
||||
{
|
||||
mToken = BfToken_AndMinus;
|
||||
if (mSrc[mSrcIdx + 1] == '=')
|
||||
{
|
||||
mToken = BfToken_AndMinusEquals;
|
||||
++mSrcIdx;
|
||||
}
|
||||
else
|
||||
mToken = BfToken_AndMinus;
|
||||
mTokenEnd = ++mSrcIdx;
|
||||
}
|
||||
else if (mSrc[mSrcIdx] == '*')
|
||||
{
|
||||
mToken = BfToken_AndStar;
|
||||
if (mSrc[mSrcIdx + 1] == '=')
|
||||
{
|
||||
mToken = BfToken_AndStarEquals;
|
||||
++mSrcIdx;
|
||||
}
|
||||
else
|
||||
mToken = BfToken_AndStar;
|
||||
mTokenEnd = ++mSrcIdx;
|
||||
}
|
||||
else
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue