@@ -22,11 +22,13 @@ partial class ExpressionLoader
2222 // TODO: The code is similar to std::vector loader, unify if possible
2323 class UserArray : ContiguousContainer
2424 {
25- public UserArray ( string id , string strPointer , string strSize )
25+ public UserArray ( string id ,
26+ ClassScopeExpression exprPointer ,
27+ ClassScopeExpression exprSize )
2628 {
2729 this . id = id ;
28- this . exprPointer = new ClassScopeExpression ( strPointer ) ;
29- this . exprSize = new ClassScopeExpression ( strSize ) ;
30+ this . exprPointer = exprPointer ;
31+ this . exprSize = exprSize ;
3032 }
3133
3234 public override void Initialize ( Debugger debugger , string name )
@@ -62,16 +64,16 @@ public override int LoadSize(Debugger debugger, string name)
6264 class UserLinkedList : ContainerLoader
6365 {
6466 public UserLinkedList ( string id ,
65- string strHeadPointer ,
66- string strNextPointer ,
67- string strValue ,
68- string strSize )
67+ ClassScopeExpression exprHeadPointer ,
68+ ClassScopeExpression exprNextPointer ,
69+ ClassScopeExpression exprValue ,
70+ ClassScopeExpression exprSize )
6971 {
7072 this . id = id ;
71- this . exprHeadPointer = new ClassScopeExpression ( strHeadPointer ) ;
72- this . exprNextPointer = new ClassScopeExpression ( strNextPointer ) ;
73- this . exprValue = new ClassScopeExpression ( strValue ) ;
74- this . exprSize = new ClassScopeExpression ( strSize ) ;
73+ this . exprHeadPointer = exprHeadPointer ;
74+ this . exprNextPointer = exprNextPointer ;
75+ this . exprValue = exprValue ;
76+ this . exprSize = exprSize ;
7577 }
7678
7779 public override void Initialize ( Debugger debugger , string name )
@@ -443,6 +445,62 @@ public UserContainerLoaders<ElementLoader> GetLoaders<ElementLoader>(Loaders loa
443445 ClassScopeExpression exprSize ;
444446 }
445447
448+ class UserLinkedListEntry : IUserContainerEntry
449+ {
450+ public UserLinkedListEntry ( string strHeadPointer ,
451+ string strNextPointer ,
452+ string strValue ,
453+ string strSize )
454+ {
455+ this . exprHeadPointer = new ClassScopeExpression ( strHeadPointer ) ;
456+ this . exprNextPointer = new ClassScopeExpression ( strNextPointer ) ;
457+ this . exprValue = new ClassScopeExpression ( strValue ) ;
458+ this . exprSize = new ClassScopeExpression ( strSize ) ;
459+ }
460+
461+ public void Initialize ( Debugger debugger , string name )
462+ {
463+ }
464+
465+ public UserContainerLoaders < ElementLoader > GetLoaders < ElementLoader > ( Loaders loaders ,
466+ IKindConstraint elementKindConstraint ,
467+ Debugger debugger , string name )
468+ where ElementLoader : Loader
469+ {
470+ string type = ExpressionParser . GetValueType ( debugger , name ) ;
471+ if ( type == null )
472+ return null ;
473+
474+ // NOTE: This could be done in Initialize(),however in all other places
475+ // container is created an initialized during Loading.
476+ // So do this in this case as well.
477+ string id = Util . BaseType ( type ) ;
478+ UserLinkedList containerLoader = new UserLinkedList ( id , exprHeadPointer , exprNextPointer , exprValue , exprSize ) ;
479+ containerLoader . Initialize ( debugger , name ) ;
480+
481+ string elementType = containerLoader . ElementType ( type ) ;
482+ string elementName = containerLoader . ElementName ( name , elementType ) ;
483+ ElementLoader elementLoader = loaders . FindByType ( elementKindConstraint ,
484+ elementName ,
485+ elementType ) as ElementLoader ;
486+ if ( elementLoader == null )
487+ return null ;
488+
489+ UserContainerLoaders < ElementLoader > result = new UserContainerLoaders < ElementLoader > ( ) ;
490+ result . ContainerLoader = containerLoader ;
491+ result . ElementLoader = elementLoader ;
492+ result . ContainerName = name ;
493+ result . ContainerType = type ;
494+ result . ElementType = elementType ;
495+ return result ;
496+ }
497+
498+ ClassScopeExpression exprHeadPointer ;
499+ ClassScopeExpression exprNextPointer ;
500+ ClassScopeExpression exprValue ;
501+ ClassScopeExpression exprSize ;
502+ }
503+
446504 class UserRange < ResultType > : PointRange < ResultType >
447505 where ResultType : class
448506 , ExpressionDrawer . IDrawable
@@ -868,7 +926,9 @@ private static bool ReloadUserTypes(Loaders loaders,
868926 var elSize = Util . GetXmlElementByTagName ( elArray , "Size" ) ;
869927 if ( elPointer != null && elSize != null )
870928 {
871- loaders . Add ( new UserArray ( id , elPointer . InnerText , elSize . InnerText ) ) ;
929+ loaders . Add ( new UserArray ( id ,
930+ new ClassScopeExpression ( elPointer . InnerText ) ,
931+ new ClassScopeExpression ( elSize . InnerText ) ) ) ;
872932 }
873933 }
874934 else if ( elLinkedList != null )
@@ -881,10 +941,10 @@ private static bool ReloadUserTypes(Loaders loaders,
881941 && elValue != null && elSize != null )
882942 {
883943 loaders . Add ( new UserLinkedList ( id ,
884- elHeadPointer . InnerText ,
885- elNextPointer . InnerText ,
886- elValue . InnerText ,
887- elSize . InnerText ) ) ;
944+ new ClassScopeExpression ( elHeadPointer . InnerText ) ,
945+ new ClassScopeExpression ( elNextPointer . InnerText ) ,
946+ new ClassScopeExpression ( elValue . InnerText ) ,
947+ new ClassScopeExpression ( elSize . InnerText ) ) ) ;
888948 }
889949 }
890950 }
@@ -972,10 +1032,14 @@ static IUserContainerEntry GetContainerEntry(System.Xml.XmlElement elDrawable,
9721032 var elElements = Util . GetXmlElementByTagName ( elDrawable , elementsKind ) ;
9731033 if ( elElements != null )
9741034 {
975- var elContName = Util . GetXmlElementByTagNames ( elElements , "Container" , "Name ") ;
976- if ( elContName != null )
1035+ var elContainer = Util . GetXmlElementByTagName ( elElements , "Container" ) ;
1036+ if ( elContainer != null )
9771037 {
978- return new UserContainerEntry ( elContName . InnerText ) ;
1038+ var elName = Util . GetXmlElementByTagName ( elContainer , "Name" ) ;
1039+ if ( elName != null )
1040+ {
1041+ return new UserContainerEntry ( elName . InnerText ) ;
1042+ }
9791043 }
9801044 else
9811045 {
@@ -989,6 +1053,25 @@ static IUserContainerEntry GetContainerEntry(System.Xml.XmlElement elDrawable,
9891053 return new UserArrayEntry ( elPointer . InnerText , elSize . InnerText ) ;
9901054 }
9911055 }
1056+ else
1057+ {
1058+ var elLinkedList = Util . GetXmlElementByTagName ( elElements , "LinkedList" ) ;
1059+ if ( elLinkedList != null )
1060+ {
1061+ var elHeadPointer = Util . GetXmlElementByTagName ( elLinkedList , "HeadPointer" ) ;
1062+ var elNextPointer = Util . GetXmlElementByTagName ( elLinkedList , "NextPointer" ) ;
1063+ var elValue = Util . GetXmlElementByTagName ( elLinkedList , "Value" ) ;
1064+ var elSize = Util . GetXmlElementByTagName ( elLinkedList , "Size" ) ;
1065+ if ( elHeadPointer != null && elNextPointer != null
1066+ && elValue != null && elSize != null )
1067+ {
1068+ return new UserLinkedListEntry ( elHeadPointer . InnerText ,
1069+ elNextPointer . InnerText ,
1070+ elValue . InnerText ,
1071+ elSize . InnerText ) ;
1072+ }
1073+ }
1074+ }
9921075 }
9931076 }
9941077 return null ;
0 commit comments