From 8436503701cdaa80dbaac52a2f6cae1e1cebb5a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Srbeck=C3=BD?= Date: Sat, 30 Aug 2008 17:15:01 +0000 Subject: [PATCH] Started implementation of evaluation of InvocationExpression git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3459 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/Expressions/EvaluateAstVisitor.cs | 30 +++++++++++++++++-- .../Project/Src/Pads/ConsolePad.cs | 8 +++-- .../Debugger.Core/Project/Src/Control/Eval.cs | 16 +++++++--- .../Project/Src/Metadata/BindingFlags.cs | 4 ++- .../Project/Src/Metadata/DebugType-Helpers.cs | 22 ++++++++++++++ 5 files changed, 69 insertions(+), 11 deletions(-) diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Expressions/EvaluateAstVisitor.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Expressions/EvaluateAstVisitor.cs index 659ae91328..07731acdd3 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Expressions/EvaluateAstVisitor.cs +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Expressions/EvaluateAstVisitor.cs @@ -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 args = new List(); + 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 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) diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/ConsolePad.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/ConsolePad.cs index cab3640f10..92bf9836a3 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/ConsolePad.cs +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/ConsolePad.cs @@ -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; diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Eval.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Eval.cs index 6f95163a43..decb719238 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Eval.cs +++ b/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 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; } diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/BindingFlags.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/BindingFlags.cs index 94479a7062..94c3f21e82 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/BindingFlags.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/BindingFlags.cs @@ -33,6 +33,8 @@ namespace Debugger.MetaData Field = 0x0100, Property = 0x0200, Method = 0x0400, - GetProperty = 0x0800 + GetProperty = 0x0800, + + IncludeSuperType = 0x1000 }; } diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType-Helpers.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType-Helpers.cs index 4e07d8fcb8..c10113bf0f 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType-Helpers.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType-Helpers.cs @@ -70,6 +70,16 @@ namespace Debugger.MetaData } } + T QueryMember(string name, BindingFlags bindingFlags) where T:MemberInfo + { + List result = QueryMembers(bindingFlags, name, null); + if (result.Count > 0) { + return result[0]; + } else { + return null; + } + } + T QueryMember(uint token) where T:MemberInfo { List result = QueryMembers(BindingFlags.All, null, token); @@ -138,6 +148,12 @@ namespace Debugger.MetaData results.Add((T)memberInfo); } + // Query supertype + if ((bindingFlags & BindingFlags.IncludeSuperType) != 0 && this.BaseType != null) { + List superResults = this.BaseType.QueryMembers(bindingFlags, name, token); + results.AddRange(superResults); + } + queries[query] = results; return results; } @@ -174,6 +190,12 @@ namespace Debugger.MetaData return QueryMember(name); } + /// Return first member with the given name + public MemberInfo GetMember(string name, BindingFlags bindingFlags) + { + return QueryMember(name, bindingFlags); + } + /// Return first member with the given token public MemberInfo GetMember(uint token) {