Browse Source

Values store expression which can be used to re-obtain the value.

Values do not sore names; the name is inferred from the expression.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2843 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
David Srbecký 18 years ago
parent
commit
ae36e44ef6
  1. 2
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/CallStackPad.cs
  2. 1
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj
  3. 11
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/StackFrame.cs
  4. 21
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Expressions/Ast/ArrayIndexerExpression.cs
  5. 29
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Expressions/Ast/EmptyExpression.cs
  6. 8
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Expressions/Ast/MemberReferenceExpression.cs
  7. 6
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Expressions/Ast/ParameterIdentifierExpression.cs
  8. 8
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Expressions/Expression.Create.cs
  9. 6
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Expressions/Expression.cs
  10. 14
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Values/Value.Array.cs
  11. 14
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Values/Value.Object.cs
  12. 23
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Values/Value.cs
  13. 2
      src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/DebuggerTests.cs

2
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/CallStackPad.cs

@ -149,7 +149,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads @@ -149,7 +149,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
}
if (showArgumentValues) {
try {
argValue = f.GetArgument(i).AsString;
argValue = f.GetArgumentValue(i).AsString;
} catch { }
}
if (parameterName != null && argValue != null) {

1
src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj

@ -218,6 +218,7 @@ @@ -218,6 +218,7 @@
<Compile Include="Src\Variables\Evals\EvalEventArgs.cs" />
<Compile Include="Src\Variables\Evals\Process-Evals.cs" />
<Compile Include="Src\Variables\Expressions\Ast\ArrayIndexerExpression.cs" />
<Compile Include="Src\Variables\Expressions\Ast\EmptyExpression.cs" />
<Compile Include="Src\Variables\Expressions\Ast\LocalVariableIdentifierExpression.cs" />
<Compile Include="Src\Variables\Expressions\Ast\MemberReferenceExpression.cs" />
<Compile Include="Src\Variables\Expressions\Ast\ParameterIdentifierExpression.cs" />

11
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/StackFrame.cs

@ -9,6 +9,7 @@ using System; @@ -9,6 +9,7 @@ using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using Debugger.Expressions;
using Debugger.Wrappers.CorDebug;
using Debugger.Wrappers.CorSym;
using Debugger.Wrappers.MetaData;
@ -344,7 +345,7 @@ namespace Debugger @@ -344,7 +345,7 @@ namespace Debugger
/// </summary>
public Value ThisValue {
get {
return new Value(process, "this", ThisCorValue);
return new Value(process, new ThisReferenceExpression(), ThisCorValue);
}
}
@ -390,9 +391,9 @@ namespace Debugger @@ -390,9 +391,9 @@ namespace Debugger
/// <summary> Gets argument with a given index </summary>
/// <param name="index"> Zero-based index </param>
public Value GetArgument(int index)
public Value GetArgumentValue(int index)
{
return new Value(process, this.MethodInfo.GetParameterName(index), GetArgumentCorValue(index));
return new Value(process, new ParameterIdentifierExpression(this.MethodInfo, index), GetArgumentCorValue(index));
}
ICorDebugValue GetArgumentCorValue(int index)
@ -418,7 +419,7 @@ namespace Debugger @@ -418,7 +419,7 @@ namespace Debugger
IEnumerable<Value> ArgumentsEnum {
get {
for (int i = 0; i < ArgumentCount; i++) {
yield return GetArgument(i);
yield return GetArgumentValue(i);
}
}
}
@ -440,7 +441,7 @@ namespace Debugger @@ -440,7 +441,7 @@ namespace Debugger
public Value GetLocalVariableValue(ISymUnmanagedVariable symVar)
{
return new Value(this.Process, symVar.Name, GetCorValueOfLocalVariable(symVar));
return new Value(this.Process, new LocalVariableIdentifierExpression(MethodInfo, symVar), GetCorValueOfLocalVariable(symVar));
}
ICorDebugValue GetCorValueOfLocalVariable(ISymUnmanagedVariable symVar)

21
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Expressions/Ast/ArrayIndexerExpression.cs

@ -27,6 +27,20 @@ namespace Debugger.Expressions @@ -27,6 +27,20 @@ namespace Debugger.Expressions
get { return arguments; }
}
public ArrayIndexerExpression(Expression targetObject, params int[] indices)
{
if (targetObject == null) throw new ArgumentNullException("targetObject");
if (indices == null) throw new ArgumentNullException("indices");
this.targetObject = targetObject;
List<Expression> indicesAst = new List<Expression>();
foreach(int indice in indices) {
indicesAst.Add(new PrimitiveExpression(indice));
}
this.arguments = indicesAst.ToArray();
}
public ArrayIndexerExpression(Expression targetObject, Expression[] arguments)
{
if (targetObject == null) throw new ArgumentNullException("targetObject");
@ -37,9 +51,14 @@ namespace Debugger.Expressions @@ -37,9 +51,14 @@ namespace Debugger.Expressions
}
public override string Code {
get {
return targetObject.Code + this.CodeTail;
}
}
public override string CodeTail {
get {
StringBuilder sb = new StringBuilder();
sb.Append(targetObject.Code);
sb.Append("[");
bool isFirst = true;
foreach(Expression argument in arguments) {

29
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Expressions/Ast/EmptyExpression.cs

@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="David Srbecký" email="dsrbecky@gmail.com"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Collections.Generic;
namespace Debugger.Expressions
{
/// <summary>
/// A placeholder expression which can not be evaluated.
/// </summary>
public class EmptyExpression: Expression
{
public override string Code {
get {
return "?";
}
}
protected override Value EvaluateInternal(StackFrame context)
{
throw new GetValueException("Empty expression");
}
}
}

8
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Expressions/Ast/MemberReferenceExpression.cs

@ -51,6 +51,14 @@ namespace Debugger.Expressions @@ -51,6 +51,14 @@ namespace Debugger.Expressions
sb.Append(targetObject.Code);
}
sb.Append(".");
sb.Append(this.CodeTail);
return sb.ToString();
}
}
public override string CodeTail {
get {
StringBuilder sb = new StringBuilder();
sb.Append(memberInfo.Name);
if (arguments.Length > 0) {
if (memberInfo is PropertyInfo) {

6
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Expressions/Ast/ParameterIdentifierExpression.cs

@ -31,13 +31,13 @@ namespace Debugger.Expressions @@ -31,13 +31,13 @@ namespace Debugger.Expressions
get { return name; }
}
public ParameterIdentifierExpression(MethodInfo method, int index, string name)
public ParameterIdentifierExpression(MethodInfo method, int index)
{
if (method == null) throw new ArgumentNullException("method");
this.method = method;
this.index = index;
this.name = name;
this.name = method.GetParameterName(index);
}
public override string Code {
@ -52,7 +52,7 @@ namespace Debugger.Expressions @@ -52,7 +52,7 @@ namespace Debugger.Expressions
throw new GetValueException("Method " + method.FullName + " expected, " + context.MethodInfo.FullName + " seen");
}
return context.GetArgument(index);
return context.GetArgumentValue(index);
}
}
}

8
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Expressions/Expression.Create.cs

@ -16,11 +16,7 @@ namespace Debugger.Expressions @@ -16,11 +16,7 @@ namespace Debugger.Expressions
{
public Expression AppendIndexer(params int[] indices)
{
List<Expression> indicesAst = new List<Expression>();
foreach(int indice in indices) {
indicesAst.Add(new PrimitiveExpression(indice));
}
return new ArrayIndexerExpression(this, indicesAst.ToArray());
return new ArrayIndexerExpression(this, indices);
}
public ExpressionCollection AppendIndexers(ArrayDimensions dimensions)
@ -82,7 +78,7 @@ namespace Debugger.Expressions @@ -82,7 +78,7 @@ namespace Debugger.Expressions
ExpressionCollection pars = new ExpressionCollection();
for(int i = 0; i < methodInfo.ParameterCount; i++) {
pars.Add(new ParameterIdentifierExpression(methodInfo, i, methodInfo.GetParameterName(i)));
pars.Add(new ParameterIdentifierExpression(methodInfo, i));
}
return pars;

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

@ -20,6 +20,12 @@ namespace Debugger.Expressions @@ -20,6 +20,12 @@ namespace Debugger.Expressions
get;
}
public virtual string CodeTail {
get {
return this.Code;
}
}
public override string ToString()
{
return this.Code;

14
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Values/Value.Array.cs

@ -7,6 +7,8 @@ @@ -7,6 +7,8 @@
using System;
using System.Collections.Generic;
using Debugger.Expressions;
using Debugger.Wrappers.CorDebug;
// TODO: Test non-zero LowerBound
@ -87,17 +89,7 @@ namespace Debugger @@ -87,17 +89,7 @@ namespace Debugger
{
int[] indices = (int[])elementIndices.Clone();
return new Value(Process, GetNameFromIndices(indices), GetCorValueOfArrayElement(indices));
}
static string GetNameFromIndices(int[] indices)
{
string elementName = "[";
for (int i = 0; i < indices.Length; i++) {
elementName += indices[i].ToString() + ",";
}
elementName = elementName.TrimEnd(new char[] {','}) + "]";
return elementName;
return new Value(Process, new ArrayIndexerExpression(this.Expression, indices), GetCorValueOfArrayElement(indices));
}
// May be called later

14
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Values/Value.Object.cs

@ -7,6 +7,8 @@ @@ -7,6 +7,8 @@
using System;
using System.Collections.Generic;
using Debugger.Expressions;
using Debugger.Wrappers.CorDebug;
namespace Debugger
@ -95,9 +97,10 @@ namespace Debugger @@ -95,9 +97,10 @@ namespace Debugger
/// <param name="objectInstance">null if field is static</param>
public static Value GetFieldValue(Value objectInstance, FieldInfo fieldInfo)
{
Expression objectInstanceExpression = objectInstance != null ? objectInstance.Expression : new EmptyExpression();
return new Value(
fieldInfo.Process,
fieldInfo.Name,
new MemberReferenceExpression(objectInstanceExpression, fieldInfo, null),
GetFieldCorValue(objectInstance, fieldInfo)
);
}
@ -157,9 +160,16 @@ namespace Debugger @@ -157,9 +160,16 @@ namespace Debugger
if (propertyInfo.GetMethod == null) throw new GetValueException("Property does not have a get method");
arguments = arguments ?? new Value[0];
Expression objectInstanceExpression = objectInstance != null ? objectInstance.Expression : new EmptyExpression();
List<Expression> argumentExpressions = new List<Expression>();
foreach(Value argument in arguments) {
argumentExpressions.Add(argument.Expression);
}
return new Value(
propertyInfo.Process,
propertyInfo.Name,
new MemberReferenceExpression(objectInstanceExpression, propertyInfo, argumentExpressions.ToArray()),
Value.InvokeMethod(objectInstance, propertyInfo.GetMethod, arguments).RawCorValue
);
}

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

@ -38,7 +38,7 @@ namespace Debugger @@ -38,7 +38,7 @@ namespace Debugger
public partial class Value: DebuggerObject, IExpirable
{
Process process;
string name;
Expression expression;
ICorDebugValue rawCorValue;
ICorDebugValue corValue;
@ -50,10 +50,15 @@ namespace Debugger @@ -50,10 +50,15 @@ namespace Debugger
bool hasExpired = false;
/// <summary> Expression which can be used to reobtain this value. </summary>
public Expression Expression {
get { return expression; }
}
/// <summary> Gets the name associated with the value </summary>
public string Name {
get {
return name;
return this.Expression.CodeTail;
}
}
@ -139,27 +144,19 @@ namespace Debugger @@ -139,27 +144,19 @@ namespace Debugger
internal Value(Process process,
ICorDebugValue rawCorValue)
:this (process, string.Empty, rawCorValue)
:this (process, new EmptyExpression(), rawCorValue)
{
}
internal Value(Process process,
string name,
Expression expression,
ICorDebugValue rawCorValue)
{
this.process = process;
this.name = name;
this.expression = expression;
this.rawCorValue = rawCorValue;
// TODO: clean up
if (name.StartsWith("<") && name.Contains(">") && name != "<Base class>") {
string middle = name.TrimStart('<').Split('>')[0]; // Get text between '<' and '>'
if (middle != "") {
this.name = middle;
}
}
if (this.CorValue == null) {
type = DebugType.GetType(this.Process, "System.Object");
} else {

2
src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/DebuggerTests.cs

@ -206,7 +206,7 @@ namespace Debugger.Tests @@ -206,7 +206,7 @@ namespace Debugger.Tests
StartTest("FunctionVariablesLifetime"); // 1 - Enter program
WaitForPause();
argument = process.SelectedStackFrame.GetArgument(0);
argument = process.SelectedStackFrame.GetArgumentValue(0);
local = process.SelectedStackFrame.LocalVariables["local"];
@class = process.SelectedStackFrame.ContaingClassVariables["class"];
ObjectDump("argument", argument);

Loading…
Cancel
Save