diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj
index c3736dc8ee..2ff00fd2e5 100644
--- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj
+++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj
@@ -54,6 +54,8 @@
+
+
diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/MetaData/MetaData.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/MetaData/MetaData.cs
index b159c7bbae..2d3944c67d 100644
--- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/MetaData/MetaData.cs
+++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/MetaData/MetaData.cs
@@ -79,6 +79,25 @@ namespace DebuggerLibrary
return typeRefProps;
}
+ public IList EnumFields(uint typeToken)
+ {
+ List fields = new List();
+
+ IntPtr enumerator = IntPtr.Zero;
+ while (true) {
+ uint fieldToken;
+ uint fieldsFetched;
+ metaData.EnumFields(ref enumerator, typeToken, out fieldToken, 1, out fieldsFetched);
+ if (fieldsFetched == 0) {
+ metaData.CloseEnum(enumerator);
+ break;
+ }
+ fields.Add(GetFieldProps(fieldToken));
+ }
+
+ return fields;
+ }
+
public FieldProps GetFieldProps(uint fieldToken)
{
FieldProps fieldProps;
@@ -122,23 +141,122 @@ namespace DebuggerLibrary
return fieldProps;
}
- public IList EnumFields(uint classToken)
+ public IList EnumMethods(uint typeToken)
{
- List fields = new List();
+ IList methods = new List();
IntPtr enumerator = IntPtr.Zero;
- while (true) {
- uint fieldToken;
- uint fieldCount;
- metaData.EnumFields(ref enumerator, classToken, out fieldToken, 1, out fieldCount);
- if (fieldCount == 0) {
+ while(true) {
+ uint methodToken;
+ uint methodsFetched;
+ metaData.EnumMethods(ref enumerator, typeToken, out methodToken, 1, out methodsFetched);
+ if (methodsFetched == 0) {
metaData.CloseEnum(enumerator);
break;
}
- fields.Add(GetFieldProps(fieldToken));
+ methods.Add(GetMethodProps(methodToken));
}
- return fields;
+ return methods;
+ }
+
+ public unsafe MethodProps GetMethodProps(uint methodToken)
+ {
+ MethodProps methodProps;
+
+ methodProps.Token = methodToken;
+
+ uint pStringLenght = 0; // Terminating character included in pStringLenght
+ IntPtr pString = IntPtr.Zero;
+ IntPtr pSigBlob;
+ uint sigBlobSize;
+ metaData.GetMethodProps(methodProps.Token,
+ out methodProps.ClassToken,
+ pString,
+ pStringLenght,
+ out pStringLenght, // real string lenght
+ out methodProps.Flags,
+ new IntPtr(&pSigBlob),
+ out sigBlobSize,
+ out methodProps.CodeRVA,
+ out methodProps.ImplFlags);
+
+ // Allocate string buffer
+ pString = Marshal.AllocHGlobal((int)pStringLenght * 2);
+
+ metaData.GetMethodProps(methodProps.Token,
+ out methodProps.ClassToken,
+ pString,
+ pStringLenght,
+ out pStringLenght, // real string lenght
+ out methodProps.Flags,
+ new IntPtr(&pSigBlob),
+ out sigBlobSize,
+ out methodProps.CodeRVA,
+ out methodProps.ImplFlags);
+
+ methodProps.Name = Marshal.PtrToStringUni(pString);
+ Marshal.FreeHGlobal(pString);
+
+ methodProps.Signature = new SignatureStream(pSigBlob, sigBlobSize);
+
+ Marshal.FreeCoTaskMem(pSigBlob);
+
+ return methodProps;
+ }
+
+ public ParamProps GetParamForMethodIndex(uint methodToken, uint parameterSequence)
+ {
+ uint paramToken = 0;
+ metaData.GetParamForMethodIndex(methodToken, parameterSequence, ref paramToken);
+ return GetParamProps(paramToken);
+ }
+
+ public ParamProps GetParamProps(uint paramToken)
+ {
+ ParamProps paramProps;
+
+ paramProps.Token = paramToken;
+
+ uint unused;
+ uint pStringLenght = 0; // Terminating character included in pStringLenght
+ IntPtr pString = IntPtr.Zero;
+ metaData.GetParamProps(paramProps.Token,
+ out paramProps.MethodToken,
+ out paramProps.ParameterSequence,
+ pString,
+ pStringLenght,
+ out pStringLenght, // real string lenght
+ out paramProps.Flags,
+ out unused,
+ IntPtr.Zero,
+ out unused);
+
+ // Allocate string buffer
+ pString = Marshal.AllocHGlobal((int)pStringLenght * 2);
+
+ metaData.GetParamProps(paramProps.Token,
+ out paramProps.MethodToken,
+ out paramProps.ParameterSequence,
+ pString,
+ pStringLenght,
+ out pStringLenght, // real string lenght
+ out paramProps.Flags,
+ out unused,
+ IntPtr.Zero,
+ out unused);
+
+ paramProps.Name = Marshal.PtrToStringUni(pString);
+ Marshal.FreeHGlobal(pString);
+
+ return paramProps;
+ }
+
+ public TypeDefProps FindTypeDefByName(string typeName, uint enclosingClassToken)
+ {
+ uint typeDefToken;
+ metaData.FindTypeDefByName(typeName, enclosingClassToken, out typeDefToken);
+ return GetTypeDefProps(typeDefToken);
}
}
}
diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/MetaData/MethodProps.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/MetaData/MethodProps.cs
new file mode 100644
index 0000000000..66fc441e8e
--- /dev/null
+++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/MetaData/MethodProps.cs
@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace DebuggerLibrary
+{
+ struct MethodProps
+ {
+ public uint Token;
+ public string Name;
+ public uint ClassToken;
+ public uint Flags;
+ public uint ImplFlags;
+ public uint CodeRVA;
+ public SignatureStream Signature;
+
+ public bool IsStatic {
+ get {
+ return (Flags & (uint)CorMethodAttr.mdStatic) != 0;
+ }
+ }
+
+ public bool HasSpecialName {
+ get {
+ return (Flags & (uint)CorMethodAttr.mdSpecialName) != 0;
+ }
+ }
+ }
+}
diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/MetaData/ParamProps.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/MetaData/ParamProps.cs
new file mode 100644
index 0000000000..d142402691
--- /dev/null
+++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/MetaData/ParamProps.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace DebuggerLibrary
+{
+ struct ParamProps
+ {
+ public uint Token;
+ public string Name;
+ public uint MethodToken;
+ public uint ParameterSequence;
+ public uint Flags;
+ }
+}