Browse Source

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
shortcuts
David Srbecký 20 years ago
parent
commit
b35128cb8b
  1. 2
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ArrayValue.cs
  2. 3
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Evals/Eval.cs
  3. 20
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ObjectValue.cs
  4. 6
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/PrimitiveValue.cs
  5. 2
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/PropertyVariable.cs
  6. 40
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Value.cs

2
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ArrayValue.cs

@ -57,7 +57,7 @@ namespace Debugger @@ -57,7 +57,7 @@ namespace Debugger
internal unsafe ArrayValue(NDebugger debugger, ICorDebugValue corValue):base(debugger, corValue)
{
corArrayValue = this.corValue.CastTo<ICorDebugArrayValue>();
corArrayValue = this.CorValue.CastTo<ICorDebugArrayValue>();
corElementType = (CorElementType)corArrayValue.ElementType;
rank = corArrayValue.Rank;

3
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Evals/Eval.cs

@ -117,7 +117,7 @@ namespace Debugger @@ -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 @@ -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) {

20
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ObjectValue.cs

@ -67,16 +67,6 @@ namespace Debugger @@ -67,16 +67,6 @@ namespace Debugger
}
*/
internal ICorDebugHandleValue SoftReference {
get {
ICorDebugHeapValue2 heapValue = this.CorValue.As<ICorDebugHeapValue2>();
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 @@ -97,7 +87,7 @@ namespace Debugger
internal unsafe ObjectValue(NDebugger debugger, ICorDebugValue corValue):base(debugger, corValue)
{
corClass = this.corValue.CastTo<ICorDebugObjectValue>().Class;
corClass = this.CorValue.CastTo<ICorDebugObjectValue>().Class;
InitObjectVariable();
}
@ -141,7 +131,7 @@ namespace Debugger @@ -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 @@ -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 @@ -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);
}
}
}

6
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/PrimitiveValue.cs

@ -28,9 +28,9 @@ namespace Debugger @@ -28,9 +28,9 @@ namespace Debugger
public object Primitive {
get {
if (CorType == CorElementType.STRING) {
return (corValue.CastTo<ICorDebugStringValue>()).String;
return (CorValue.CastTo<ICorDebugStringValue>()).String;
} else {
return (corValue.CastTo<ICorDebugGenericValue>()).Value;
return (CorValue.CastTo<ICorDebugGenericValue>()).Value;
}
}
set {
@ -45,7 +45,7 @@ namespace Debugger @@ -45,7 +45,7 @@ namespace Debugger
if (CorType == CorElementType.STRING) {
throw new NotSupportedException();
} else {
(corValue.CastTo<ICorDebugGenericValue>()).Value = newValue;
(CorValue.CastTo<ICorDebugGenericValue>()).Value = newValue;
}
OnValueChanged();
}

2
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/PropertyVariable.cs

@ -32,7 +32,7 @@ namespace Debugger @@ -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");
}
}

40
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Value.cs

@ -16,7 +16,9 @@ namespace Debugger @@ -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<ValueEventArgs> ValueChanged;
@ -29,7 +31,30 @@ namespace Debugger @@ -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<ICorDebugValue>());
pauseSessionAtCreation = debugger.PauseSession;
return corValue;
}
}
}
}
protected ICorDebugHandleValue SoftReference {
get {
if (corHandleValue != null) return corHandleValue;
ICorDebugHeapValue2 heapValue = this.CorValue.As<ICorDebugHeapValue2>();
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 @@ -38,13 +63,17 @@ namespace Debugger
/// </summary>
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 @@ -104,6 +133,9 @@ namespace Debugger
{
this.debugger = debugger;
if (corValue != null) {
if (corValue.Is<ICorDebugHandleValue>()) {
corHandleValue = corValue.As<ICorDebugHandleValue>();
}
this.corValue = DereferenceUnbox(corValue);
}
this.pauseSessionAtCreation = debugger.PauseSession;

Loading…
Cancel
Save