From cf631456223fb5c8aab3f8bad4137cf246ba8f1b Mon Sep 17 00:00:00 2001 From: Adam Wulkiewicz Date: Thu, 25 Apr 2019 15:31:40 +0200 Subject: [PATCH] Implement memory access for C# List. --- .../GraphicalDebugging/ExpressionLoader.cs | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/Visual_Studio_2015/GraphicalDebugging/ExpressionLoader.cs b/Visual_Studio_2015/GraphicalDebugging/ExpressionLoader.cs index f7d9f9b..26e66c5 100644 --- a/Visual_Studio_2015/GraphicalDebugging/ExpressionLoader.cs +++ b/Visual_Studio_2015/GraphicalDebugging/ExpressionLoader.cs @@ -2540,11 +2540,7 @@ public override bool MatchType(string type, string id) public override string ElementType(string type) { - string name = ""; - int begin = type.LastIndexOf('['); - if (begin > 0) - name = type.Substring(0, begin); - return name; + return ElemTypeFromType(type); } public override int LoadSize(Debugger debugger, string name) @@ -2574,9 +2570,19 @@ public override bool ForEachMemoryBlock(Debugger debugger, string name, MemoryRe ElementPtrName(name), elementConverter, memoryBlockPredicate); } + + // type -> name[] + static public string ElemTypeFromType(string type) + { + string name = ""; + int begin = type.LastIndexOf('['); + if (begin > 0 && begin + 1 < type.Length && type[begin + 1] == ']') + name = type.Substring(0, begin); + return name; + } } - class CSList : RandomAccessContainer + class CSList : ContiguousContainer { public override string Id() { return "System.Collections.Generic.List"; } @@ -2593,12 +2599,19 @@ public override int LoadSize(Debugger debugger, string name) public override string ElementPtrName(string name) { - return ""; + return "(&" + name + "._items[0])"; } public override bool ForEachMemoryBlock(Debugger debugger, string name, MemoryReader.Converter elementConverter, MemoryBlockPredicate memoryBlockPredicate) { - return false; + Expression expr = debugger.GetExpression(name + "._items"); + if (!expr.IsValidValue || CSArray.ElemTypeFromType(expr.Type).Length <= 0) + return false; + + return this.ForEachMemoryBlock(debugger, + name, + ElementPtrName(name), + elementConverter, memoryBlockPredicate); } }