Browse Source

Fixed remaining compile errors in Debugger.Core

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5105 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
David Srbecký 16 years ago
parent
commit
11dfb6ffef
  1. 1
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj
  2. 8
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Eval.cs
  3. 8
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/StackFrame.cs
  4. 22
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/ExpressionEvaluator.cs
  5. 16
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/ExpressionExtensionMethods.cs
  6. 11
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugFieldInfo.cs
  7. 37
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugMethodInfo.cs
  8. 9
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugPropertyInfo.cs
  9. 174
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType.cs
  10. 18
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/IDebugMemberInfo.cs
  11. 79
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Values/Value.Object.cs

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

@ -225,6 +225,7 @@ @@ -225,6 +225,7 @@
<Compile Include="Src\Metadata\DebugFieldInfo.cs" />
<Compile Include="Src\Metadata\DebugMethodInfo.cs" />
<Compile Include="Src\Metadata\DebugPropertyInfo.cs" />
<Compile Include="Src\Metadata\IDebugMemberInfo.cs" />
<Compile Include="Src\Mono.Cecil\Mono.Cecil.Binary\ImageFormatException.cs" />
<Compile Include="Src\Mono.Cecil\Mono.Cecil.Metadata\CodedIndex.cs" />
<Compile Include="Src\Mono.Cecil\Mono.Cecil.Metadata\ElementType.cs" />

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

@ -250,7 +250,7 @@ namespace Debugger @@ -250,7 +250,7 @@ namespace Debugger
}
}
ICorDebugType[] genericArgs = method.DeclaringType.GenericArgumentsAsCorDebugType;
ICorDebugType[] genericArgs = ((DebugType)method.DeclaringType).GenericArgumentsAsCorDebugType;
eval.CorEval.CastTo<ICorDebugEval2>().CallParameterizedFunction(
method.CorFunction,
(uint)genericArgs.Length, genericArgs,
@ -338,7 +338,7 @@ namespace Debugger @@ -338,7 +338,7 @@ namespace Debugger
public static Eval AsyncNewObject(DebugType debugType, Value[] constructorArguments, DebugType[] constructorArgumentsTypes)
{
ICorDebugValue[] constructorArgsCorDebug = ValuesAsCorDebug(constructorArguments);
DebugMethodInfo constructor = debugType.GetMethod(".ctor", constructorArgumentsTypes);
DebugMethodInfo constructor = (DebugMethodInfo)debugType.GetMethod(".ctor", constructorArgumentsTypes);
if (constructor == null) {
throw new DebuggerException(string.Format("Type {0} has no constructor overload with given argument types.", debugType.FullName));
}
@ -347,7 +347,7 @@ namespace Debugger @@ -347,7 +347,7 @@ namespace Debugger
"New object: " + debugType.FullName,
delegate(Eval eval) {
eval.CorEval.CastTo<ICorDebugEval2>().NewParameterizedObject(
constructor.CorFunction, (uint)debugType.GenericArguments.Count, debugType.GenericArgumentsAsCorDebugType,
constructor.CorFunction, (uint)debugType.GetGenericArguments().Length, debugType.GenericArgumentsAsCorDebugType,
(uint)constructorArgsCorDebug.Length, constructorArgsCorDebug);
}
);
@ -359,7 +359,7 @@ namespace Debugger @@ -359,7 +359,7 @@ namespace Debugger
debugType.AppDomain,
"New object: " + debugType.FullName,
delegate(Eval eval) {
eval.CorEval.CastTo<ICorDebugEval2>().NewParameterizedObjectNoConstructor(debugType.CorType.Class, (uint)debugType.GenericArguments.Count, debugType.GenericArgumentsAsCorDebugType);
eval.CorEval.CastTo<ICorDebugEval2>().NewParameterizedObjectNoConstructor(debugType.CorType.Class, (uint)debugType.GetGenericArguments().Length, debugType.GenericArgumentsAsCorDebugType);
}
);
}

8
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/StackFrame.cs

@ -119,7 +119,7 @@ namespace Debugger @@ -119,7 +119,7 @@ namespace Debugger
corFunction.Class,
genArgs.ToArray()
);
this.methodInfo = debugType.GetMethod(corFunction.Token);
this.methodInfo = (DebugMethodInfo)debugType.GetMember(corFunction.Token);
}
/// <summary> Returns diagnostic description of the frame </summary>
@ -151,7 +151,7 @@ namespace Debugger @@ -151,7 +151,7 @@ namespace Debugger
SourcecodeSegment GetSegmentForOffet(uint offset)
{
return SourcecodeSegment.Resolve(this.MethodInfo.Module, corFunction, offset);
return SourcecodeSegment.Resolve(this.MethodInfo.DebugModule, corFunction, offset);
}
/// <summary> Step into next instruction </summary>
@ -197,7 +197,7 @@ namespace Debugger @@ -197,7 +197,7 @@ namespace Debugger
void AsyncStep(bool stepIn)
{
if (this.MethodInfo.Module.HasSymbols == false) {
if (this.MethodInfo.DebugModule.HasSymbols == false) {
throw new DebuggerException("Unable to step. No symbols loaded.");
}
@ -256,7 +256,7 @@ namespace Debugger @@ -256,7 +256,7 @@ namespace Debugger
{
process.AssertPaused();
SourcecodeSegment segment = SourcecodeSegment.Resolve(this.MethodInfo.Module, filename, null, line, column);
SourcecodeSegment segment = SourcecodeSegment.Resolve(this.MethodInfo.DebugModule, filename, null, line, column);
if (segment != null && segment.CorFunction.Token == this.MethodInfo.MetadataToken) {
try {

22
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/ExpressionEvaluator.cs

@ -107,7 +107,7 @@ namespace Debugger @@ -107,7 +107,7 @@ namespace Debugger
int count = (int)val.GetMemberValue("Count").PrimitiveValue;
for(int i = 0; i < count; i++) {
if (i > 0) sb.Append(", ");
PropertyInfo itemProperty = val.Type.GetProperty("Item");
DebugPropertyInfo itemProperty = (DebugPropertyInfo)val.Type.GetProperty("Item");
Value item = val.GetPropertyValue(itemProperty, Eval.CreateValue(val.AppDomain, i));
sb.Append(FormatValue(item));
}
@ -275,9 +275,11 @@ namespace Debugger @@ -275,9 +275,11 @@ namespace Debugger
Value member = context.GetThisValue().GetMemberValue(identifier);
if (member != null) return member;
} else {
MemberInfo memberInfo = context.MethodInfo.DeclaringType.GetMember(identifier);
IDebugMemberInfo memberInfo =
(IDebugMemberInfo)context.MethodInfo.DeclaringType.GetField(identifier) ??
(IDebugMemberInfo)context.MethodInfo.DeclaringType.GetProperty(identifier);
if (memberInfo != null && memberInfo.IsStatic) {
return Value.GetMemberValue(null, memberInfo, null);
return Value.GetMemberValue(null, (MemberInfo)memberInfo, null);
}
}
@ -312,7 +314,7 @@ namespace Debugger @@ -312,7 +314,7 @@ namespace Debugger
}
}
PropertyInfo pi = target.Type.GetProperty("Item");
DebugPropertyInfo pi = (DebugPropertyInfo)target.Type.GetProperty("Item");
if (pi == null) throw new GetValueException("The object does not have an indexer property");
return target.GetPropertyValue(pi, indexes.ToArray());
}
@ -361,7 +363,7 @@ namespace Debugger @@ -361,7 +363,7 @@ namespace Debugger
foreach(Expression expr in invocationExpression.Arguments) {
args.Add(Evaluate(expr));
}
return target.InvokeMethod(method, args.ToArray());
return target.InvokeMethod((DebugMethodInfo)method, args.ToArray());
}
public override object VisitObjectCreateExpression(ObjectCreateExpression objectCreateExpression, object data)
@ -383,12 +385,12 @@ namespace Debugger @@ -383,12 +385,12 @@ namespace Debugger
{
Value target = Evaluate(memberReferenceExpression.TargetObject);
DebugType targetType = GetDebugType(memberReferenceExpression.TargetObject) ?? target.Type;
MemberInfo memberInfo = targetType.GetMember(memberReferenceExpression.MemberName, BindingFlagsAllDeclared);
if (memberInfo == null)
memberInfo = targetType.GetMember(memberReferenceExpression.MemberName, BindingFlagsAll);
if (memberInfo == null)
MemberInfo[] memberInfos = targetType.GetMember(memberReferenceExpression.MemberName, BindingFlagsAllDeclared);
if (memberInfos.Length == 0)
memberInfos = targetType.GetMember(memberReferenceExpression.MemberName, BindingFlagsAll);
if (memberInfos.Length == 0)
throw new GetValueException("Member \"" + memberReferenceExpression.MemberName + "\" not found");
Value member = target.GetMemberValue(memberInfo);
Value member = target.GetMemberValue(memberInfos[0]);
return member;
}

16
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/ExpressionExtensionMethods.cs

@ -40,7 +40,7 @@ namespace Debugger @@ -40,7 +40,7 @@ namespace Debugger
return indexerExpr;
}
public static Expression AppendMemberReference(this Expression expresion, MemberInfo memberInfo, params Expression[] args)
public static Expression AppendMemberReference(this Expression expresion, IDebugMemberInfo memberInfo, params Expression[] args)
{
Expression target;
if (memberInfo.IsStatic) {
@ -77,7 +77,7 @@ namespace Debugger @@ -77,7 +77,7 @@ namespace Debugger
throw new DebuggerException("Arguments expected only for the Item property");
return new IndexerExpression(
target,
AddExplicitTypes(propInfo.GetMethod ?? propInfo.SetMethod, args)
AddExplicitTypes(propInfo.GetGetMethod() ?? propInfo.GetSetMethod(), args)
);
} else {
return new MemberReferenceExpression(target, memberInfo.Name);
@ -88,13 +88,13 @@ namespace Debugger @@ -88,13 +88,13 @@ namespace Debugger
static List<Expression> AddExplicitTypes(MethodInfo method, Expression[] args)
{
if (args.Length != method.ParameterCount)
if (args.Length != method.GetParameters().Length)
throw new DebuggerException("Incorrect number of arguments");
List<Expression> typedArgs = new List<Expression>(args.Length);
for(int i = 0; i < args.Length; i++) {
typedArgs.Add(
new CastExpression(
method.ParameterTypes[i].ToTypeReference(),
method.GetParameters()[i].ParameterType.ToTypeReference(),
new ParenthesizedExpression(args[i]),
CastType.Cast
)
@ -103,7 +103,7 @@ namespace Debugger @@ -103,7 +103,7 @@ namespace Debugger
return typedArgs;
}
public static TypeReference ToTypeReference(this DebugType type)
public static TypeReference ToTypeReference(this Type type)
{
List<int> arrayRanks = new List<int>();
int pointerNest = 0;
@ -112,10 +112,10 @@ namespace Debugger @@ -112,10 +112,10 @@ namespace Debugger
// TODO: Check
if (type.IsArray) {
arrayRanks.Insert(0, type.GetArrayRank() - 1);
type = type.ElementType;
type = type.GetElementType();
} else if (type.IsPointer) {
pointerNest++;
type = type.ElementType;
type = type.GetElementType();
} else {
break;
}
@ -124,7 +124,7 @@ namespace Debugger @@ -124,7 +124,7 @@ namespace Debugger
if (name.IndexOf('<') != -1)
name = name.Substring(0, name.IndexOf('<'));
List<TypeReference> genArgs = new List<TypeReference>();
foreach(DebugType genArg in type.GenericArguments) {
foreach(DebugType genArg in type.GetGenericArguments()) {
genArgs.Add(genArg.ToTypeReference());
}
TypeReference typeRef = new TypeReference(name, pointerNest, arrayRanks.ToArray(), genArgs);

11
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugFieldInfo.cs

@ -16,7 +16,7 @@ using Mono.Cecil.Signatures; @@ -16,7 +16,7 @@ using Mono.Cecil.Signatures;
namespace Debugger.MetaData
{
public class DebugFieldInfo : System.Reflection.FieldInfo
public class DebugFieldInfo : System.Reflection.FieldInfo, IDebugMemberInfo
{
DebugType declaringType;
FieldProps fieldProps;
@ -47,6 +47,13 @@ namespace Debugger.MetaData @@ -47,6 +47,13 @@ namespace Debugger.MetaData
}
}
/// <summary> The Module in which this member is loaded </summary>
public Debugger.Module DebugModule {
get {
return declaringType.DebugModule;
}
}
[Debugger.Tests.Ignore]
public override int MetadataToken {
get {
@ -99,7 +106,7 @@ namespace Debugger.MetaData @@ -99,7 +106,7 @@ namespace Debugger.MetaData
get {
SignatureReader sigReader = new SignatureReader(fieldProps.SigBlob.GetData());
FieldSig fieldSig = sigReader.GetFieldSig(0);
return DebugType.CreateFromSignature(this.Module, fieldSig.Type, declaringType);
return DebugType.CreateFromSignature(this.DebugModule, fieldSig.Type, declaringType);
}
}

37
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugMethodInfo.cs

@ -19,7 +19,7 @@ using Mono.Cecil.Signatures; @@ -19,7 +19,7 @@ using Mono.Cecil.Signatures;
namespace Debugger.MetaData
{
public class DebugMethodInfo: System.Reflection.MethodInfo
public class DebugMethodInfo: System.Reflection.MethodInfo, IDebugMemberInfo
{
DebugType declaringType;
MethodProps methodProps;
@ -50,6 +50,13 @@ namespace Debugger.MetaData @@ -50,6 +50,13 @@ namespace Debugger.MetaData
}
}
/// <summary> The Module in which this member is loaded </summary>
public Debugger.Module DebugModule {
get {
return declaringType.DebugModule;
}
}
public override int MetadataToken {
get {
return (int)methodProps.Token;
@ -144,7 +151,7 @@ namespace Debugger.MetaData @@ -144,7 +151,7 @@ namespace Debugger.MetaData
{
if (this.MethodDefSig.RetType.Void) return null;
if (returnType == null) {
returnType = DebugType.CreateFromSignature(this.Module, this.MethodDefSig.RetType.Type, declaringType);
returnType = DebugType.CreateFromSignature(this.DebugModule, this.MethodDefSig.RetType.Type, declaringType);
}
return returnType;
}
@ -180,7 +187,7 @@ namespace Debugger.MetaData @@ -180,7 +187,7 @@ namespace Debugger.MetaData
new DebugParameterInfo(
this,
this.GetParameterName(i),
DebugType.CreateFromSignature(this.Module, this.MethodDefSig.Parameters[i].Type, declaringType),
DebugType.CreateFromSignature(this.DebugModule, this.MethodDefSig.Parameters[i].Type, declaringType),
i
);
}
@ -193,7 +200,7 @@ namespace Debugger.MetaData @@ -193,7 +200,7 @@ namespace Debugger.MetaData
internal ICorDebugFunction CorFunction {
get {
return this.Module.CorModule.GetFunctionFromToken(this.MetadataToken);
return this.DebugModule.CorModule.GetFunctionFromToken((uint)this.MetadataToken);
}
}
@ -317,7 +324,7 @@ namespace Debugger.MetaData @@ -317,7 +324,7 @@ namespace Debugger.MetaData
if (token != 0) {
// process.TraceMessage("Token: " + token.ToString("x"));
MemberInfo member = this.DeclaringType.GetMember(token);
MemberInfo member = declaringType.GetMember(token);
if (member == null) return null;
if (!(member is DebugFieldInfo)) return null;
@ -387,13 +394,13 @@ namespace Debugger.MetaData @@ -387,13 +394,13 @@ namespace Debugger.MetaData
hasDebuggerAttributeCache =
// Look on the method
HasAnyAttribute(this.Module.MetaData, methodProps.Token,
HasAnyAttribute(this.DebugModule.MetaData, methodProps.Token,
typeof(System.Diagnostics.DebuggerStepThroughAttribute),
typeof(System.Diagnostics.DebuggerNonUserCodeAttribute),
typeof(System.Diagnostics.DebuggerHiddenAttribute))
||
// Look on the type
HasAnyAttribute(this.Module.MetaData, (uint)this.DeclaringType.MetadataToken,
HasAnyAttribute(this.DebugModule.MetaData, (uint)this.DeclaringType.MetadataToken,
typeof(System.Diagnostics.DebuggerStepThroughAttribute),
typeof(System.Diagnostics.DebuggerNonUserCodeAttribute),
typeof(System.Diagnostics.DebuggerHiddenAttribute));
@ -435,7 +442,7 @@ namespace Debugger.MetaData @@ -435,7 +442,7 @@ namespace Debugger.MetaData
/// <summary>
/// Get a method from a managed type, method name and argument count
/// </summary>
public static MethodInfo GetFromName(AppDomain appDomain, System.Type type, string methodName, int paramCount)
public static DebugMethodInfo GetFromName(AppDomain appDomain, System.Type type, string methodName, int paramCount)
{
if (type.IsNested) throw new DebuggerException("Not implemented for nested types");
if (type.IsGenericType) throw new DebuggerException("Not implemented for generic types");
@ -446,7 +453,7 @@ namespace Debugger.MetaData @@ -446,7 +453,7 @@ namespace Debugger.MetaData
throw new DebuggerException("Type " + type.FullName + " not found");
}
foreach(MethodInfo methodInfo in debugType.GetMethods(methodName)) {
foreach(DebugMethodInfo methodInfo in debugType.GetMethods(methodName, DebugType.BindingFlagsAll)) {
if (methodInfo.ParameterCount == paramCount) {
return methodInfo;
}
@ -456,9 +463,9 @@ namespace Debugger.MetaData @@ -456,9 +463,9 @@ namespace Debugger.MetaData
internal ISymUnmanagedMethod SymMethod {
get {
if (this.Module.SymReader == null) return null;
if (this.DebugModule.SymReader == null) return null;
try {
return this.Module.SymReader.GetMethod(this.MetadataToken);
return this.DebugModule.SymReader.GetMethod((uint)this.MetadataToken);
} catch {
return null;
}
@ -478,7 +485,7 @@ namespace Debugger.MetaData @@ -478,7 +485,7 @@ namespace Debugger.MetaData
{
// index = 0 is return parameter
try {
return this.Module.MetaData.GetParamPropsForMethodIndex(this.MetadataToken, (uint)index + 1).Name;
return this.DebugModule.MetaData.GetParamPropsForMethodIndex((uint)this.MetadataToken, (uint)index + 1).Name;
} catch {
return String.Empty;
}
@ -551,7 +558,7 @@ namespace Debugger.MetaData @@ -551,7 +558,7 @@ namespace Debugger.MetaData
if (!this.IsStatic) {
DebugLocalVariableInfo thisVar = new DebugLocalVariableInfo(
"this",
this.DeclaringType,
declaringType,
delegate(StackFrame context) {
return context.GetThisValue();
}
@ -571,7 +578,7 @@ namespace Debugger.MetaData @@ -571,7 +578,7 @@ namespace Debugger.MetaData
if (fieldInfo.Name.StartsWith("CS$")) continue; // Ignore
DebugLocalVariableInfo locVar = new DebugLocalVariableInfo(
fieldInfo.Name,
fieldInfo.FieldType,
(DebugType)fieldInfo.FieldType,
delegate(StackFrame context) {
return getCaptureClass(context).GetFieldValue(fieldInfoCopy);
}
@ -610,7 +617,7 @@ namespace Debugger.MetaData @@ -610,7 +617,7 @@ namespace Debugger.MetaData
int start;
SignatureReader sigReader = new SignatureReader(symVar.Signature);
LocalVarSig.LocalVariable locVarSig = sigReader.ReadLocalVariable(sigReader.Blob, 0, out start);
DebugType locVarType = DebugType.CreateFromSignature(this.Module, locVarSig.Type, declaringType);
DebugType locVarType = DebugType.CreateFromSignature(this.DebugModule, locVarSig.Type, declaringType);
// Compiler generated?
// NB: Display class does not have the compiler-generated flag
if ((symVar.Attributes & 1) == 1 || symVar.Name.StartsWith("CS$")) {

9
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugPropertyInfo.cs

@ -15,7 +15,7 @@ using Debugger.Wrappers.MetaData; @@ -15,7 +15,7 @@ using Debugger.Wrappers.MetaData;
namespace Debugger.MetaData
{
public class DebugPropertyInfo : System.Reflection.PropertyInfo
public class DebugPropertyInfo : System.Reflection.PropertyInfo, IDebugMemberInfo
{
DebugType declaringType;
MethodInfo getMethod;
@ -50,6 +50,13 @@ namespace Debugger.MetaData @@ -50,6 +50,13 @@ namespace Debugger.MetaData
}
}
/// <summary> The Module in which this member is loaded </summary>
public Debugger.Module DebugModule {
get {
return declaringType.DebugModule;
}
}
public override int MetadataToken {
get {
return (getMethod ?? setMethod).MetadataToken;

174
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType.cs

@ -29,8 +29,8 @@ namespace Debugger.MetaData @@ -29,8 +29,8 @@ namespace Debugger.MetaData
/// </remarks>
public class DebugType: System.Type
{
const BindingFlags BindingFlagsAll = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance;
const BindingFlags BindingFlagsAllDeclared = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance;
public const BindingFlags BindingFlagsAll = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance;
public const BindingFlags BindingFlagsAllDeclared = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance;
AppDomain appDomain;
Process process;
@ -48,7 +48,8 @@ namespace Debugger.MetaData @@ -48,7 +48,8 @@ namespace Debugger.MetaData
List<DebugType> interfaces = new List<DebugType>();
// Members of the type; empty if not applicable
Dictionary<string, List<MemberInfo>> members = new Dictionary<string, List<MemberInfo>>();
Dictionary<string, List<MemberInfo>> membersByName = new Dictionary<string, List<MemberInfo>>();
Dictionary<int, MemberInfo> membersByToken = new Dictionary<int, MemberInfo>();
// Stores all DebugType instances. FullName is the key
static Dictionary<ICorDebugType, DebugType> loadedTypes = new Dictionary<ICorDebugType, DebugType>();
@ -59,6 +60,29 @@ namespace Debugger.MetaData @@ -59,6 +60,29 @@ namespace Debugger.MetaData
}
}
/// <summary> The AppDomain in which this type is loaded </summary>
[Debugger.Tests.Ignore]
public AppDomain AppDomain {
get {
return appDomain;
}
}
/// <summary> The Process in which this member is loaded </summary>
[Debugger.Tests.Ignore]
public Process Process {
get {
return process;
}
}
/// <summary> The Module in which this member is loaded </summary>
public Debugger.Module DebugModule {
get {
return module;
}
}
public override int MetadataToken {
get {
AssertClassOrValueType();
@ -160,8 +184,7 @@ namespace Debugger.MetaData @@ -160,8 +184,7 @@ namespace Debugger.MetaData
public override System.Reflection.Module Module {
get {
AssertClassOrValueType();
return module;
throw new NotSupportedException();
}
}
@ -211,11 +234,21 @@ namespace Debugger.MetaData @@ -211,11 +234,21 @@ namespace Debugger.MetaData
public override Type GetElementType()
{
return this.GenericArguments[0];
if (this.IsArray || this.IsPointer) {
return typeArguments[0];
} else {
return null;
}
}
const BindingFlags supportedFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly | BindingFlags.FlattenHierarchy;
/// <summary> Return member with the given token</summary>
public MemberInfo GetMember(uint token)
{
return membersByToken[(int)token];
}
public T GetMember<T>(string name, BindingFlags bindingFlags, Predicate<T> filter) where T:MemberInfo
{
T[] res = GetMembers<T>(name, bindingFlags, filter);
@ -239,7 +272,7 @@ namespace Debugger.MetaData @@ -239,7 +272,7 @@ namespace Debugger.MetaData
throw new ArgumentException("Instance or Static flag must be included", "bindingFlags");
List<T> results = new List<T>();
foreach(List<MemberInfo> memberInfos in members.Values) {
foreach(List<MemberInfo> memberInfos in membersByName.Values) {
foreach(MemberInfo memberInfo in memberInfos) {
// Filter by type
if (!(memberInfo is T)) continue; // Reject item
@ -250,34 +283,14 @@ namespace Debugger.MetaData @@ -250,34 +283,14 @@ namespace Debugger.MetaData
}
// Filter by access
bool memberIsPublic;
if (memberInfo is FieldInfo) {
memberIsPublic = ((FieldInfo)memberInfo).IsPublic;
} else if (memberInfo is DebugPropertyInfo) {
memberIsPublic = ((DebugPropertyInfo)memberInfo).IsPublic;
} else if (memberInfo is MethodInfo) {
memberIsPublic = ((MethodInfo)memberInfo).IsPublic;
} else {
throw new DebuggerException("Unexpected type: " + memberInfo.GetType());
}
if (memberIsPublic) {
if (((IDebugMemberInfo)memberInfo).IsPublic) {
if ((bindingFlags & BindingFlags.Public) == 0) continue; // Reject item
} else {
if ((bindingFlags & BindingFlags.NonPublic) == 0) continue; // Reject item
}
// Filter by static / instance
bool memberIsStatic;
if (memberInfo is FieldInfo) {
memberIsStatic = ((FieldInfo)memberInfo).IsStatic;
} else if (memberInfo is DebugPropertyInfo) {
memberIsStatic = ((DebugPropertyInfo)memberInfo).IsStatic;
} else if (memberInfo is MethodInfo) {
memberIsStatic = ((MethodInfo)memberInfo).IsStatic;
} else {
throw new DebuggerException("Unexpected type: " + memberInfo.GetType());
}
if (memberIsStatic) {
if (((IDebugMemberInfo)memberInfo).IsStatic) {
if ((bindingFlags & BindingFlags.Static) == 0) continue; // Reject item
} else {
if ((bindingFlags & BindingFlags.Instance) == 0) continue; // Reject item
@ -296,7 +309,7 @@ namespace Debugger.MetaData @@ -296,7 +309,7 @@ namespace Debugger.MetaData
// Do not include static types
bindingFlags = bindingFlags & ~BindingFlags.Static;
}
List<T> superResults = this.BaseType.GetMembers<T>(name, bindingFlags, filter);
T[] superResults = ((DebugType)this.BaseType).GetMembers<T>(name, bindingFlags, filter);
results.AddRange(superResults);
}
@ -325,7 +338,25 @@ namespace Debugger.MetaData @@ -325,7 +338,25 @@ namespace Debugger.MetaData
return GetMembers<FieldInfo>(null, bindingAttr, null);
}
// public virtual Type[] GetGenericArguments();
public override Type[] GetGenericArguments()
{
if (this.IsArray || this.IsPointer) {
return new Type[] {};
} else {
return typeArguments.ToArray();
}
}
internal ICorDebugType[] GenericArgumentsAsCorDebugType {
get {
List<ICorDebugType> types = new List<ICorDebugType>();
foreach(DebugType arg in GetGenericArguments()) {
types.Add(arg.CorType);
}
return types.ToArray();
}
}
// public virtual Type[] GetGenericParameterConstraints();
// public virtual Type GetGenericTypeDefinition();
@ -360,17 +391,11 @@ namespace Debugger.MetaData @@ -360,17 +391,11 @@ namespace Debugger.MetaData
return GetMembers<MemberInfo>(null, bindingAttr, null);
}
/// <summary> Return first method with the given token</summary>
public MethodInfo GetMethod(uint token)
{
return QueryMember<MethodInfo>(token);
}
/// <summary> Return method overload with given parameter names </summary>
/// <returns> Null if not found </returns>
public MethodInfo GetMethod(string name, string[] paramNames)
{
foreach(MethodInfo candidate in GetMethod(name)) {
foreach(DebugMethodInfo candidate in GetMembers<DebugMethodInfo>(name, BindingFlagsAll, null)) {
if (candidate.ParameterCount == paramNames.Length) {
bool match = true;
for(int i = 0; i < paramNames.Length; i++) {
@ -387,13 +412,13 @@ namespace Debugger.MetaData @@ -387,13 +412,13 @@ namespace Debugger.MetaData
protected override MethodInfo GetMethodImpl(string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] paramTypes, ParameterModifier[] modifiers)
{
// TODO: Finish
foreach(DebugMethodInfo candidate in GetMembers<DebugMethodInfo>(name, bindingAttr, null)) {
foreach(DebugMethodInfo candidate in GetMethods(name, bindingAttr)) {
if (paramTypes == null)
return candidate;
if (candidate.ParameterCount == paramTypes.Length) {
bool match = true;
for(int i = 0; i < paramTypes.Length; i++) {
if (paramTypes[i] != candidate.ParameterTypes[i])
if (paramTypes[i] != candidate.GetParameters()[i].ParameterType)
match = false;
}
if (match)
@ -403,6 +428,11 @@ namespace Debugger.MetaData @@ -403,6 +428,11 @@ namespace Debugger.MetaData
return null;
}
public MethodInfo[] GetMethods(string name, BindingFlags bindingAttr)
{
return GetMembers<MethodInfo>(name, bindingAttr, null);
}
public override MethodInfo[] GetMethods(BindingFlags bindingAttr)
{
return GetMembers<MethodInfo>(null, bindingAttr, null);
@ -506,17 +536,6 @@ namespace Debugger.MetaData @@ -506,17 +536,6 @@ namespace Debugger.MetaData
}
}
/// <summary> Gets the appdomain in which the type was loaded </summary>
[Debugger.Tests.Ignore]
public AppDomain AppDomain {
get { return appDomain; }
}
[Debugger.Tests.Ignore]
public Process Process {
get { return process; }
}
internal ICorDebugType CorType {
get { return corType; }
}
@ -526,38 +545,6 @@ namespace Debugger.MetaData @@ -526,38 +545,6 @@ namespace Debugger.MetaData
get { return interfaces; }
}
/// <summary> Get an element type for array or pointer. </summary>
public DebugType ElementType {
get {
if (this.IsArray || this.IsPointer) {
return typeArguments[0];
} else {
return null;
}
}
}
/// <summary> Gets generics arguments for a type or an empty List for non-generic types. </summary>
public List<DebugType> GenericArguments {
get {
if (this.IsArray || this.IsPointer) {
return new List<DebugType>();
} else {
return typeArguments;
}
}
}
internal ICorDebugType[] GenericArgumentsAsCorDebugType {
get {
List<ICorDebugType> types = new List<ICorDebugType>();
foreach(DebugType arg in this.GenericArguments) {
types.Add(arg.CorType);
}
return types.ToArray();
}
}
/// <summary> Returns what kind of type this is. (eg. value type) </summary>
public DebugTypeKind Kind {
get {
@ -737,7 +724,7 @@ namespace Debugger.MetaData @@ -737,7 +724,7 @@ namespace Debugger.MetaData
{
if (genericArguments != null) {
if (enclosingType != null)
typeName = GetQualifiedName(typeName, genericArguments.Length - enclosingType.GenericArguments.Count);
typeName = GetQualifiedName(typeName, genericArguments.Length - enclosingType.GetGenericArguments().Length);
else
typeName = GetQualifiedName(typeName, genericArguments.Length);
}
@ -745,7 +732,7 @@ namespace Debugger.MetaData @@ -745,7 +732,7 @@ namespace Debugger.MetaData
if (module.AppDomain == appDomain) {
uint token;
try {
token = module.MetaData.FindTypeDefPropsByName(typeName, enclosingType == null ? 0 : enclosingType.MetadataToken).Token;
token = module.MetaData.FindTypeDefPropsByName(typeName, enclosingType == null ? 0 : (uint)enclosingType.MetadataToken).Token;
} catch {
continue;
}
@ -822,7 +809,7 @@ namespace Debugger.MetaData @@ -822,7 +809,7 @@ namespace Debugger.MetaData
// Numbered generic reference
if (sigType is VAR) {
if (declaringType == null) throw new DebuggerException("declaringType is needed");
return declaringType.GenericArguments[((VAR)sigType).Index];
return (DebugType)declaringType.GetGenericArguments()[((VAR)sigType).Index];
}
// Numbered generic reference
@ -986,10 +973,10 @@ namespace Debugger.MetaData @@ -986,10 +973,10 @@ namespace Debugger.MetaData
string GetName(bool includeNamespace)
{
if (IsArray) {
return Trim(this.ElementType.FullName, includeNamespace) + "[" + new String(',', GetArrayRank() - 1) + "]";
return Trim(this.GetElementType().FullName, includeNamespace) + "[" + new String(',', GetArrayRank() - 1) + "]";
} else if (IsClass || IsValueType) {
List<string> argNames = new List<string>();
foreach(DebugType arg in this.GenericArguments) {
foreach(DebugType arg in this.GetGenericArguments()) {
argNames.Add(includeNamespace ? arg.FullName : arg.Name);
}
string className = Trim(classProps.Name, includeNamespace);
@ -1013,7 +1000,7 @@ namespace Debugger.MetaData @@ -1013,7 +1000,7 @@ namespace Debugger.MetaData
} else if (IsPrimitive) {
return Trim(this.PrimitiveType.ToString(), includeNamespace);
} else if (IsPointer) {
return Trim(this.ElementType.FullName, includeNamespace) + (this.corElementType == CorElementType.BYREF ? "&" : "*");
return Trim(this.GetElementType().FullName, includeNamespace) + (this.corElementType == CorElementType.BYREF ? "&" : "*");
} else if (IsVoid) {
return includeNamespace ? "System.Void" : "Void";
} else {
@ -1085,15 +1072,16 @@ namespace Debugger.MetaData @@ -1085,15 +1072,16 @@ namespace Debugger.MetaData
void AddMember(MemberInfo member)
{
if (!members.ContainsKey(member.Name))
members.Add(member.Name, new List<MemberInfo>(1));
members[member.Name].Add(member);
if (!membersByName.ContainsKey(member.Name))
membersByName.Add(member.Name, new List<MemberInfo>(1));
membersByName[member.Name].Add(member);
membersByToken[member.MetadataToken] = member;
}
public bool IsCompilerGenerated {
get {
if (this.IsClass || this.IsValueType) {
return MethodInfo.HasAnyAttribute(this.Module.MetaData, this.MetadataToken, typeof(System.Runtime.CompilerServices.CompilerGeneratedAttribute));
return DebugMethodInfo.HasAnyAttribute(this.DebugModule.MetaData, (uint)this.MetadataToken, typeof(System.Runtime.CompilerServices.CompilerGeneratedAttribute));
} else {
return false;
}

18
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/IDebugMemberInfo.cs

@ -0,0 +1,18 @@ @@ -0,0 +1,18 @@
// <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;
namespace Debugger.MetaData
{
public interface IDebugMemberInfo
{
Type DeclaringType { get; }
string Name { get; }
bool IsStatic { get; }
bool IsPublic { get; }
}
}

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

@ -37,7 +37,7 @@ namespace Debugger @@ -37,7 +37,7 @@ namespace Debugger
}
}
static void CheckObject(Value objectInstance, MemberInfo memberInfo)
static void CheckObject(Value objectInstance, IDebugMemberInfo memberInfo)
{
if (!memberInfo.IsStatic) {
if (objectInstance == null) {
@ -70,10 +70,10 @@ namespace Debugger @@ -70,10 +70,10 @@ namespace Debugger
if (memberInfo is DebugFieldInfo) {
if (arguments.Length > 0) throw new GetValueException("Arguments can not be used for a field");
return GetFieldValue(objectInstance, (DebugFieldInfo)memberInfo);
} else if (memberInfo is PropertyInfo) {
return GetPropertyValue(objectInstance, (PropertyInfo)memberInfo, arguments);
} else if (memberInfo is MethodInfo) {
return InvokeMethod(objectInstance, (MethodInfo)memberInfo, arguments);
} else if (memberInfo is DebugPropertyInfo) {
return GetPropertyValue(objectInstance, (DebugPropertyInfo)memberInfo, arguments);
} else if (memberInfo is DebugMethodInfo) {
return InvokeMethod(objectInstance, (DebugMethodInfo)memberInfo, arguments);
}
throw new DebuggerException("Unknown member type: " + memberInfo.GetType());
}
@ -114,9 +114,9 @@ namespace Debugger @@ -114,9 +114,9 @@ namespace Debugger
try {
if (fieldInfo.IsStatic) {
return fieldInfo.DeclaringType.CorType.GetStaticFieldValue(fieldInfo.MetadataToken, curFrame);
return ((DebugType)fieldInfo.DeclaringType).CorType.GetStaticFieldValue((uint)fieldInfo.MetadataToken, curFrame);
} else {
return objectInstance.CorObjectValue.GetFieldValue(fieldInfo.DeclaringType.CorType.Class, fieldInfo.MetadataToken);
return objectInstance.CorObjectValue.GetFieldValue(((DebugType)fieldInfo.DeclaringType).CorType.Class, (uint)fieldInfo.MetadataToken);
}
} catch {
throw new GetValueException("Can not get value of field");
@ -126,7 +126,7 @@ namespace Debugger @@ -126,7 +126,7 @@ namespace Debugger
#region Convenience overload methods
/// <summary> Get the value of the property using the get accessor </summary>
public Value GetPropertyValue(PropertyInfo propertyInfo, params Value[] arguments)
public Value GetPropertyValue(DebugPropertyInfo propertyInfo, params Value[] arguments)
{
return GetPropertyValue(this, propertyInfo, arguments);
}
@ -134,13 +134,13 @@ namespace Debugger @@ -134,13 +134,13 @@ namespace Debugger
#endregion
/// <summary> Get the value of the property using the get accessor </summary>
public static Value GetPropertyValue(Value objectInstance, PropertyInfo propertyInfo, params Value[] arguments)
public static Value GetPropertyValue(Value objectInstance, DebugPropertyInfo propertyInfo, params Value[] arguments)
{
CheckObject(objectInstance, propertyInfo);
if (propertyInfo.GetMethod == null) throw new GetValueException("Property does not have a get method");
if (propertyInfo.GetGetMethod() == null) throw new GetValueException("Property does not have a get method");
Value val = Value.InvokeMethod(objectInstance, propertyInfo.GetMethod, arguments);
Value val = Value.InvokeMethod(objectInstance, (DebugMethodInfo)propertyInfo.GetGetMethod(), arguments);
return val;
}
@ -148,19 +148,19 @@ namespace Debugger @@ -148,19 +148,19 @@ namespace Debugger
#region Convenience overload methods
/// <summary> Set the value of the property using the set accessor </summary>
public Value SetPropertyValue(PropertyInfo propertyInfo, Value newValue)
public Value SetPropertyValue(DebugPropertyInfo propertyInfo, Value newValue)
{
return SetPropertyValue(this, propertyInfo, null, newValue);
}
/// <summary> Set the value of the property using the set accessor </summary>
public Value SetPropertyValue(PropertyInfo propertyInfo, Value[] arguments, Value newValue)
public Value SetPropertyValue(DebugPropertyInfo propertyInfo, Value[] arguments, Value newValue)
{
return SetPropertyValue(this, propertyInfo, arguments, newValue);
}
/// <summary> Set the value of the property using the set accessor </summary>
public static Value SetPropertyValue(Value objectInstance, PropertyInfo propertyInfo, Value newValue)
public static Value SetPropertyValue(Value objectInstance, DebugPropertyInfo propertyInfo, Value newValue)
{
return SetPropertyValue(objectInstance, propertyInfo, null, newValue);
}
@ -168,11 +168,11 @@ namespace Debugger @@ -168,11 +168,11 @@ namespace Debugger
#endregion
/// <summary> Set the value of the property using the set accessor </summary>
public static Value SetPropertyValue(Value objectInstance, PropertyInfo propertyInfo, Value[] arguments, Value newValue)
public static Value SetPropertyValue(Value objectInstance, DebugPropertyInfo propertyInfo, Value[] arguments, Value newValue)
{
CheckObject(objectInstance, propertyInfo);
if (propertyInfo.SetMethod == null) throw new GetValueException("Property does not have a set method");
if (propertyInfo.GetSetMethod() == null) throw new GetValueException("Property does not have a set method");
arguments = arguments ?? new Value[0];
@ -180,13 +180,13 @@ namespace Debugger @@ -180,13 +180,13 @@ namespace Debugger
allParams[0] = newValue;
arguments.CopyTo(allParams, 1);
return Value.InvokeMethod(objectInstance, propertyInfo.SetMethod, allParams);
return Value.InvokeMethod(objectInstance, (DebugMethodInfo)propertyInfo.GetSetMethod(), allParams);
}
#region Convenience overload methods
/// <summary> Synchronously invoke the method </summary>
public Value InvokeMethod(MethodInfo methodInfo, params Value[] arguments)
public Value InvokeMethod(DebugMethodInfo methodInfo, params Value[] arguments)
{
return InvokeMethod(this, methodInfo, arguments);
}
@ -194,7 +194,7 @@ namespace Debugger @@ -194,7 +194,7 @@ namespace Debugger
#endregion
/// <summary> Synchronously invoke the method </summary>
public static Value InvokeMethod(Value objectInstance, MethodInfo methodInfo, params Value[] arguments)
public static Value InvokeMethod(Value objectInstance, DebugMethodInfo methodInfo, params Value[] arguments)
{
CheckObject(objectInstance, methodInfo);
@ -217,7 +217,7 @@ namespace Debugger @@ -217,7 +217,7 @@ namespace Debugger
#region Convenience overload methods
/// <summary> Asynchronously invoke the method </summary>
public Eval AsyncInvokeMethod(MethodInfo methodInfo, params Value[] arguments)
public Eval AsyncInvokeMethod(DebugMethodInfo methodInfo, params Value[] arguments)
{
return AsyncInvokeMethod(this, methodInfo, arguments);
}
@ -225,7 +225,7 @@ namespace Debugger @@ -225,7 +225,7 @@ namespace Debugger
#endregion
/// <summary> Asynchronously invoke the method </summary>
public static Eval AsyncInvokeMethod(Value objectInstance, MethodInfo methodInfo, params Value[] arguments)
public static Eval AsyncInvokeMethod(Value objectInstance, DebugMethodInfo methodInfo, params Value[] arguments)
{
CheckObject(objectInstance, methodInfo);
@ -242,49 +242,18 @@ namespace Debugger @@ -242,49 +242,18 @@ namespace Debugger
{
DebugType currentType = this.Type;
while (currentType != null) {
MemberInfo memberInfo = currentType.GetMember(name);
MemberInfo memberInfo = currentType.GetMember<MemberInfo>(name, DebugType.BindingFlagsAll, null);
if (memberInfo != null) {
if (memberInfo is DebugFieldInfo) {
return this.GetFieldValue((DebugFieldInfo)memberInfo);
}
if (memberInfo is PropertyInfo) {
return this.GetPropertyValue((PropertyInfo)memberInfo);
if (memberInfo is DebugPropertyInfo) {
return this.GetPropertyValue((DebugPropertyInfo)memberInfo);
}
}
currentType = (DebugType)currentType.BaseType;
}
return null;
}
/// <summary> Get all fields and properties of an object. </summary>
public IEnumerable<Value> GetMemberValues()
{
return GetMemberValues(BindingFlags.All);
}
/// <summary>
/// Get fields and properties of an object which are defined by a given type.
/// </summary>
/// <param name="type"> Limit to type, null for all types </param>
/// <param name="bindingFlags"> Get only members with certain flags </param>
public IEnumerable<Value> GetMemberValues(BindingFlags bindingFlags)
{
if (this.Type.IsClass || this.Type.IsValueType) {
return this.GetPermanentReference().GetObjectMembersEnum(bindingFlags);
} else {
return new Value[0];
}
}
IEnumerable<Value> GetObjectMembersEnum(BindingFlags bindingFlags)
{
foreach(DebugFieldInfo field in this.Type.GetFields(bindingFlags)) {
yield return this.GetFieldValue(field);
}
foreach(PropertyInfo property in this.Type.GetProperties(bindingFlags)) {
if (property.GetMethod.ParameterCount > 0) continue;
yield return this.GetPropertyValue(property);
}
}
}
}

Loading…
Cancel
Save