Skip to content

Commit d566863

Browse files
committed
Initialize UserPoint static data once. Fix bug in UserContainerEntry.GetLoaders().
1 parent a987f45 commit d566863

File tree

2 files changed

+121
-66
lines changed

2 files changed

+121
-66
lines changed

Visual_Studio_2017/GraphicalDebugging/ExpressionLoader_UserDefined.cs

Lines changed: 78 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,15 @@ partial class ExpressionLoader
2020
{
2121
class UserPoint : PointLoader
2222
{
23-
public UserPoint(string id, string x, string y)
23+
public UserPoint(string id,
24+
ClassScopeExpression exprX,
25+
ClassScopeExpression exprY)
2426
{
2527
this.id = id;
26-
this.member_x = x;
27-
this.member_y = y;
28-
this.member_type_x = null;
29-
this.member_type_y = null;
28+
this.exprX = exprX;
29+
this.exprY = exprY;
30+
this.typeX = null;
31+
this.typeY = null;
3032
this.sizeOf = 0;
3133
}
3234

@@ -36,14 +38,45 @@ public UserPoint(string id, string x, string y)
3638

3739
public override void Initialize(Debugger debugger, string name)
3840
{
39-
Expression e = debugger.GetExpression(name);
40-
Expression ex = debugger.GetExpression(name + "." + member_x);
41-
Expression ey = debugger.GetExpression(name + "." + member_y);
42-
if (e.IsValidValue && ex.IsValidValue && ey.IsValidValue)
41+
string type = ExpressionParser.GetValueType(debugger, name);
42+
exprX.Initialize(debugger, name, type);
43+
exprY.Initialize(debugger, name, type);
44+
45+
sizeOf = ExpressionParser.GetTypeSizeof(debugger, type);
46+
if (sizeOf <= 0)
47+
return;
48+
49+
string nameX = exprX.GetString(name);
50+
string nameY = exprY.GetString(name);
51+
typeX = ExpressionParser.GetValueType(debugger, nameX);
52+
typeY = ExpressionParser.GetValueType(debugger, nameY);
53+
if (typeX == null || typeY == null)
54+
{
55+
sizeOf = 0;
56+
return;
57+
}
58+
59+
sizeX = ExpressionParser.GetTypeSizeof(debugger, typeX);
60+
sizeY = ExpressionParser.GetTypeSizeof(debugger, typeY);
61+
if (sizeX <= 0 || sizeY <= 0)
4362
{
44-
sizeOf = ExpressionParser.GetTypeSizeof(debugger, e.Type);
45-
member_type_x = ex.Type;
46-
member_type_y = ey.Type;
63+
sizeOf = 0;
64+
return;
65+
}
66+
67+
offsetX = ExpressionParser.GetAddressDifference(debugger, name, nameX);
68+
offsetY = ExpressionParser.GetAddressDifference(debugger, name, nameY);
69+
if (ExpressionParser.IsInvalidAddressDifference(offsetX)
70+
|| ExpressionParser.IsInvalidAddressDifference(offsetY)
71+
|| offsetX < 0
72+
|| offsetY < 0
73+
|| offsetX > sizeOf
74+
|| offsetY > sizeOf)
75+
// offsetX + sizeX > sizeOf
76+
// offsetY + sizeY > sizeOf
77+
{
78+
sizeOf = 0;
79+
return;
4780
}
4881
}
4982

@@ -56,8 +89,8 @@ public override Geometry.Traits LoadTraits(string type)
5689
protected override ExpressionDrawer.Point LoadPointParsed(Debugger debugger, string name, string type)
5790
{
5891
double x = 0, y = 0;
59-
bool okx = ExpressionParser.TryLoadDouble(debugger, name + "." + member_x, out x);
60-
bool oky = ExpressionParser.TryLoadDouble(debugger, name + "." + member_y, out y);
92+
bool okx = ExpressionParser.TryLoadDouble(debugger, exprX.GetString(name), out x);
93+
bool oky = ExpressionParser.TryLoadDouble(debugger, exprY.GetString(name), out y);
6194
return Util.IsOk(okx, oky)
6295
? new ExpressionDrawer.Point(x, y)
6396
: null;
@@ -67,22 +100,21 @@ protected override ExpressionDrawer.Point LoadPointMemory(MemoryReader mreader,
67100
string name, string type)
68101
{
69102
MemoryReader.Converter<double> converter = GetMemoryConverter(mreader, debugger, name, type);
70-
if (converter != null)
71-
{
72-
if (converter.ValueCount() != 2)
73-
throw new ArgumentOutOfRangeException("converter.ValueCount()");
103+
if (converter == null)
104+
return null;
74105

75-
ulong address = ExpressionParser.GetValueAddress(debugger, name);
76-
if (address == 0)
77-
return null;
106+
if (converter.ValueCount() != 2)
107+
throw new ArgumentOutOfRangeException("converter.ValueCount()");
78108

79-
double[] values = new double[2];
80-
if (mreader.Read(address, values, converter))
81-
{
82-
return new ExpressionDrawer.Point(values[0], values[1]);
83-
}
84-
}
85-
return null;
109+
ulong address = ExpressionParser.GetValueAddress(debugger, name);
110+
if (address == 0)
111+
return null;
112+
113+
double[] values = new double[2];
114+
if (!mreader.Read(address, values, converter))
115+
return null;
116+
117+
return new ExpressionDrawer.Point(values[0], values[1]);
86118
}
87119

88120
public override MemoryReader.Converter<double> GetMemoryConverter(Loaders loaders,
@@ -96,46 +128,30 @@ public override MemoryReader.Converter<double> GetMemoryConverter(Loaders loader
96128
protected MemoryReader.Converter<double> GetMemoryConverter(MemoryReader mreader, Debugger debugger,
97129
string name, string type)
98130
{
99-
if (sizeOf == 0 /*|| member_type_x == null || member_type_y == null*/)
100-
return null;
101-
102-
string firstType = member_type_x;
103-
string secondType = member_type_y;
104-
string first = name + "." + member_x;
105-
string second = name + "." + member_y;
106-
// TODO: This could be done once, in Initialize
107-
long firstOffset = ExpressionParser.GetAddressDifference(debugger, name, first);
108-
long secondOffset = ExpressionParser.GetAddressDifference(debugger, name, second);
109-
if (ExpressionParser.IsInvalidAddressDifference(firstOffset)
110-
|| ExpressionParser.IsInvalidAddressDifference(secondOffset)
111-
|| firstOffset < 0
112-
|| secondOffset < 0
113-
|| firstOffset > sizeOf
114-
|| secondOffset > sizeOf)
131+
if (sizeOf == 0)
115132
return null;
116133

117-
int firstSize = ExpressionParser.GetTypeSizeof(debugger, firstType);
118-
int secondSize = ExpressionParser.GetTypeSizeof(debugger, secondType);
119-
if (firstSize == 0 || secondSize == 0)
120-
return null;
121-
122-
MemoryReader.ValueConverter<double> firstConverter = mreader.GetNumericConverter(firstType, firstSize);
123-
MemoryReader.ValueConverter<double> secondConverter = mreader.GetNumericConverter(secondType, secondSize);
124-
if (firstConverter == null || secondConverter == null)
134+
MemoryReader.ValueConverter<double> converterX = mreader.GetNumericConverter(typeX, sizeX);
135+
MemoryReader.ValueConverter<double> converterY = mreader.GetNumericConverter(typeY, sizeY);
136+
if (converterX == null || converterY == null)
125137
return null;
126138

127139
return new MemoryReader.StructConverter<double>(
128140
sizeOf,
129-
new MemoryReader.Member<double>(firstConverter, (int)firstOffset),
130-
new MemoryReader.Member<double>(secondConverter, (int)secondOffset));
141+
new MemoryReader.Member<double>(converterX, (int)offsetX),
142+
new MemoryReader.Member<double>(converterY, (int)offsetY));
131143
}
132144

133145
string id;
134-
string member_x;
135-
string member_y;
136-
string member_type_x;
137-
string member_type_y;
146+
ClassScopeExpression exprX;
147+
ClassScopeExpression exprY;
148+
string typeX;
149+
string typeY;
150+
long offsetX;
151+
long offsetY;
138152
int sizeOf;
153+
int sizeX;
154+
int sizeY;
139155
}
140156

141157
class UserContainerLoaders<ElementLoaderT>
@@ -193,7 +209,7 @@ public UserContainerLoaders<ElementLoader> GetLoaders<ElementLoader>(Loaders loa
193209

194210
string elementType = containerLoader.ElementType(containerType);
195211
ElementLoader elementLoader = loaders.FindByType(elementKind,
196-
containerLoader.ElementName(name, elementType),
212+
containerLoader.ElementName(containerName, elementType),
197213
elementType) as ElementLoader;
198214
if (elementLoader == null)
199215
return null;
@@ -624,10 +640,9 @@ private static bool ReloadUserTypes(Loaders loaders,
624640
var elY = Util.GetXmlElementByTagName(elCoords, "Y");
625641
if (elX != null && elY != null)
626642
{
627-
string x = elX.InnerText;
628-
string y = elY.InnerText;
629-
//string name = node.GetAttribute("Type");
630-
loaders.Add(new UserPoint(id, x, y));
643+
ClassScopeExpression exprX = new ClassScopeExpression(elX.InnerText);
644+
ClassScopeExpression exprY = new ClassScopeExpression(elY.InnerText);
645+
loaders.Add(new UserPoint(id, exprX, exprY));
631646
}
632647
}
633648
}
@@ -657,8 +672,6 @@ private static bool ReloadUserTypes(Loaders loaders,
657672
}
658673
else if (elDrawable.Name == "Polygon")
659674
{
660-
// TODO: Allow container of Points as outer ring
661-
662675
var elOuterName = Util.GetXmlElementByTagNames(elDrawable, "ExteriorRing", "Name");
663676
if (elOuterName != null)
664677
{

examples/cs.xml

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,55 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<GraphicalDebugging>
33

4-
<Point Id="WpfApplication1.MainWindow.MyPoint">
4+
<!--
5+
namespace WpfApp1
6+
{
7+
struct MyPoint
8+
{
9+
double x, y;
10+
}
11+
}
12+
-->
13+
<Point Id="WpfApp1.MyPoint">
514
<Coordinates>
615
<X>x</X>
716
<Y>y</Y>
817
</Coordinates>
918
</Point>
1019

20+
<!--
21+
namespace WpfApp1
22+
{
23+
class MyLinestring
24+
{
25+
MyPoint[] points;
26+
}
27+
}
28+
-->
29+
<Linestring Id="WpfApp1.MyLinestring">
30+
<Points>
31+
<Container>
32+
<Name>points</Name>
33+
</Container>
34+
</Points>
35+
</Linestring>
36+
37+
<!--
38+
namespace WpfApp1
39+
{
40+
class MyLinestring2 : List<MyPoint>
41+
{ }
42+
}
43+
-->
44+
<Linestring Id="WpfApp1.MyLinestring2">
45+
<Points>
46+
<Container>
47+
<Name>(System.Collections.Generic.List&lt;WpfApp1.MyPoint&gt;)this</Name>
48+
</Container>
49+
</Points>
50+
</Linestring>
51+
52+
1153
<Point Id="System.Windows.Point">
1254
<Coordinates>
1355
<X>_x</X>

0 commit comments

Comments
 (0)