diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/GridVisualizerWindow.xaml.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/GridVisualizerWindow.xaml.cs index e1bcf8b2ab..957ecec786 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/GridVisualizerWindow.xaml.cs +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/GridVisualizerWindow.xaml.cs @@ -32,7 +32,6 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer { WindowsDebugger debuggerService; GridViewColumnHider columnHider; - //SelectedProperties selectedProperties; /// Number of items shown initially when visualizing IEnumerable. static readonly int initialIEnumerableItemsCount = 24; diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/Utils/DebuggerHelpers.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/Utils/DebuggerHelpers.cs index 9b8b4831cb..bda33693dd 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/Utils/DebuggerHelpers.cs +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/Utils/DebuggerHelpers.cs @@ -59,7 +59,7 @@ namespace Debugger.AddIn.Visualizers.Utils /// Hash code of the object in the debugee. public static int InvokeDefaultGetHashCode(this Value value) { - if (DebuggerHelpers.hashCodeMethod == null) + if (DebuggerHelpers.hashCodeMethod == null || DebuggerHelpers.hashCodeMethod.Process.HasExited) { DebugType typeRuntimeHelpers = DebugType.CreateFromType(value.AppDomain, typeof(System.Runtime.CompilerServices.RuntimeHelpers)); DebuggerHelpers.hashCodeMethod = typeRuntimeHelpers.GetMember("GetHashCode", BindingFlags.Public | BindingFlags.Static | BindingFlags.Method | BindingFlags.IncludeSuperType) as MethodInfo; @@ -68,7 +68,6 @@ namespace Debugger.AddIn.Visualizers.Utils throw new DebuggerException("Cannot obtain method System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode"); } } - // David: I had hard time finding out how to invoke static method. // value.InvokeMethod is nice for instance methods. // what about MethodInfo.Invoke() ? diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Eval.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Eval.cs index 2edf0a0dc2..2a2c7d09aa 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Eval.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Eval.cs @@ -336,6 +336,11 @@ namespace Debugger #region Convenience methods + public static Value NewObject(DebugType debugType, List constructorArguments) + { + return AsyncNewObject(debugType, constructorArguments).WaitForResult(); + } + public static Value NewObjectNoConstructor(DebugType debugType) { return AsyncNewObjectNoConstructor(debugType).WaitForResult(); @@ -343,6 +348,23 @@ namespace Debugger #endregion + public static Eval AsyncNewObject(DebugType debugType, List constructorArguments) + { + List constructorArgumentsExpressions = SelectExpressions(constructorArguments); + ICorDebugValue[] constructorArgsCorDebug = ValuesAsCorDebug(constructorArguments); + MethodInfo constructor = debugType.GetMethod(".ctor"); + return new Eval( + debugType.AppDomain, + "New object: " + debugType.FullName, + new ObjectCreateExpression(new TypeReference(debugType.FullName), constructorArgumentsExpressions), + delegate(Eval eval) { + eval.CorEval.CastTo().NewParameterizedObject( + constructor.CorFunction, (uint)debugType.GenericArguments.Count, debugType.GenericArgumentsAsCorDebugType, + (uint)constructorArgsCorDebug.Length, constructorArgsCorDebug); + } + ); + } + public static Eval AsyncNewObjectNoConstructor(DebugType debugType) { return new Eval( @@ -354,5 +376,24 @@ namespace Debugger } ); } + + static ICorDebugValue[] ValuesAsCorDebug(List values) + { + ICorDebugValue[] valuesAsCorDebug = new ICorDebugValue[values.Count]; + for(int i = 0; i < values.Count; i++) + { + valuesAsCorDebug[i] = values[i].CorValue; + } + return valuesAsCorDebug; + } + + static List SelectExpressions(List values) + { + List expressions = new List(values.Count); + foreach (Value value in values) { + expressions.Add(value.ExpressionTree); + } + return expressions; + } } }