From 793d82a9dfc915cb10539282b3f11c961f6fc2cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kon=C3=AD=C4=8Dek?= Date: Thu, 27 Aug 2009 16:22:08 +0000 Subject: [PATCH] Fixed "Process is not paused" exception in DebuggerHelpers.InvokeDefaultGetHashCode - thanks to David. Started implementing Eval.NewObject. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4788 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../GridVisualizerWindow.xaml.cs | 1 - .../Src/Visualizers/Utils/DebuggerHelpers.cs | 3 +- .../Debugger.Core/Project/Src/Control/Eval.cs | 41 +++++++++++++++++++ 3 files changed, 42 insertions(+), 3 deletions(-) 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; + } } }