mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-08 19:48:20 +02:00
Fixed enum comparison to int when there's an int conversion operator
This commit is contained in:
parent
70c2131c18
commit
dfbb09a8ac
4 changed files with 41 additions and 22 deletions
|
@ -923,16 +923,22 @@ void BfAutoComplete::AddTypeMembers(BfTypeInstance* typeInst, bool addStatic, bo
|
||||||
addNonStatic = true;
|
addNonStatic = true;
|
||||||
|
|
||||||
auto activeTypeDef = mModule->GetActiveTypeDef();
|
auto activeTypeDef = mModule->GetActiveTypeDef();
|
||||||
|
|
||||||
|
#define CHECK_STATIC(staticVal) ((staticVal && addStatic) || (!staticVal && addNonStatic))
|
||||||
|
|
||||||
|
mModule->PopulateType(typeInst, BfPopulateType_Data);
|
||||||
|
|
||||||
if ((addStatic) && (mModule->mCurMethodInstance == NULL) && (typeInst->IsEnum()) && (allowImplicitThis))
|
if ((addStatic) && (mModule->mCurMethodInstance == NULL) && (typeInst->IsEnum()) && (allowImplicitThis))
|
||||||
{
|
{
|
||||||
AddEntry(AutoCompleteEntry("value", "_"), filter);
|
AddEntry(AutoCompleteEntry("value", "_"), filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CHECK_STATIC(staticVal) ((staticVal && addStatic) || (!staticVal && addNonStatic))
|
if ((typeInst->IsEnum()) && (typeInst->IsTypedPrimitive()))
|
||||||
|
{
|
||||||
mModule->PopulateType(typeInst, BfPopulateType_Data);
|
if (typeInst->IsTypedPrimitive())
|
||||||
|
AddEntry(AutoCompleteEntry("valuetype", "UnderlyingType"), filter);
|
||||||
|
}
|
||||||
|
|
||||||
BfShow checkShow = (startType == typeInst) ? BfShow_Hide : BfShow_HideIndirect;
|
BfShow checkShow = (startType == typeInst) ? BfShow_Hide : BfShow_HideIndirect;
|
||||||
|
|
||||||
BfProtectionCheckFlags protectionCheckFlags = BfProtectionCheckFlag_None;
|
BfProtectionCheckFlags protectionCheckFlags = BfProtectionCheckFlag_None;
|
||||||
|
|
|
@ -24208,6 +24208,7 @@ void BfExprEvaluator::AddStrings(const BfTypedValue& leftValue, const BfTypedVal
|
||||||
void BfExprEvaluator::PerformBinaryOperation(BfAstNode* leftExpression, BfAstNode* rightExpression, BfBinaryOp binaryOp, BfAstNode* opToken, BfBinOpFlags flags, BfTypedValue leftValue, BfTypedValue rightValue)
|
void BfExprEvaluator::PerformBinaryOperation(BfAstNode* leftExpression, BfAstNode* rightExpression, BfBinaryOp binaryOp, BfAstNode* opToken, BfBinOpFlags flags, BfTypedValue leftValue, BfTypedValue rightValue)
|
||||||
{
|
{
|
||||||
bool noClassify = (flags & BfBinOpFlag_NoClassify) != 0;
|
bool noClassify = (flags & BfBinOpFlag_NoClassify) != 0;
|
||||||
|
bool forceRightType = (flags & BfBinOpFlag_ForceRightType) != 0;
|
||||||
bool forceLeftType = (flags & BfBinOpFlag_ForceLeftType) != 0;
|
bool forceLeftType = (flags & BfBinOpFlag_ForceLeftType) != 0;
|
||||||
bool deferRight = (flags & BfBinOpFlag_DeferRight) != 0;
|
bool deferRight = (flags & BfBinOpFlag_DeferRight) != 0;
|
||||||
|
|
||||||
|
@ -24271,7 +24272,11 @@ void BfExprEvaluator::PerformBinaryOperation(BfAstNode* leftExpression, BfAstNod
|
||||||
}
|
}
|
||||||
|
|
||||||
auto resultType = leftValue.mType;
|
auto resultType = leftValue.mType;
|
||||||
if (!forceLeftType)
|
if (forceRightType)
|
||||||
|
{
|
||||||
|
resultType = rightValue.mType;
|
||||||
|
}
|
||||||
|
else if (!forceLeftType)
|
||||||
{
|
{
|
||||||
bool handled = false;
|
bool handled = false;
|
||||||
|
|
||||||
|
@ -24974,7 +24979,7 @@ void BfExprEvaluator::PerformBinaryOperation(BfAstNode* leftExpression, BfAstNod
|
||||||
AddStrings(leftValue, rightValue, opToken);
|
AddStrings(leftValue, rightValue, opToken);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: Allow all pointer comparisons, but only allow SUBTRACTION between equal pointer types
|
//TODO: Allow all pointer comparisons, but only allow SUBTRACTION between equal pointer types
|
||||||
if ((binaryOp == BfBinaryOp_Subtract) || (binaryOp == BfBinaryOp_OverflowSubtract))
|
if ((binaryOp == BfBinaryOp_Subtract) || (binaryOp == BfBinaryOp_OverflowSubtract))
|
||||||
{
|
{
|
||||||
|
@ -25162,11 +25167,26 @@ void BfExprEvaluator::PerformBinaryOperation(BfAstNode* leftExpression, BfAstNod
|
||||||
}
|
}
|
||||||
|
|
||||||
if (needsOtherCast)
|
if (needsOtherCast)
|
||||||
{
|
{
|
||||||
// The only purpose of this cast is to potentially throw a casting error
|
BfCastFlags castFlags = (BfCastFlags)((explicitCast ? BfCastFlags_Explicit : BfCastFlags_None) | BfCastFlags_SilentFail);
|
||||||
BfIRValue otherCastResult = mModule->CastToValue(otherTypeSrc, *otherTypedValue, resultType, explicitCast ? BfCastFlags_Explicit : BfCastFlags_None);
|
BfIRValue otherCastResult = mModule->CastToValue(otherTypeSrc, *otherTypedValue, resultType, castFlags);
|
||||||
if (!otherCastResult)
|
if (!otherCastResult)
|
||||||
return;
|
{
|
||||||
|
// We picked the wrong type, try the other one...
|
||||||
|
if (mModule->CanCast(*resultTypedValue, otherType))
|
||||||
|
{
|
||||||
|
BfBinOpFlags newFlags = flags;
|
||||||
|
if (otherTypedValue == &leftValue)
|
||||||
|
newFlags = (BfBinOpFlags)(flags | BfBinOpFlag_ForceLeftType & ~BfBinOpFlag_ForceRightType & ~BfBinOpFlag_DeferRight);
|
||||||
|
else
|
||||||
|
newFlags = (BfBinOpFlags)(flags | BfBinOpFlag_ForceRightType & ~BfBinOpFlag_ForceLeftType & ~BfBinOpFlag_DeferRight);
|
||||||
|
return PerformBinaryOperation(leftExpression, rightExpression, binaryOp, opToken, newFlags, leftValue, rightValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do again but with an error
|
||||||
|
castFlags = (BfCastFlags)(castFlags & ~BfCastFlags_SilentFail);
|
||||||
|
otherCastResult = mModule->CastToValue(otherTypeSrc, *otherTypedValue, resultType, castFlags);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -395,9 +395,10 @@ enum BfBinOpFlags
|
||||||
BfBinOpFlag_None = 0,
|
BfBinOpFlag_None = 0,
|
||||||
BfBinOpFlag_NoClassify = 1,
|
BfBinOpFlag_NoClassify = 1,
|
||||||
BfBinOpFlag_ForceLeftType = 2,
|
BfBinOpFlag_ForceLeftType = 2,
|
||||||
BfBinOpFlag_IgnoreOperatorWithWrongResult = 4,
|
BfBinOpFlag_ForceRightType = 4,
|
||||||
BfBinOpFlag_IsConstraintCheck = 8,
|
BfBinOpFlag_IgnoreOperatorWithWrongResult = 8,
|
||||||
BfBinOpFlag_DeferRight = 0x10
|
BfBinOpFlag_IsConstraintCheck = 0x10,
|
||||||
|
BfBinOpFlag_DeferRight = 0x20
|
||||||
};
|
};
|
||||||
|
|
||||||
class BfExprEvaluator : public BfStructuralVisitor
|
class BfExprEvaluator : public BfStructuralVisitor
|
||||||
|
|
|
@ -6886,14 +6886,6 @@ bool CeContext::Execute(CeFunction* startFunction, uint8* startStackPtr, uint8*
|
||||||
SetAndRestoreValue<BfTypeInstance*> prevTypeInstance(mCurModule->mCurTypeInstance, mCallerTypeInstance);
|
SetAndRestoreValue<BfTypeInstance*> prevTypeInstance(mCurModule->mCurTypeInstance, mCallerTypeInstance);
|
||||||
SetAndRestoreValue<bool> emitIgnoreWrites(ceModule->mBfIRBuilder->mIgnoreWrites, ignoreWrites.mPrevVal);
|
SetAndRestoreValue<bool> emitIgnoreWrites(ceModule->mBfIRBuilder->mIgnoreWrites, ignoreWrites.mPrevVal);
|
||||||
|
|
||||||
// int32 strInstAddr = *(int32*)((uint8*)stackPtr + 0);
|
|
||||||
// String emitStr;
|
|
||||||
// if (!GetStringFromAddr(strInstAddr, emitStr))
|
|
||||||
// {
|
|
||||||
// _Fail("Invalid String");
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
|
|
||||||
addr_ce strViewPtr = *(addr_ce*)((uint8*)stackPtr);
|
addr_ce strViewPtr = *(addr_ce*)((uint8*)stackPtr);
|
||||||
String emitStr;
|
String emitStr;
|
||||||
if (!GetStringFromStringView(strViewPtr, emitStr))
|
if (!GetStringFromStringView(strViewPtr, emitStr))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue