Browse Source

Started implementation of evaluation of InvocationExpression

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3459 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
David Srbecký 18 years ago
parent
commit
8436503701
  1. 30
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Expressions/EvaluateAstVisitor.cs
  2. 8
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/ConsolePad.cs
  3. 16
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Eval.cs
  4. 4
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/BindingFlags.cs
  5. 22
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType-Helpers.cs

30
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Expressions/EvaluateAstVisitor.cs

@ -91,6 +91,24 @@ namespace Debugger.AddIn @@ -91,6 +91,24 @@ namespace Debugger.AddIn
return target.GetArrayElement(indexes.ToArray());
}
public override object VisitInvocationExpression(InvocationExpression invocationExpression, object data)
{
MemberReferenceExpression memberRef = invocationExpression.TargetObject as MemberReferenceExpression;
if (memberRef == null) {
throw new GetValueException("Member reference expected duting method invocation");
}
Value target = ((Value)memberRef.TargetObject.AcceptVisitor(this, null)).GetPermanentReference();
List<Value> args = new List<Value>();
foreach(Expression expr in invocationExpression.Arguments) {
args.Add(((Value)expr.AcceptVisitor(this, null)).GetPermanentReference());
}
MethodInfo method = target.Type.GetMember(memberRef.MemberName, BindingFlags.Method | BindingFlags.IncludeSuperType) as MethodInfo;
if (method == null) {
throw new GetValueException("Method " + memberRef.MemberName + " not found");
}
return target.InvokeMethod(method, args.ToArray());
}
public override object VisitMemberReferenceExpression(MemberReferenceExpression memberReferenceExpression, object data)
{
Value target = (Value)memberReferenceExpression.TargetObject.AcceptVisitor(this, null);
@ -109,9 +127,15 @@ namespace Debugger.AddIn @@ -109,9 +127,15 @@ namespace Debugger.AddIn
public override object VisitPrimitiveExpression(PrimitiveExpression primitiveExpression, object data)
{
Value val = Eval.NewObjectNoConstructor(DebugType.Create(context.Process, null, primitiveExpression.Value.GetType().FullName));
val.PrimitiveValue = primitiveExpression.Value;
return val;
if (primitiveExpression.Value == null) {
return Eval.CreateValue(context.Process, null);
} else if (primitiveExpression.Value is string) {
return Eval.NewString(context.Process, primitiveExpression.Value as string);
} else {
Value val = Eval.NewObjectNoConstructor(DebugType.Create(context.Process, null, primitiveExpression.Value.GetType().FullName));
val.PrimitiveValue = primitiveExpression.Value;
return val;
}
}
public override object VisitThisReferenceExpression(ThisReferenceExpression thisReferenceExpression, object data)

8
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/ConsolePad.cs

@ -79,10 +79,12 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads @@ -79,10 +79,12 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
}
try {
Value val = AstEvaluator.Evaluate(code, SupportedLanguage.CSharp, process.SelectedStackFrame);
if (val != null) {
return val.InvokeToString();
} else {
if (val == null) {
return string.Empty;
} if (val.IsNull) {
return "null";
} else {
return val.InvokeToString();
}
} catch (GetValueException e) {
return e.Message;

16
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Eval.cs

@ -252,13 +252,21 @@ namespace Debugger @@ -252,13 +252,21 @@ namespace Debugger
// The advantage is that it does not continue the process
public static Value CreateValue(Process process, object value)
{
if (value == null) throw new ArgumentNullException("value");
if (value is string) throw new DebuggerException("Can not create string this way");
CorElementType corElemType = DebugType.TypeNameToCorElementType(value.GetType().FullName);
CorElementType corElemType;
ICorDebugClass corClass = null;
if (value != null) {
corElemType = DebugType.TypeNameToCorElementType(value.GetType().FullName);
} else {
corElemType = CorElementType.CLASS;
corClass = DebugType.Create(process, null, typeof(object).FullName).CorType.Class;
}
ICorDebugEval corEval = CreateCorEval(process);
ICorDebugValue corValue = corEval.CreateValue((uint)corElemType, null);
ICorDebugValue corValue = corEval.CreateValue((uint)corElemType, corClass);
Value v = new Value(process, new Expressions.PrimitiveExpression(value), corValue);
v.PrimitiveValue = value;
if (value != null) {
v.PrimitiveValue = value;
}
return v;
}

4
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/BindingFlags.cs

@ -33,6 +33,8 @@ namespace Debugger.MetaData @@ -33,6 +33,8 @@ namespace Debugger.MetaData
Field = 0x0100,
Property = 0x0200,
Method = 0x0400,
GetProperty = 0x0800
GetProperty = 0x0800,
IncludeSuperType = 0x1000
};
}

22
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType-Helpers.cs

@ -70,6 +70,16 @@ namespace Debugger.MetaData @@ -70,6 +70,16 @@ namespace Debugger.MetaData
}
}
T QueryMember<T>(string name, BindingFlags bindingFlags) where T:MemberInfo
{
List<T> result = QueryMembers<T>(bindingFlags, name, null);
if (result.Count > 0) {
return result[0];
} else {
return null;
}
}
T QueryMember<T>(uint token) where T:MemberInfo
{
List<T> result = QueryMembers<T>(BindingFlags.All, null, token);
@ -138,6 +148,12 @@ namespace Debugger.MetaData @@ -138,6 +148,12 @@ namespace Debugger.MetaData
results.Add((T)memberInfo);
}
// Query supertype
if ((bindingFlags & BindingFlags.IncludeSuperType) != 0 && this.BaseType != null) {
List<T> superResults = this.BaseType.QueryMembers<T>(bindingFlags, name, token);
results.AddRange(superResults);
}
queries[query] = results;
return results;
}
@ -174,6 +190,12 @@ namespace Debugger.MetaData @@ -174,6 +190,12 @@ namespace Debugger.MetaData
return QueryMember<MemberInfo>(name);
}
/// <summary> Return first member with the given name</summary>
public MemberInfo GetMember(string name, BindingFlags bindingFlags)
{
return QueryMember<MemberInfo>(name, bindingFlags);
}
/// <summary> Return first member with the given token</summary>
public MemberInfo GetMember(uint token)
{

Loading…
Cancel
Save