From cf51e9a0b4c2292a7728650cb8d720edf6808fba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Srbeck=C3=BD?= Date: Thu, 6 Jul 2006 00:43:00 +0000 Subject: [PATCH] ValueGetter delegate wrapped in PersistentValue class git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@1545 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Debugger.Core.csproj | 1 + .../Project/Src/Threads/Function.cs | 8 ++-- .../Project/Src/Variables/ArrayValue.cs | 14 +++---- .../Project/Src/Variables/ClassVariable.cs | 2 +- .../Project/Src/Variables/ObjectValue.cs | 38 +++++++++---------- .../Project/Src/Variables/PersistentValue.cs | 38 +++++++++++++++++++ .../Project/Src/Variables/PropertyVariable.cs | 2 +- .../Project/Src/Variables/Value.cs | 6 +-- .../Project/Src/Variables/Variable.cs | 17 +++------ .../Src/Variables/VariableCollection.cs | 2 +- 10 files changed, 81 insertions(+), 47 deletions(-) create mode 100644 src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/PersistentValue.cs diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj index 4a5e50d26d..2c329ed30f 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj @@ -380,6 +380,7 @@ + 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 26e3385139..10e4d9bf49 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 @@ -383,7 +383,7 @@ namespace Debugger if (!IsStatic) { yield return new Variable(debugger, "this", - delegate { return ThisValue; }); + new PersistentValue(delegate { return ThisValue; })); } foreach(Variable var in ArgumentVariables) { yield return var; @@ -401,7 +401,7 @@ namespace Debugger get { // TODO: Should work for static if (!IsStatic) { - foreach(Variable var in ThisValue.GetSubVariables(delegate{return ThisValue;})) { + foreach(Variable var in ThisValue.GetSubVariables(new PersistentValue(delegate{return ThisValue;}))) { yield return var; } } @@ -433,7 +433,7 @@ namespace Debugger { return new Variable(debugger, GetParameterName(index), - delegate { return GetArgumentValue(index); }); + new PersistentValue(delegate { return GetArgumentValue(index); })); } Value GetArgumentValue(int index) @@ -488,7 +488,7 @@ namespace Debugger { return new Variable(debugger, symVar.Name, - delegate { return GetValueOfLocalVariable(symVar); }); + new PersistentValue(delegate { return GetValueOfLocalVariable(symVar); })); } Value GetValueOfLocalVariable(ISymUnmanagedVariable symVar) 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 32bc6a6bee..732e1686c1 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 @@ -92,11 +92,11 @@ namespace Debugger public Variable this[uint[] indices] { get { - return GetItem(indices, delegate {return this;}); + return GetItem(indices, new PersistentValue(delegate {return this;})); } } - Variable GetItem(uint[] itemIndices, ValueGetter getter) + Variable GetItem(uint[] itemIndices, PersistentValue pValue) { uint[] indices = (uint[])itemIndices.Clone(); @@ -109,12 +109,12 @@ namespace Debugger return new Variable(debugger, elementName, - delegate { return GetValueOfItem(indices, getter); }); + new PersistentValue(delegate { return GetValueOfItem(indices, pValue); })); } - Value GetValueOfItem(uint[] indices, ValueGetter getter) + Value GetValueOfItem(uint[] indices, PersistentValue pValue) { - ArrayValue updatedVal = getter() as ArrayValue; + ArrayValue updatedVal = pValue.Value as ArrayValue; if (this.IsEquivalentValue(updatedVal)) { ICorDebugValue element; unsafe { @@ -134,7 +134,7 @@ namespace Debugger } } - public override IEnumerable GetSubVariables(ValueGetter getter) + public override IEnumerable GetSubVariables(PersistentValue pValue) { uint[] indices = new uint[rank]; @@ -147,7 +147,7 @@ namespace Debugger } if (indices[0] >= dimensions[0]) break; // We are done - yield return GetItem(indices, getter); + yield return GetItem(indices, pValue); indices[rank - 1]++; } diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ClassVariable.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ClassVariable.cs index 8a9e248ec4..19094c4290 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ClassVariable.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ClassVariable.cs @@ -26,7 +26,7 @@ namespace Debugger } } - public ClassVariable(NDebugger debugger, string name, bool isStatic, bool isPublic, ValueGetter valueGetter): base(debugger, name, valueGetter) + public ClassVariable(NDebugger debugger, string name, bool isStatic, bool isPublic, PersistentValue pValue): base(debugger, name, pValue) { this.isStatic = isStatic; this.isPublic = isPublic; 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 b16044cdf3..ced46a1e0d 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 @@ -111,22 +111,22 @@ namespace Debugger } } - public override IEnumerable GetSubVariables(ValueGetter getter) + public override IEnumerable GetSubVariables(PersistentValue pValue) { if (HasBaseClass) { - yield return GetBaseClassVariable(getter); + yield return GetBaseClassVariable(pValue); } - foreach(Variable var in GetFieldVariables(getter)) { + foreach(Variable var in GetFieldVariables(pValue)) { yield return var; } - foreach(Variable var in GetPropertyVariables(getter)) { + foreach(Variable var in GetPropertyVariables(pValue)) { yield return var; } } - public IEnumerable GetFieldVariables(ValueGetter getter) + public IEnumerable GetFieldVariables(PersistentValue pValue) { foreach(FieldProps f in metaData.EnumFields(ClassToken)) { FieldProps field = f; // One per scope/delegate @@ -136,13 +136,13 @@ namespace Debugger field.Name, field.IsStatic, field.IsPublic, - delegate { return GetValueOfField(field, getter); }); + new PersistentValue(delegate { return GetValueOfField(field, pValue); })); } } - Value GetValueOfField(FieldProps field, ValueGetter getter) + Value GetValueOfField(FieldProps field, PersistentValue pValue) { - Value updatedVal = getter(); + Value updatedVal = pValue.Value; if (updatedVal is UnavailableValue) return updatedVal; if (this.IsEquivalentValue(updatedVal)) { return GetValue(updatedVal, field); @@ -151,7 +151,7 @@ namespace Debugger } } - public IEnumerable GetPropertyVariables(ValueGetter getter) + public IEnumerable GetPropertyVariables(PersistentValue pValue) { foreach(MethodProps m in Methods) { MethodProps method = m; // One per scope/delegate @@ -160,29 +160,29 @@ namespace Debugger method.Name.Remove(0, 4), method.IsStatic, method.IsPublic, - delegate { return CreatePropertyEval(method, getter); }); + delegate { return CreatePropertyEval(method, pValue); }); } } } - Eval CreatePropertyEval(MethodProps method, ValueGetter getter) + Eval CreatePropertyEval(MethodProps method, PersistentValue pValue) { - Value updatedVal = getter(); + Value updatedVal = pValue.Value; if (updatedVal is UnavailableValue) { return null; } if (this.IsEquivalentValue(updatedVal)) { ICorDebugFunction evalCorFunction = Module.CorModule.GetFunctionFromToken(method.Token); - return new Eval(debugger, evalCorFunction, delegate { return GetArgsForEval(method, getter); }); + return new Eval(debugger, evalCorFunction, delegate { return GetArgsForEval(method, pValue); }); } else { return null; } } - ICorDebugValue[] GetArgsForEval(MethodProps method, ValueGetter getter) + ICorDebugValue[] GetArgsForEval(MethodProps method, PersistentValue pValue) { - ObjectValue updatedVal = getter() as ObjectValue; + ObjectValue updatedVal = pValue.Value as ObjectValue; if (this.IsEquivalentValue(updatedVal)) { if (method.IsStatic) { return new ICorDebugValue[] {}; @@ -226,20 +226,20 @@ namespace Debugger } } - public Variable GetBaseClassVariable(ValueGetter getter) + public Variable GetBaseClassVariable(PersistentValue pValue) { if (HasBaseClass) { return new Variable(debugger, "", - delegate { return GetBaseClassValue(getter); }); + new PersistentValue(delegate { return GetBaseClassValue(pValue); })); } else { return null; } } - Value GetBaseClassValue(ValueGetter getter) + Value GetBaseClassValue(PersistentValue pValue) { - Value updatedVal = getter(); + Value updatedVal = pValue.Value; if (updatedVal is UnavailableValue) return updatedVal; if (this.IsEquivalentValue(updatedVal)) { return ((ObjectValue)updatedVal).BaseClass; diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/PersistentValue.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/PersistentValue.cs new file mode 100644 index 0000000000..caab7c6b38 --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/PersistentValue.cs @@ -0,0 +1,38 @@ +// +// +// +// +// $Revision$ +// + +using System; + +using Debugger.Wrappers.CorDebug; + +namespace Debugger +{ + /// + /// PersistentValue is a container used to obtain the value of a given object even after continue. + /// + public class PersistentValue + { + /// + /// Delegate that is used to get value. This delegate may be called at any time and should never return null. + /// + public delegate Value ValueGetter(); + + + ValueGetter getter; + + public Value Value { + get { + return getter(); + } + } + + public PersistentValue(ValueGetter getter) + { + this.getter = getter; + } + } +} 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 c79a78d69e..c7adb17594 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 @@ -24,7 +24,7 @@ namespace Debugger internal PropertyVariable(NDebugger debugger, string name, bool isStatic, bool isPublic, EvalCreator evalCreator):base(debugger, name, isStatic, isPublic, null) { this.evalCreator = evalCreator; - this.valueGetter = delegate { return GetValueOfResult(); }; + this.pValue = new PersistentValue(delegate { return GetValueOfResult(); }); } Value GetValueOfResult() 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 2439653d15..abcabdcadb 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 @@ -112,7 +112,7 @@ namespace Debugger /// Gets the subvariables of this value /// /// Delegate that will be called to get the up-to-date value - public virtual IEnumerable GetSubVariables(ValueGetter getter) + public virtual IEnumerable GetSubVariables(PersistentValue pValue) { yield break; } @@ -127,14 +127,14 @@ namespace Debugger public Variable this[string variableName] { get { - foreach(Variable v in GetSubVariables(delegate{ return this.IsExpired?new UnavailableValue(debugger, "Value has expired"):this;})) { + foreach(Variable v in GetSubVariables(new PersistentValue(delegate{ return this.IsExpired?new UnavailableValue(debugger, "Value has expired"):this;}))) { if (v.Name == variableName) return v; } throw new DebuggerException("Subvariable " + variableName + " does not exist"); } } - internal Value(NDebugger debugger, ICorDebugValue corValue) + protected Value(NDebugger debugger, ICorDebugValue corValue) { this.debugger = debugger; if (corValue != null) { diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Variable.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Variable.cs index f8a30f20b7..b87a74a0c9 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Variable.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Variable.cs @@ -11,11 +11,6 @@ using Debugger.Wrappers.CorDebug; namespace Debugger { - /// - /// Delegate that is used to get value. This delegate may be called at any time and should never return null. - /// - public delegate Value ValueGetter(); - public class Variable: RemotingObjectBase { protected NDebugger debugger; @@ -23,7 +18,7 @@ namespace Debugger string name; VariableCollection subVariables; - internal protected ValueGetter valueGetter; + internal protected PersistentValue pValue; internal Value cachedValue; event EventHandler valueChanged; @@ -61,7 +56,7 @@ namespace Debugger public Value Value { get { if (cachedValue == null || cachedValue.IsExpired) { - cachedValue = valueGetter(); + cachedValue = pValue.Value; if (cachedValue == null) throw new DebuggerException("ValueGetter returned null"); cachedValue.ValueChanged += delegate { OnValueChanged(); }; } @@ -108,16 +103,16 @@ namespace Debugger } - public Variable(Value val, string name):this(val.Debugger, name, delegate {return val;}) + public Variable(Value val, string name):this(val.Debugger, name, new PersistentValue(delegate {return val;})) { } - public Variable(NDebugger debugger, string name, ValueGetter valueGetter) + public Variable(NDebugger debugger, string name, PersistentValue pValue) { this.debugger = debugger; this.name = name; - this.valueGetter = valueGetter; + this.pValue = pValue; this.subVariables = new VariableCollection(debugger); this.subVariables.Updating += OnSubVariablesUpdating; @@ -131,7 +126,7 @@ namespace Debugger void OnSubVariablesUpdating(object sender, VariableCollectionEventArgs e) { - subVariables.UpdateTo(Value.GetSubVariables(delegate{return this.Value;})); + subVariables.UpdateTo(Value.GetSubVariables(new PersistentValue(delegate{return this.Value;}))); } } } diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/VariableCollection.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/VariableCollection.cs index 6afe4b0eeb..b18b155c7d 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/VariableCollection.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/VariableCollection.cs @@ -148,7 +148,7 @@ namespace Debugger // HACK: Realy bad object-oriented design!!! // Trasfer the new variable into the old one if (oldVariable != newVariable) { - oldVariable.valueGetter = newVariable.valueGetter; + oldVariable.pValue = newVariable.pValue; oldVariable.cachedValue = null; if (newVariable is ClassVariable && oldVariable is ClassVariable) { ((ClassVariable)oldVariable).isPublic = ((ClassVariable)oldVariable).isPublic;