@@ -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