Browse Source

Extended MetaData wrapper

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@195 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
David Srbecký 20 years ago
parent
commit
1f9d7411a4
  1. 2
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj
  2. 134
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/MetaData/MetaData.cs
  3. 29
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/MetaData/MethodProps.cs
  4. 15
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/MetaData/ParamProps.cs

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

@ -54,6 +54,8 @@ @@ -54,6 +54,8 @@
<Compile Include="Src\Debugger\Internal\NativeMethods.cs" />
<Compile Include="Src\Debugger\MetaData\FieldProps.cs" />
<Compile Include="Src\Debugger\MetaData\MetaData.cs" />
<Compile Include="Src\Debugger\MetaData\MethodProps.cs" />
<Compile Include="Src\Debugger\MetaData\ParamProps.cs" />
<Compile Include="Src\Debugger\MetaData\TypeDefProps.cs" />
<Compile Include="Src\Debugger\MetaData\TypeRefProps.cs" />
<Compile Include="Src\Debugger\NDebugger.cs" />

134
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/MetaData/MetaData.cs

@ -79,6 +79,25 @@ namespace DebuggerLibrary @@ -79,6 +79,25 @@ namespace DebuggerLibrary
return typeRefProps;
}
public IList<FieldProps> EnumFields(uint typeToken)
{
List<FieldProps> fields = new List<FieldProps>();
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 @@ -122,23 +141,122 @@ namespace DebuggerLibrary
return fieldProps;
}
public IList<FieldProps> EnumFields(uint classToken)
public IList<MethodProps> EnumMethods(uint typeToken)
{
List<FieldProps> fields = new List<FieldProps>();
IList<MethodProps> methods = new List<MethodProps>();
IntPtr enumerator = IntPtr.Zero;
while(true) {
uint fieldToken;
uint fieldCount;
metaData.EnumFields(ref enumerator, classToken, out fieldToken, 1, out fieldCount);
if (fieldCount == 0) {
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);
}
}
}

29
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/MetaData/MethodProps.cs

@ -0,0 +1,29 @@ @@ -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;
}
}
}
}

15
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/MetaData/ParamProps.cs

@ -0,0 +1,15 @@ @@ -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;
}
}
Loading…
Cancel
Save