Skip to content

Commit ec26986

Browse files
committed
Remove debugger-related processing/parsing from MemoryReader.
1 parent 4c80d66 commit ec26986

File tree

6 files changed

+120
-60
lines changed

6 files changed

+120
-60
lines changed

Visual_Studio_2017/GraphicalDebugging/ExpressionLoader.cs

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -590,8 +590,12 @@ protected ExpressionDrawer.Point LoadPointParsed(Debugger debugger, string name,
590590
protected ExpressionDrawer.Point LoadPointMemory(MemoryReader mreader, Debugger debugger,
591591
string name, string type, string ptrName, int count)
592592
{
593+
VariableInfo info = new VariableInfo(debugger, ptrName + "[0]");
594+
if (! info.IsValid)
595+
return null;
596+
593597
double[] values = new double[count];
594-
if (mreader.ReadNumericArray(debugger, ptrName + "[0]", values))
598+
if (mreader.ReadNumericArray(info.Address, info.Type, info.Size, values))
595599
{
596600
if (count > 1)
597601
return new ExpressionDrawer.Point(values[0], values[1]);
@@ -609,8 +613,9 @@ protected MemoryReader.Converter<double> GetMemoryConverter(MemoryReader mreader
609613
string name, string memberArray, string elemType, int count)
610614
{
611615
string elemName = memberArray + "[0]";
616+
int elemSize = ExpressionParser.GetTypeSizeof(debugger, elemType);
612617
MemoryReader.Converter<double> arrayConverter
613-
= mreader.GetNumericArrayConverter(debugger, elemName, elemType, count);
618+
= mreader.GetNumericArrayConverter(elemType, elemSize, count);
614619
int byteSize = (new ExpressionParser(debugger)).GetValueSizeof(name);
615620
if (byteSize == 0)
616621
return null;
@@ -2038,8 +2043,12 @@ protected MemoryReader.Converter<double> GetMemoryConverter(MemoryReader mreader
20382043
if (ExpressionParser.IsInvalidAddressDifference(firstOffset)
20392044
|| ExpressionParser.IsInvalidAddressDifference(secondOffset))
20402045
return null;
2041-
MemoryReader.Converter<double> firstConverter = mreader.GetNumericArrayConverter(debugger, first, firstType, 1);
2042-
MemoryReader.Converter<double> secondConverter = mreader.GetNumericArrayConverter(debugger, second, secondType, 1);
2046+
int firstSize = ExpressionParser.GetTypeSizeof(debugger, firstType);
2047+
int secondSize = ExpressionParser.GetTypeSizeof(debugger, secondType);
2048+
if (firstSize == 0 || secondSize == 0)
2049+
return null;
2050+
MemoryReader.ValueConverter<double> firstConverter = mreader.GetNumericConverter(firstType, firstSize);
2051+
MemoryReader.ValueConverter<double> secondConverter = mreader.GetNumericConverter(secondType, secondSize);
20432052
if (firstConverter == null || secondConverter == null)
20442053
return null;
20452054
int sizeOfPair = ExpressionParser.GetTypeSizeof(debugger, type);
@@ -2354,10 +2363,13 @@ protected void LoadMemory(MemoryReader mreader, Debugger debugger,
23542363
{
23552364
result = null;
23562365

2357-
string elemName = loader.ElementName(name, loader.ElementType(type));
2366+
string elemType = loader.ElementType(type);
2367+
string elemName = loader.ElementName(name, elemType);
2368+
2369+
int valSize = ExpressionParser.GetTypeSizeof(debugger, elemType);
23582370

23592371
MemoryReader.ValueConverter<double>
2360-
valueConverter = mreader.GetNumericConverter<double>(debugger, elemName, null);
2372+
valueConverter = mreader.GetNumericConverter(elemType, valSize);
23612373
if (valueConverter == null)
23622374
return;
23632375

@@ -2575,8 +2587,13 @@ protected MemoryReader.Converter<double> GetMemoryConverter(MemoryReader mreader
25752587
|| secondOffset > sizeOf)
25762588
return null;
25772589

2578-
MemoryReader.Converter<double> firstConverter = mreader.GetNumericArrayConverter(debugger, first, firstType, 1);
2579-
MemoryReader.Converter<double> secondConverter = mreader.GetNumericArrayConverter(debugger, second, secondType, 1);
2590+
int firstSize = ExpressionParser.GetTypeSizeof(debugger, firstType);
2591+
int secondSize = ExpressionParser.GetTypeSizeof(debugger, secondType);
2592+
if (firstSize == 0 || secondSize == 0)
2593+
return null;
2594+
2595+
MemoryReader.ValueConverter<double> firstConverter = mreader.GetNumericConverter(firstType, firstSize);
2596+
MemoryReader.ValueConverter<double> secondConverter = mreader.GetNumericConverter(secondType, secondSize);
25802597
if (firstConverter == null || secondConverter == null)
25812598
return null;
25822599

Visual_Studio_2017/GraphicalDebugging/ExpressionLoader_BoostGil.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//------------------------------------------------------------------------------
2-
// <copyright file="ExpressionLoader.cs">
2+
// <copyright file="ExpressionLoader_BoostGil.cs">
33
// Copyright (c) Adam Wulkiewicz.
44
// </copyright>
55
//------------------------------------------------------------------------------

Visual_Studio_2017/GraphicalDebugging/ExpressionLoader_ContainerLoader.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//------------------------------------------------------------------------------
2-
// <copyright file="ExpressionLoader.cs">
2+
// <copyright file="ExpressionLoader_ContainerLoader.cs">
33
// Copyright (c) Adam Wulkiewicz.
44
// </copyright>
55
//------------------------------------------------------------------------------
@@ -418,9 +418,13 @@ public override bool ForEachMemoryBlock(MemoryReader mreader, Debugger debugger,
418418
if (! ExpressionParser.TryLoadInt(debugger, MapSizeStr(name), out mapSize))
419419
return false;
420420

421+
VariableInfo mapInfo = new VariableInfo(debugger, MapStr(name) + "[0]");
422+
if (! mapInfo.IsValid)
423+
return false;
424+
421425
// Map - array of pointers
422426
ulong[] pointers = new ulong[mapSize];
423-
if (! mreader.ReadPointerArray(debugger, MapStr(name) + "[0]", pointers))
427+
if (! mreader.ReadPointerArray(mapInfo.Address, mapInfo.Type, mapInfo.Size, pointers))
424428
return false;
425429

426430
// Block size
@@ -555,7 +559,11 @@ public override bool ForEachMemoryBlock(MemoryReader mreader, Debugger debugger,
555559
string nextNextName = HeadStr(name) + "->_Next->_Next";
556560
string nextValName = HeadStr(name) + "->_Next->_Myval";
557561

558-
MemoryReader.ValueConverter<ulong> nextConverter = mreader.GetPointerConverter(debugger, nextName, null);
562+
TypeInfo nextInfo = new TypeInfo(debugger, nextName);
563+
if (! nextInfo.IsValid)
564+
return false;
565+
566+
MemoryReader.ValueConverter<ulong> nextConverter = mreader.GetPointerConverter(nextInfo.Type, nextInfo.Size);
559567
if (nextConverter == null)
560568
return false;
561569

@@ -669,8 +677,12 @@ public override bool ForEachMemoryBlock(MemoryReader mreader, Debugger debugger,
669677
string isNilName = headName + "->_Isnil";
670678
string valName = headName + "->_Myval";
671679

680+
TypeInfo headInfo = new TypeInfo(debugger, headName);
681+
if (! headInfo.IsValid)
682+
return false;
683+
672684
MemoryReader.ValueConverter<byte, byte> boolConverter = new MemoryReader.ValueConverter<byte, byte>();
673-
MemoryReader.ValueConverter<ulong> ptrConverter = mreader.GetPointerConverter(debugger, headName, null);
685+
MemoryReader.ValueConverter<ulong> ptrConverter = mreader.GetPointerConverter(headInfo.Type, headInfo.Size);
674686
if (ptrConverter == null)
675687
return false;
676688

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
//------------------------------------------------------------------------------
2+
// <copyright file="ExpressionLoader_Util.cs">
3+
// Copyright (c) Adam Wulkiewicz.
4+
// </copyright>
5+
//------------------------------------------------------------------------------
6+
7+
using EnvDTE;
8+
9+
namespace GraphicalDebugging
10+
{
11+
partial class ExpressionLoader
12+
{
13+
class TypeInfo
14+
{
15+
public TypeInfo(Debugger debugger, string name)
16+
{
17+
Type = ExpressionParser.GetValueType(debugger, name);
18+
if (Type == null)
19+
return;
20+
Size = ExpressionParser.GetTypeSizeof(debugger, Type);
21+
if (Size == 0)
22+
return;
23+
IsValid = true;
24+
}
25+
26+
public string Type = null;
27+
public int Size = 0;
28+
public bool IsValid = false;
29+
}
30+
31+
class VariableInfo : TypeInfo
32+
{
33+
public VariableInfo(Debugger debugger, string name)
34+
: base(debugger, name)
35+
{
36+
if (base.IsValid)
37+
{
38+
Address = ExpressionParser.GetValueAddress(debugger, name);
39+
if (Address == 0)
40+
base.IsValid = false;
41+
}
42+
}
43+
44+
public ulong Address;
45+
}
46+
}
47+
}

Visual_Studio_2017/GraphicalDebugging/GraphicalDebugging.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
<Compile Include="ExpressionLoader_ContainerLoader.cs" />
7272
<Compile Include="ExpressionLoader_BoostGil.cs" />
7373
<Compile Include="ExpressionLoader.cs" />
74+
<Compile Include="ExpressionLoader_Util.cs" />
7475
<Compile Include="ExpressionParser.cs" />
7576
<Compile Include="GeneralOptionControl.cs">
7677
<SubType>UserControl</SubType>

Visual_Studio_2017/GraphicalDebugging/MemoryReader.cs

Lines changed: 30 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -241,17 +241,7 @@ private bool IsUnsignedIntegralType(string valType)
241241
}
242242
}
243243

244-
public ValueConverter<ValueType> GetNumericConverter<ValueType>(Debugger debugger, string valName, string valType = null)
245-
where ValueType : struct
246-
{
247-
if (valType == null)
248-
valType = ExpressionParser.GetValueType(debugger, valName);
249-
int valSize = ExpressionParser.GetTypeSizeof(debugger, valType);
250-
251-
return GetNumericConverter<ValueType>(valType, valSize);
252-
}
253-
254-
public ValueConverter<ValueType> GetNumericConverter<ValueType>(string valType, int valSize)
244+
public ValueConverter<ValueType> GetValueConverter<ValueType>(string valType, int valSize)
255245
where ValueType : struct
256246
{
257247
if (valType == null || valSize <= 0)
@@ -299,79 +289,72 @@ public ValueConverter<ValueType> GetNumericConverter<ValueType>(string valType,
299289
return null;
300290
}
301291

302-
// valName - pointer name
303-
// valType - pointer type, must end with *
304-
public ValueConverter<ulong> GetPointerConverter(Debugger debugger, string valName, string valType = null)
292+
public ValueConverter<double> GetNumericConverter(string valType, int valSize)
293+
{
294+
return GetValueConverter<double>(valType, valSize);
295+
}
296+
297+
public ArrayConverter<double> GetNumericArrayConverter(string valType, int valSize, int size)
305298
{
306-
if (valType == null)
307-
valType = ExpressionParser.GetValueType(debugger, valName);
308-
int valSize = ExpressionParser.GetTypeSizeof(debugger, valType);
299+
ValueConverter<double> valueConverter = GetNumericConverter(valType, valSize);
300+
return valueConverter == null
301+
? null
302+
: new ArrayConverter<double>(valueConverter, size);
303+
}
309304

310-
if (valType == null || valSize == 0)
305+
// ptrType - pointer type, must end with *
306+
// ptrSize - pointer size (4 or 8)
307+
public ValueConverter<ulong> GetPointerConverter(string ptrType, int ptrSize)
308+
{
309+
if (ptrType == null || ptrSize <= 0)
311310
return null;
312311

313-
if (! valType.EndsWith("*"))
312+
if (! ptrType.EndsWith("*"))
314313
return null;
315314

316-
if (valSize == 4)
315+
if (ptrSize == 4)
317316
return new ValueConverter<ulong, uint>();
318-
else if (valSize == 8)
317+
else if (ptrSize == 8)
319318
return new ValueConverter<ulong, ulong>();
320319

321320
return null;
322321
}
323322

324-
// valName - name of the first element in array
325-
public ArrayConverter<double> GetNumericArrayConverter(Debugger debugger, string valName, string valType, int size)
323+
// ptrType - pointer type, must end with *
324+
// ptrSize - pointer size (4 or 8)
325+
public ArrayConverter<ulong> GetPointerArrayConverter(string ptrType, int ptrSize, int size)
326326
{
327-
ValueConverter<double> valueConverter = GetNumericConverter<double>(debugger, valName, valType);
328-
return valueConverter == null
329-
? null
330-
: new ArrayConverter<double>(valueConverter, size);
331-
}
332-
333-
// valName - name of the first pointer in array
334-
public ArrayConverter<ulong> GetPointerArrayConverter(Debugger debugger, string valName, string valType, int size)
335-
{
336-
ValueConverter<ulong> pointerConverter = GetPointerConverter(debugger, valName, valType);
327+
ValueConverter<ulong> pointerConverter = GetPointerConverter(ptrType, ptrSize);
337328
return pointerConverter == null
338329
? null
339330
: new ArrayConverter<ulong>(pointerConverter, size);
340331
}
341332

342-
// valName - first value in range
343-
public bool ReadNumericArray(Debugger debugger, string valName, double[] values)
333+
public bool ReadNumericArray(ulong address, string valType, int valSize, double[] values)
344334
{
345335
int count = values.Length;
346336
if (count < 1)
347337
return true;
348338

349-
ArrayConverter<double> converter = GetNumericArrayConverter(debugger, valName, null, count);
339+
ArrayConverter<double> converter = GetNumericArrayConverter(valType, valSize, count);
350340
if (converter == null)
351341
return false;
352342

353-
ulong address = ExpressionParser.GetValueAddress(debugger, valName);
354-
if (address == 0)
355-
return false;
356-
357343
return Read(address, values, converter);
358344
}
359345

360-
// valName - first pointer in range
361-
public bool ReadPointerArray(Debugger debugger, string valName, ulong[] values)
346+
// ptrType - pointer type, must end with *
347+
// ptrSize - pointer size (4 or 8)
348+
public bool ReadPointerArray(ulong address, string ptrType, int ptrSize, ulong[] values)
362349
{
363350
int count = values.Length;
364351
if (count < 1)
365352
return true;
366353

367-
ArrayConverter<ulong> converter = GetPointerArrayConverter(debugger, valName, null, count);
354+
ArrayConverter<ulong> converter = GetPointerArrayConverter(ptrType, ptrSize, count);
368355
if (converter == null)
369356
return false;
370357

371-
ulong address = ExpressionParser.GetValueAddress(debugger, valName);
372-
if (address == 0)
373-
return false;
374-
375358
return Read(address, values, converter);
376359
}
377360

0 commit comments

Comments
 (0)