From b35128cb8baab2344ed128bcc6a00f13838c165b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Srbeck=C3=BD?= Date: Tue, 4 Apr 2006 19:26:51 +0000 Subject: [PATCH] Implemented showing of properties of properties in debugger git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1271 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/Variables/ArrayValue.cs | 2 +- .../Project/Src/Variables/Evals/Eval.cs | 3 +- .../Project/Src/Variables/ObjectValue.cs | 20 +++------ .../Project/Src/Variables/PrimitiveValue.cs | 6 +-- .../Project/Src/Variables/PropertyVariable.cs | 2 +- .../Project/Src/Variables/Value.cs | 44 ++++++++++++++++--- 6 files changed, 51 insertions(+), 26 deletions(-) diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ArrayValue.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ArrayValue.cs index 96ac91f22c..742de25b48 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ArrayValue.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ArrayValue.cs @@ -57,7 +57,7 @@ namespace Debugger internal unsafe ArrayValue(NDebugger debugger, ICorDebugValue corValue):base(debugger, corValue) { - corArrayValue = this.corValue.CastTo(); + corArrayValue = this.CorValue.CastTo(); corElementType = (CorElementType)corArrayValue.ElementType; rank = corArrayValue.Rank; diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Evals/Eval.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Evals/Eval.cs index c71d069ddd..6f4c2641be 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Evals/Eval.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Evals/Eval.cs @@ -117,7 +117,7 @@ namespace Debugger ICorDebugValue[] args = getArgs(); if (args == null) { - error = "Can not evaluate property of property"; + error = "Can not get args for eval"; evalState = EvalState.Error; if (EvalComplete != null) { EvalComplete(this, new EvalEventArgs(this)); @@ -156,6 +156,7 @@ namespace Debugger protected internal virtual void OnEvalComplete(bool successful) { + // Eval result should be ICorDebugHandleValue so it should survive Continue() result = Value.CreateValue(debugger, corEval.Result); if (result == null) { diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ObjectValue.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ObjectValue.cs index 4bd2359d55..4a45251793 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ObjectValue.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ObjectValue.cs @@ -67,16 +67,6 @@ namespace Debugger } */ - internal ICorDebugHandleValue SoftReference { - get { - ICorDebugHeapValue2 heapValue = this.CorValue.As(); - if (heapValue == null) { // TODO: Investigate - return null; - } - return heapValue.CreateHandle(CorDebugHandleType.HANDLE_WEAK_TRACK_RESURRECTION); - } - } - public override string Type { get{ return classProps.Name; @@ -97,7 +87,7 @@ namespace Debugger internal unsafe ObjectValue(NDebugger debugger, ICorDebugValue corValue):base(debugger, corValue) { - corClass = this.corValue.CastTo().Class; + corClass = this.CorValue.CastTo().Class; InitObjectVariable(); } @@ -141,7 +131,7 @@ namespace Debugger foreach(FieldProps f in metaData.EnumFields(ClassToken)) { FieldProps field = f; // One per scope/delegate if (field.IsStatic && field.IsLiteral) continue; // Skip field - if (!field.IsStatic && corValue == null) continue; // Skip field + if (!field.IsStatic && CorValue == null) continue; // Skip field yield return new ClassVariable(debugger, field.Name, field.IsStatic, @@ -178,7 +168,9 @@ namespace Debugger Eval CreatePropertyEval(MethodProps method, ValueGetter getter) { Value updatedVal = getter(); - if (updatedVal is UnavailableValue) return null; + if (updatedVal is UnavailableValue) { + return null; + } if (this.IsEquivalentValue(updatedVal) && ((ObjectValue)updatedVal).SoftReference != null) { ICorDebugFunction evalCorFunction = Module.CorModule.GetFunctionFromToken(method.Token); @@ -303,7 +295,7 @@ namespace Debugger throw new DebuggerException("Unable to get base class: " + fullTypeName); } else { ICorDebugClass superClass = corModuleSuperclass.GetClassFromToken(classProps.SuperClassToken); - return new ObjectValue(debugger, corValue, superClass); + return new ObjectValue(debugger, CorValue, superClass); } } } diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/PrimitiveValue.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/PrimitiveValue.cs index e8956ddcd7..e86833bb58 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/PrimitiveValue.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/PrimitiveValue.cs @@ -28,9 +28,9 @@ namespace Debugger public object Primitive { get { if (CorType == CorElementType.STRING) { - return (corValue.CastTo()).String; + return (CorValue.CastTo()).String; } else { - return (corValue.CastTo()).Value; + return (CorValue.CastTo()).Value; } } set { @@ -45,7 +45,7 @@ namespace Debugger if (CorType == CorElementType.STRING) { throw new NotSupportedException(); } else { - (corValue.CastTo()).Value = newValue; + (CorValue.CastTo()).Value = newValue; } OnValueChanged(); } diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/PropertyVariable.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/PropertyVariable.cs index 7630245812..732d714914 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/PropertyVariable.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/PropertyVariable.cs @@ -32,7 +32,7 @@ namespace Debugger if (Eval != null) { return Eval.Result; } else { - return new UnavailableValue(debugger, "Property has expired"); + return new UnavailableValue(debugger, "Property unavailable"); } } diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Value.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Value.cs index 95381dff8f..50e203c497 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Value.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Value.cs @@ -16,7 +16,9 @@ namespace Debugger public abstract class Value: RemotingObjectBase { protected NDebugger debugger; - protected ICorDebugValue corValue; + ICorDebugValue corValue; + // ICorDebugHandleValue can be used to get corValue back after Continue() + ICorDebugHandleValue corHandleValue; object pauseSessionAtCreation; public event EventHandler ValueChanged; @@ -29,7 +31,30 @@ namespace Debugger internal ICorDebugValue CorValue { get { - return corValue; + if (pauseSessionAtCreation == debugger.PauseSession) { + return corValue; + } else { + if (corHandleValue == null) { + throw new DebuggerException("CorValue has expired"); + } else { + corValue = DereferenceUnbox(corHandleValue.As()); + pauseSessionAtCreation = debugger.PauseSession; + return corValue; + } + } + } + } + + protected ICorDebugHandleValue SoftReference { + get { + if (corHandleValue != null) return corHandleValue; + + ICorDebugHeapValue2 heapValue = this.CorValue.As(); + if (heapValue == null) { // TODO: Investigate - hmmm, value types are not at heap? + return null; + } else { + return heapValue.CreateHandle(CorDebugHandleType.HANDLE_WEAK_TRACK_RESURRECTION); + } } } @@ -38,13 +63,17 @@ namespace Debugger /// public bool IsExpired { get { - return pauseSessionAtCreation != debugger.PauseSession; + if (corHandleValue == null) { + return pauseSessionAtCreation != debugger.PauseSession; + } else { + return false; + } } } internal CorElementType CorType { get { - return GetCorType(corValue); + return GetCorType(CorValue); } } @@ -104,6 +133,9 @@ namespace Debugger { this.debugger = debugger; if (corValue != null) { + if (corValue.Is()) { + corHandleValue = corValue.As(); + } this.corValue = DereferenceUnbox(corValue); } this.pauseSessionAtCreation = debugger.PauseSession; @@ -203,12 +235,12 @@ namespace Debugger internal static Value CreateValue(NDebugger debugger, ICorDebugValue corValue) { CorElementType type = Value.GetCorType(corValue); - + if (Value.DereferenceUnbox(corValue) == null) { return new NullValue(debugger, corValue); } - + switch(type) { case CorElementType.BOOLEAN: