1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 04:22:20 +02:00

Cache ConstExpr ToString, fix const arg int comparison in cast

This commit is contained in:
Brian Fiete 2024-02-13 08:35:10 -05:00
parent 337a94b8b5
commit d341104a57
5 changed files with 27 additions and 11 deletions

View file

@ -2193,9 +2193,14 @@ void BfContext::UpdateRevisedTypes()
} }
// Rebuild all types // Rebuild all types
Array<BfType*> allTypes;
for (auto type : mResolvedTypes) for (auto type : mResolvedTypes)
allTypes.Add(type);
for (auto type : allTypes)
{ {
RebuildType(type); if (!type->IsDeleting())
RebuildType(type);
} }
} }

View file

@ -466,6 +466,11 @@ void BfIRConstHolder::pv(const BfIRValue& irValue)
void BfIRConstHolder::FixTypeCode(BfTypeCode& typeCode) void BfIRConstHolder::FixTypeCode(BfTypeCode& typeCode)
{ {
if (typeCode == BfTypeCode_IntUnknown)
typeCode = BfTypeCode_Int64;
if (typeCode == BfTypeCode_UIntUnknown)
typeCode = BfTypeCode_UInt64;
if (typeCode == BfTypeCode_IntPtr) if (typeCode == BfTypeCode_IntPtr)
{ {
if (mModule->mSystem->mPtrSize == 4) if (mModule->mSystem->mPtrSize == 4)
@ -740,11 +745,6 @@ BfIRType BfIRConstHolder::GetSizedArrayType(BfIRType elementType, int length)
BfIRValue BfIRConstHolder::CreateConst(BfTypeCode typeCode, uint64 val) BfIRValue BfIRConstHolder::CreateConst(BfTypeCode typeCode, uint64 val)
{ {
if (typeCode == BfTypeCode_IntUnknown)
typeCode = BfTypeCode_Int64;
else if (typeCode == BfTypeCode_UIntUnknown)
typeCode = BfTypeCode_UInt64;
FixTypeCode(typeCode); FixTypeCode(typeCode);
BfConstant* constant = mTempAlloc.Alloc<BfConstant>(); BfConstant* constant = mTempAlloc.Alloc<BfConstant>();
constant->mTypeCode = typeCode; constant->mTypeCode = typeCode;

View file

@ -12842,6 +12842,13 @@ BfVariant BfModule::TypedValueToVariant(BfAstNode* refNode, const BfTypedValue&
case BfTypeCode_Char32: case BfTypeCode_Char32:
case BfTypeCode_StringId: case BfTypeCode_StringId:
variant.mTypeCode = constant->mTypeCode; variant.mTypeCode = constant->mTypeCode;
if (((variant.mTypeCode == BfTypeCode_Int64) || (variant.mTypeCode == BfTypeCode_UInt64)) &&
(primType->mSize > 0) && (primType->mSize < 8) &&
(mBfIRBuilder->IsIntable(primType->GetTypeCode())))
{
// We may have an 'int unknown' that we need to downsize
variant.mTypeCode = primType->GetTypeCode();
}
variant.mInt64 = constant->mInt64; variant.mInt64 = constant->mInt64;
break; break;
case BfTypeCode_Float: case BfTypeCode_Float:

View file

@ -13786,7 +13786,7 @@ BfIRValue BfModule::CastToValue(BfAstNode* srcNode, BfTypedValue typedVal, BfTyp
auto variantVal = TypedValueToVariant(srcNode, typedVal, true); auto variantVal = TypedValueToVariant(srcNode, typedVal, true);
if ((mBfIRBuilder->IsIntable(variantVal.mTypeCode)) && (mBfIRBuilder->IsIntable(toConstExprValueType->mValue.mTypeCode))) if ((mBfIRBuilder->IsIntable(variantVal.mTypeCode)) && (mBfIRBuilder->IsIntable(toConstExprValueType->mValue.mTypeCode)))
{ {
if (variantVal == toConstExprValueType->mValue) if (variantVal.mUInt64 == toConstExprValueType->mValue.mUInt64)
return typedVal.mValue; return typedVal.mValue;
} }
else if ((mBfIRBuilder->IsFloat(variantVal.mTypeCode)) && (mBfIRBuilder->IsFloat(toConstExprValueType->mValue.mTypeCode))) else if ((mBfIRBuilder->IsFloat(variantVal.mTypeCode)) && (mBfIRBuilder->IsFloat(toConstExprValueType->mValue.mTypeCode)))
@ -16210,7 +16210,10 @@ void BfModule::DoTypeToString(StringImpl& str, BfType* resolvedType, BfTypeNameF
} }
} }
VariantToString(str, constExprValueType->mValue, constExprValueType->mType); if (constExprValueType->mValueString.IsEmpty())
VariantToString(constExprValueType->mValueString, constExprValueType->mValue, constExprValueType->mType);
str += constExprValueType->mValueString;
return; return;
} }

View file

@ -2611,6 +2611,7 @@ class BfConstExprValueType : public BfDependedType
public: public:
BfType* mType; BfType* mType;
BfVariant mValue; BfVariant mValue;
String mValueString;
public: public:
~BfConstExprValueType(); ~BfConstExprValueType();