MCPcopy Create free account
hub / github.com/beefytech/Beef / Cast

Method Cast

IDEHelper/Compiler/BfModuleTypeUtils.cpp:15068–15367  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

15066}
15067
15068BfTypedValue BfModule::Cast(BfAstNode* srcNode, const BfTypedValue& typedVal, BfType* toType, BfCastFlags castFlags)
15069{
15070 bool explicitCast = (castFlags & BfCastFlags_Explicit) != 0;
15071
15072 if (typedVal.mType == toType)
15073 return typedVal;
15074
15075 if ((toType->IsSizedArray()) && (typedVal.mType->IsSizedArray()))
15076 {
15077 // Retain our type if we're casting from a known-sized array to an unknown-sized arrays
15078 if ((toType->IsUndefSizedArray()) && ((typedVal.mType->GetUnderlyingType()) == (toType->GetUnderlyingType())))
15079 {
15080 return typedVal;
15081 }
15082 }
15083
15084 if ((castFlags & BfCastFlags_Force) != 0)
15085 {
15086 PopulateType(toType, BfPopulateType_Data);
15087 if (toType->IsValuelessType())
15088 return BfTypedValue(mBfIRBuilder->GetFakeVal(), toType);
15089
15090 if ((typedVal.mType->IsValueType()) && (!typedVal.IsAddr()) && (typedVal.IsSplat()) && (toType->IsValueType()))
15091 {
15092 bool needsMemberCasting = false;
15093 if (AreSplatsCompatible(typedVal.mType, toType, &needsMemberCasting))
15094 {
15095 return BfTypedValue(typedVal.mValue, toType, needsMemberCasting ? BfTypedValueKind_SplatHead_NeedsCasting : BfTypedValueKind_SplatHead);
15096 }
15097 }
15098
15099 if (typedVal.mType->IsValueType())
15100 {
15101 auto addrTypedValue = MakeAddressable(typedVal);
15102 auto toPtrType = CreatePointerType(toType);
15103 return BfTypedValue(mBfIRBuilder->CreateBitCast(addrTypedValue.mValue, mBfIRBuilder->MapType(toPtrType)), toType, BfTypedValueKind_Addr);
15104 }
15105 return BfTypedValue(mBfIRBuilder->CreateBitCast(typedVal.mValue, mBfIRBuilder->MapType(toType)), toType);
15106 }
15107
15108 // This tuple cast may create a new type if the toType contains 'var' entries
15109 if ((typedVal.mType->IsTuple()) && (toType->IsTuple()))
15110 {
15111 PopulateType(toType);
15112
15113 auto fromTupleType = (BfTypeInstance*)typedVal.mType;
15114 auto toTupleType = (BfTypeInstance*)toType;
15115 if (fromTupleType == toTupleType)
15116 return typedVal;
15117
15118 if (fromTupleType->mFieldInstances.size() == toTupleType->mFieldInstances.size())
15119 {
15120 BfTypeVector fieldTypes;
15121 Array<String> fieldNames;
15122 bool isCompatible = true;
15123 bool isExactTypeMatch = true;
15124
15125 for (int fieldIdx = 0; fieldIdx < (int)fromTupleType->mFieldInstances.size(); fieldIdx++)

Callers 15

ResolveMethod · 0.45
EmitTestMethodMethod · 0.45
CallMethod · 0.45
LoadLocalMethod · 0.45
LoadPropertyMethod · 0.45
LookupFieldMethod · 0.45
CreateCallMethod · 0.45
MakeBaseConcreteMethod · 0.45
ResolveArgValueMethod · 0.45
CheckEnumCreationMethod · 0.45
MatchMethodMethod · 0.45

Calls 15

BfTypedValueClass · 0.85
FailFunction · 0.85
TypeToStringFunction · 0.85
GetFakeValMethod · 0.80
IsAddrMethod · 0.80
IsSplatMethod · 0.80
MapTypeMethod · 0.80
GetFieldDefMethod · 0.80
IsUnnamedTupleFieldMethod · 0.80
MapTypeInstPtrMethod · 0.80
GetResolvedTypeMethod · 0.80
CreateInBoundsGEPMethod · 0.80

Tested by

no test coverage detected