diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs index e2a3b0a7f8..0cfbbff657 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs @@ -393,16 +393,13 @@ namespace Debugger public IEnumerable Variables { get { - foreach(Variable var in ContaingClassVariables) { - yield return var; - } foreach(Variable var in ArgumentVariables) { yield return var; } foreach(Variable var in LocalVariables) { yield return var; } - foreach(Variable var in PropertyVariables) { + foreach(Variable var in ContaingClassVariables) { yield return var; } } @@ -484,42 +481,6 @@ namespace Debugger } } - public IEnumerable PropertyVariables { - get { - foreach(MethodProps m in module.MetaData.EnumMethods(methodProps.ClassToken)) { - MethodProps method = m; // One per scope/delegate - if (method.Name.StartsWith("get_") && method.HasSpecialName) { - yield return new PropertyVariable(debugger, - method.Name.Remove(0, 4), - delegate { - if (this.HasExpired) { - return null; - } else { - return CreatePropertyEval(method); - } - }); - } - } - } - } - - Eval CreatePropertyEval(MethodProps method) - { - ICorDebugFunction evalCorFunction; - Module.CorModule.GetFunctionFromToken(method.Token, out evalCorFunction); - - return new Eval(debugger, evalCorFunction, GetEvalArgs); - } - - ICorDebugValue[] GetEvalArgs() - { - if (IsStatic) { - return new ICorDebugValue[0]; - } else { - return new ICorDebugValue[] {ThisValue.CorValue}; - } - } - IEnumerable GetLocalVariablesInScope(ISymbolScope symScope) { foreach (ISymbolVariable symVar in symScope.GetLocals()) { 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 e8c24cbc8b..1e0d8a4cb1 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 @@ -128,7 +128,18 @@ namespace Debugger yield return BaseClassVariable; } - foreach(FieldProps f in metaData.EnumFields(classProps.Token)) { + foreach(Variable var in GetFieldVariables(getter)) { + yield return var; + } + + foreach(Variable var in GetPropertyVariables(getter)) { + yield return var; + } + } + + public IEnumerable GetFieldVariables(ValueGetter getter) + { + 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 @@ -136,6 +147,7 @@ namespace Debugger field.Name, delegate { Value updatedVal = getter(); + if (updatedVal is UnavailableValue) return updatedVal; if (this.IsEquivalentValue(updatedVal)) { return GetValue(updatedVal, field); } else { @@ -145,6 +157,40 @@ namespace Debugger } } + public IEnumerable GetPropertyVariables(ValueGetter getter) + { + foreach(MethodProps m in Methods) { + MethodProps method = m; // One per scope/delegate + if (method.Name.StartsWith("get_") && method.HasSpecialName) { + yield return new PropertyVariable(debugger, + method.Name.Remove(0, 4), + delegate { + Value updatedVal = getter(); + if (updatedVal is UnavailableValue) return null; + if (this.IsEquivalentValue(updatedVal)) { + return CreatePropertyEval(method, getter); + } else { + return null; + } + }); + } + } + } + + Eval CreatePropertyEval(MethodProps method, ValueGetter getter) + { + ICorDebugFunction evalCorFunction; + Module.CorModule.GetFunctionFromToken(method.Token, out evalCorFunction); + + return new Eval(debugger, evalCorFunction, delegate { + if (method.IsStatic) { + return new ICorDebugValue[] {}; + } else { + return new ICorDebugValue[] {getter().CorValue}; + } + }); + } + public override bool IsEquivalentValue(Value val) { ObjectValue objVal = val as ObjectValue;