mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-11 21:04:10 +02:00
Improved enum displays and [Type] for System.Type
This commit is contained in:
parent
7dc09b38f9
commit
e64ba8a8a3
1 changed files with 104 additions and 41 deletions
|
@ -3313,7 +3313,12 @@ String CeDebugger::TypedValueToString(const BfTypedValue& origTypedValue, const
|
||||||
|
|
||||||
if (typedValue.mType->IsEnum())
|
if (typedValue.mType->IsEnum())
|
||||||
{
|
{
|
||||||
|
if (formatInfo.mRawString)
|
||||||
|
return "";
|
||||||
|
|
||||||
String retVal;
|
String retVal;
|
||||||
|
if (typedValue.mType->IsTypedPrimitive())
|
||||||
|
{
|
||||||
int64 bitsLeft = ValueToInt(typedValue);
|
int64 bitsLeft = ValueToInt(typedValue);
|
||||||
int valueCount = 0;
|
int valueCount = 0;
|
||||||
|
|
||||||
|
@ -3377,6 +3382,47 @@ String CeDebugger::TypedValueToString(const BfTypedValue& origTypedValue, const
|
||||||
|
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
else if (typedValue.mType->mDefineState >= BfTypeDefineState_Defined)
|
||||||
|
{
|
||||||
|
auto typeInst = typedValue.mType->ToTypeInstance();
|
||||||
|
BfType* dscrType = typeInst->GetDiscriminatorType();
|
||||||
|
BfType* payloadType = typeInst->GetUnionInnerType();
|
||||||
|
|
||||||
|
int dscrOffset = BF_ALIGN(payloadType->mSize, dscrType->mAlign);
|
||||||
|
|
||||||
|
int dscrVal = 0;
|
||||||
|
memcpy(&dscrVal, data + dscrOffset, dscrType->mSize);
|
||||||
|
|
||||||
|
for (auto& fieldInstance : typeInst->mFieldInstances)
|
||||||
|
{
|
||||||
|
auto fieldDef = fieldInstance.GetFieldDef();
|
||||||
|
if (!fieldInstance.mIsEnumPayloadCase)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int tagId = -fieldInstance.mDataIdx - 1;
|
||||||
|
if (dscrVal == tagId)
|
||||||
|
{
|
||||||
|
auto evalResult = BfTypedValue(module->mBfIRBuilder->CreateConstAggCE(
|
||||||
|
module->mBfIRBuilder->MapType(fieldInstance.mResolvedType), (addr_ce)dataAddr), fieldInstance.mResolvedType, true);
|
||||||
|
|
||||||
|
String innerResult = TypedValueToString(evalResult, "", formatInfo, NULL);
|
||||||
|
int crPos = (int)innerResult.IndexOf('\n');
|
||||||
|
if (crPos != -1)
|
||||||
|
innerResult.RemoveToEnd(crPos);
|
||||||
|
|
||||||
|
retVal += ".";
|
||||||
|
retVal += fieldDef->mName;
|
||||||
|
retVal += innerResult;
|
||||||
|
|
||||||
|
retVal += "\n" + TypeToString(origTypedValue.mType, typeModKind);
|
||||||
|
retVal += "\n:canEdit";
|
||||||
|
|
||||||
|
retVal += "\n" + GetMemberList(fieldInstance.mResolvedType, addr, dataAddr, false);
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (typedValue.mType->IsTypedPrimitive())
|
if (typedValue.mType->IsTypedPrimitive())
|
||||||
{
|
{
|
||||||
|
@ -3737,6 +3783,23 @@ String CeDebugger::TypedValueToString(const BfTypedValue& origTypedValue, const
|
||||||
}
|
}
|
||||||
else if ((!isNull) && (!isBadSrc))
|
else if ((!isNull) && (!isBadSrc))
|
||||||
{
|
{
|
||||||
|
if (memberListType->IsInstanceOf(mCompiler->mTypeTypeDef))
|
||||||
|
{
|
||||||
|
auto typeInst = memberListType->ToTypeInstance();
|
||||||
|
auto typeIdField = typeInst->mTypeDef->GetFieldByName("mTypeId");
|
||||||
|
if (typeIdField != NULL)
|
||||||
|
{
|
||||||
|
auto& fieldInstance = typeInst->mFieldInstances[typeIdField->mIdx];
|
||||||
|
int typeId = 0;
|
||||||
|
memcpy(&typeId, data + fieldInstance.mDataOffset, fieldInstance.mResolvedType->mSize);
|
||||||
|
auto typeType = mCompiler->mContext->FindTypeById(typeId);
|
||||||
|
if (typeType != NULL)
|
||||||
|
{
|
||||||
|
retVal += "\n[Type]\t" + module->TypeToString(typeType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
retVal += "\n" + GetMemberList(memberListType, addr, dataAddr, false);
|
retVal += "\n" + GetMemberList(memberListType, addr, dataAddr, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue