Skip to content

Commit dc9bfc9

Browse files
committed
Add support for C# array and List<>.
1 parent 1bbc504 commit dc9bfc9

File tree

1 file changed

+88
-11
lines changed

1 file changed

+88
-11
lines changed

Visual_Studio_2015/GraphicalDebugging/ExpressionLoader.cs

Lines changed: 88 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class ExpressionLoader
2525
private Debugger debugger;
2626
private DebuggerEvents debuggerEvents;
2727
private Loaders loaders;
28+
private Loaders loadersCS;
2829

2930
// Because containers of points (including c-arrays) are treated as MultiPoints
3031
// they have to be searched first (Loaders class traverses the list of kinds),
@@ -107,6 +108,11 @@ private ExpressionLoader(DTE2 dte)
107108
loaders.Add(new BGTurn("boost::geometry::detail::buffer::buffer_turn_info"));
108109
loaders.Add(new BGTurnContainer("std::vector"));
109110
loaders.Add(new BGTurnContainer("std::deque"));
111+
112+
loadersCS = new Loaders();
113+
114+
loadersCS.Add(new CSList());
115+
loadersCS.Add(new CSArray());
110116
}
111117

112118
public static Debugger Debugger
@@ -218,17 +224,20 @@ public static void Load(string name,
218224
Expression[] exprs = GetExpressions(name);
219225
if (exprs.Length < 1 || ! AllValidValues(exprs))
220226
return;
221-
227+
228+
string language = Instance.debugger.CurrentStackFrame.Language;
229+
Loaders loaders = language == "C#" ? Instance.loadersCS : Instance.loaders;
230+
222231
if (exprs.Length == 1)
223232
{
224-
Loader loader = Instance.loaders.FindByType(exprs[0].Name, exprs[0].Type);
233+
Loader loader = loaders.FindByType(exprs[0].Name, exprs[0].Type);
225234
if (loader == null)
226235
return;
227236

228237
if (!kindConstraint.Check(loader.Kind()))
229238
return;
230239

231-
loader.Load(Instance.loaders, IsMemoryAccessEnabled(),
240+
loader.Load(loaders, IsMemoryAccessEnabled(),
232241
Instance.debugger, exprs[0].Name, exprs[0].Type,
233242
out traits, out result);
234243
}
@@ -237,7 +246,7 @@ public static void Load(string name,
237246
// For now there is only one loader which can handle this case
238247
CoordinatesContainers loader = new CoordinatesContainers();
239248

240-
loader.Load(Instance.loaders, IsMemoryAccessEnabled(),
249+
loader.Load(loaders, IsMemoryAccessEnabled(),
241250
Instance.debugger, exprs,
242251
out traits, out result);
243252
}
@@ -2448,15 +2457,8 @@ public CoordinatesContainers()
24482457
: base(ExpressionLoader.Kind.MultiPoint)
24492458
{ }
24502459

2451-
public override TypeConstraint Constraint() { return null; }
2452-
24532460
public override string Id() { return null; }
24542461

2455-
public override bool MatchType(string type, string id)
2456-
{
2457-
return false;
2458-
}
2459-
24602462
public override void Load(Loaders loaders, bool accessMemory,
24612463
Debugger debugger, string name, string type,
24622464
out Geometry.Traits traits,
@@ -2525,5 +2527,80 @@ public void Load(Loaders loaders, bool accessMemory,
25252527
}
25262528
}
25272529
}
2530+
2531+
2532+
class CSArray : ContiguousContainer
2533+
{
2534+
public override string Id() { return null; }
2535+
2536+
public override bool MatchType(string type, string id)
2537+
{
2538+
return ElementType(type).Length > 0;
2539+
}
2540+
2541+
public override string ElementType(string type)
2542+
{
2543+
string name = "";
2544+
int begin = type.LastIndexOf('[');
2545+
if (begin > 0)
2546+
name = type.Substring(0, begin);
2547+
return name;
2548+
}
2549+
2550+
public override int LoadSize(Debugger debugger, string name)
2551+
{
2552+
string e2 = debugger.GetExpression("&" + name + "[0]").Value;
2553+
string e3 = debugger.GetExpression("&" + name + "[1]").Value;
2554+
string e4 = debugger.GetExpression("&" + name + "[2]").Value;
2555+
2556+
Expression expr = debugger.GetExpression(name + ".Length");
2557+
if (!expr.IsValidValue)
2558+
return 0;
2559+
int size = 0;
2560+
return int.TryParse(expr.Value, out size)
2561+
? size
2562+
: 0;
2563+
}
2564+
2565+
public override string ElementPtrName(string name)
2566+
{
2567+
return "(&" + name + "[0])";
2568+
}
2569+
2570+
public override bool ForEachMemoryBlock(Debugger debugger, string name, MemoryReader.Converter<double> elementConverter, MemoryBlockPredicate memoryBlockPredicate)
2571+
{
2572+
return this.ForEachMemoryBlock(debugger,
2573+
name,
2574+
ElementPtrName(name),
2575+
elementConverter, memoryBlockPredicate);
2576+
}
2577+
}
2578+
2579+
class CSList : RandomAccessContainer
2580+
{
2581+
public override string Id() { return "System.Collections.Generic.List"; }
2582+
2583+
public override int LoadSize(Debugger debugger, string name)
2584+
{
2585+
Expression expr = debugger.GetExpression(name + ".Count");
2586+
if (!expr.IsValidValue)
2587+
return 0;
2588+
int size = 0;
2589+
return int.TryParse(expr.Value, out size)
2590+
? size
2591+
: 0;
2592+
}
2593+
2594+
public override string ElementPtrName(string name)
2595+
{
2596+
return "";
2597+
}
2598+
2599+
public override bool ForEachMemoryBlock(Debugger debugger, string name, MemoryReader.Converter<double> elementConverter, MemoryBlockPredicate memoryBlockPredicate)
2600+
{
2601+
return false;
2602+
}
2603+
}
2604+
25282605
}
25292606
}

0 commit comments

Comments
 (0)