Skip to content

Add support for user linked lists without size specifier in xml #68

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 39 additions & 14 deletions solution/GraphicalDebugging/ExpressionLoader_UserDefined.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
using System.Collections.Generic;
using System.Globalization;
using System.Threading;
using System.Windows.Documents;

namespace GraphicalDebugging
{
Expand Down Expand Up @@ -158,7 +159,7 @@ public Loader Create(Loaders loaders, Debugger debugger, string name, string typ
return null;

exprHeadPointer.Reinitialize(debugger, name, type);
exprSize.Reinitialize(debugger, name, type);
exprSize?.Reinitialize(debugger, name, type);
string headName = '*' + exprHeadPointer.GetString(name);
string headType = debugger.GetValueType(headName);
exprNextPointer.Reinitialize(debugger, headName, headType);
Expand All @@ -173,7 +174,7 @@ public Loader Create(Loaders loaders, Debugger debugger, string name, string typ
return new UserLinkedList(exprHeadPointer.DeepCopy(),
exprNextPointer.DeepCopy(),
exprValue.DeepCopy(),
exprSize.DeepCopy(),
exprSize?.DeepCopy(),
elemType);
}

Expand Down Expand Up @@ -207,7 +208,26 @@ public override void ElementInfo(string name, string type,

public override int LoadSize(Debugger debugger, string name)
{
return debugger.TryLoadUInt(exprSize.GetString(name), out int result) ? result : 0;
if (exprSize != null)
return debugger.TryLoadUInt(exprSize.GetString(name), out int result) ? result : 0;

string nodeName = exprHeadPointer.GetString(name);
if (!debugger.GetPointer(nodeName, out ulong headNodePtr))
return 0;

var size = 0;
var nodePtr = headNodePtr;
do
{
++size;

nodeName = exprNextPointer.GetString('*' + nodeName);
if (!debugger.GetPointer(nodeName, out nodePtr))
return size;
}
while (nodePtr != 0 && nodePtr != headNodePtr);

return size;
}

public override Size LoadSize(MemoryReader mreader, ulong address)
Expand All @@ -224,8 +244,8 @@ public override bool ForEachMemoryBlock<T>(MemoryReader mreader, Debugger debugg
if (mreader == null)
return false;

int size = LoadSize(debugger, name);
if (size <= 0)
int size = exprSize != null ? LoadSize(debugger, name) : 0;
if (exprSize != null && size <= 0)
return true;

string headPointerName = exprHeadPointer.GetString(name);
Expand All @@ -243,10 +263,14 @@ public override bool ForEachMemoryBlock<T>(MemoryReader mreader, Debugger debugg

if (!debugger.GetAddressOffset(headName, nextPointerName, out long nextDiff)
|| !debugger.GetAddressOffset(headName, valName, out long valDiff)
|| !debugger.GetValueAddress(headName, out ulong nodeAddress))
|| !debugger.GetValueAddress(headName, out ulong headNodeAddress))
return false;

for (int i = 0; i < size; ++i)
if (headNodeAddress == 0)
return true;

var nodeAddress = headNodeAddress;
for (int i = 0; exprSize == null || i < size; ++i)
{
T[] values = new T[elementConverter.ValueCount()];
if (!mreader.Read(nodeAddress + (ulong)valDiff, values, elementConverter))
Expand All @@ -259,6 +283,9 @@ public override bool ForEachMemoryBlock<T>(MemoryReader mreader, Debugger debugg
if (!mreader.Read(nodeAddress + (ulong)nextDiff, nextTmp, nextConverter))
return false;
nodeAddress = nextTmp[0];

if (exprSize == null && (nodeAddress == 0 || nodeAddress == headNodeAddress))
break;
}
return true;
}
Expand Down Expand Up @@ -1278,7 +1305,7 @@ public UserLinkedListEntry(string strHeadPointer,
this.exprHeadPointer = new ClassScopeExpression(strHeadPointer);
this.exprNextPointer = new ClassScopeExpression(strNextPointer);
this.exprValue = new ClassScopeExpression(strValue);
this.exprSize = new ClassScopeExpression(strSize);
this.exprSize = strSize != null ? new ClassScopeExpression(strSize) : null;
}

public UserContainerLoaders<ElementLoader> Create<ElementLoader>(
Expand Down Expand Up @@ -1877,15 +1904,14 @@ private static bool ReloadUserTypes(Loaders loaders,
var elNextPointer = Util.GetXmlElementByTagName(elLinkedList, "NextPointer");
var elValue = Util.GetXmlElementByTagName(elLinkedList, "Value");
var elSize = Util.GetXmlElementByTagName(elLinkedList, "Size");
if (elHeadPointer != null && elNextPointer != null
&& elValue != null && elSize != null)
if (elHeadPointer != null && elNextPointer != null && elValue != null)
{
loaders.Add(new UserLinkedList.LoaderCreator(
typeMatcher,
new ClassScopeExpression(elHeadPointer.InnerText),
new ClassScopeExpression(elNextPointer.InnerText),
new ClassScopeExpression(elValue.InnerText),
new ClassScopeExpression(elSize.InnerText)));
elSize != null ? new ClassScopeExpression(elSize.InnerText) : null));
}
}
}
Expand Down Expand Up @@ -2171,13 +2197,12 @@ static IUserContainerEntry GetContainerEntry(System.Xml.XmlElement elDrawable,
var elNextPointer = Util.GetXmlElementByTagName(elLinkedList, "NextPointer");
var elValue = Util.GetXmlElementByTagName(elLinkedList, "Value");
var elSize = Util.GetXmlElementByTagName(elLinkedList, "Size");
if (elHeadPointer != null && elNextPointer != null
&& elValue != null && elSize != null)
if (elHeadPointer != null && elNextPointer != null && elValue != null)
{
return new UserLinkedListEntry(elHeadPointer.InnerText,
elNextPointer.InnerText,
elValue.InnerText,
elSize.InnerText);
elSize?.InnerText);
}
}
}
Expand Down