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
return target.GetArrayElement(indexes.ToArray()); 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) public override object VisitMemberReferenceExpression(MemberReferenceExpression memberReferenceExpression, object data)
{ {
Value target = (Value)memberReferenceExpression.TargetObject.AcceptVisitor(this, null); Value target = (Value)memberReferenceExpression.TargetObject.AcceptVisitor(this, null);
@ -109,9 +127,15 @@ namespace Debugger.AddIn
public override object VisitPrimitiveExpression(PrimitiveExpression primitiveExpression, object data) public override object VisitPrimitiveExpression(PrimitiveExpression primitiveExpression, object data)
{ {
Value val = Eval.NewObjectNoConstructor(DebugType.Create(context.Process, null, primitiveExpression.Value.GetType().FullName)); if (primitiveExpression.Value == null) {
val.PrimitiveValue = primitiveExpression.Value; return Eval.CreateValue(context.Process, null);
return val; } 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) 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
} }
try { try {
Value val = AstEvaluator.Evaluate(code, SupportedLanguage.CSharp, process.SelectedStackFrame); Value val = AstEvaluator.Evaluate(code, SupportedLanguage.CSharp, process.SelectedStackFrame);
if (val != null) { if (val == null) {
return val.InvokeToString();
} else {
return string.Empty; return string.Empty;
} if (val.IsNull) {
return "null";
} else {
return val.InvokeToString();
} }
} catch (GetValueException e) { } catch (GetValueException e) {
return e.Message; return e.Message;

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

@ -252,13 +252,21 @@ namespace Debugger
// The advantage is that it does not continue the process // The advantage is that it does not continue the process
public static Value CreateValue(Process process, object value) 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"); 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); 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); Value v = new Value(process, new Expressions.PrimitiveExpression(value), corValue);
v.PrimitiveValue = value; if (value != null) {
v.PrimitiveValue = value;
}
return v; return v;
} }

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

@ -33,6 +33,8 @@ namespace Debugger.MetaData
Field = 0x0100, Field = 0x0100,
Property = 0x0200, Property = 0x0200,
Method = 0x0400, 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
} }
} }
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 T QueryMember<T>(uint token) where T:MemberInfo
{ {
List<T> result = QueryMembers<T>(BindingFlags.All, null, token); List<T> result = QueryMembers<T>(BindingFlags.All, null, token);
@ -138,6 +148,12 @@ namespace Debugger.MetaData
results.Add((T)memberInfo); 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; queries[query] = results;
return results; return results;
} }
@ -174,6 +190,12 @@ namespace Debugger.MetaData
return QueryMember<MemberInfo>(name); 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> /// <summary> Return first member with the given token</summary>
public MemberInfo GetMember(uint token) public MemberInfo GetMember(uint token)
{ {

Loading…
Cancel
Save