@@ -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 {
0 commit comments