From 1f9d7411a4a06f2315e25711767c37cceba46551 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Srbeck=C3=BD?= Date: Sun, 17 Jul 2005 13:56:27 +0000 Subject: [PATCH] Extended MetaData wrapper git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@195 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Debugger.Core.csproj | 2 + .../Project/Src/Debugger/MetaData/MetaData.cs | 136 ++++++++++++++++-- .../Src/Debugger/MetaData/MethodProps.cs | 29 ++++ .../Src/Debugger/MetaData/ParamProps.cs | 15 ++ 4 files changed, 173 insertions(+), 9 deletions(-) create mode 100644 src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/MetaData/MethodProps.cs create mode 100644 src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/MetaData/ParamProps.cs 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; + } +}