Browse Source

Create generic ICorDebugType from ICorDebugClass and type arguments.

We can not get DebugType for a Function

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2781 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
David Srbecký 18 years ago
parent
commit
9695680666
  1. 1
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj
  2. 19
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Interop/MetaData/IMetaDataImport.cs
  3. 9
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs
  4. 27
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Types/DebugType.cs
  5. 23
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugClass2.cs
  6. 5
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugTypeEnum.cs
  7. 22
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/MetaData/MetaData.cs

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

@ -326,6 +326,7 @@ @@ -326,6 +326,7 @@
<Compile Include="Src\Wrappers\CorDebug\ICorDebugArrayValue.cs" />
<Compile Include="Src\Wrappers\CorDebug\ICorDebugChain.cs" />
<Compile Include="Src\Wrappers\CorDebug\ICorDebugChainEnum.cs" />
<Compile Include="Src\Wrappers\CorDebug\ICorDebugClass2.cs" />
<Compile Include="Src\Wrappers\CorDebug\ICorDebugFrame.cs" />
<Compile Include="Src\Wrappers\CorDebug\ICorDebugFrameEnum.cs" />
<Compile Include="Src\Wrappers\CorDebug\ICorDebugGenericValue.cs" />

19
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Interop/MetaData/IMetaDataImport.cs

@ -140,6 +140,25 @@ namespace Debugger.Interop.MetaData @@ -140,6 +140,25 @@ namespace Debugger.Interop.MetaData
void GetNativeCallConvFromSig([In] IntPtr pvSig, [In] uint cbSig, out uint pCallConv);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void IsGlobal([In] uint pd, out int pbGlobal);
// IMetaDataImport2
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void EnumGenericParams([In, Out] ref IntPtr hEnum, uint tk, out uint rGenericParams, uint cMax, out uint pcGenericParams);
void GetGenericParamProps();
void GetMethodSpecProps();
void EnumGenericParamConstraints();
void GetGenericParamConstraintProps();
void GetPEKind();
void GetVersionString();
void EnumMethodSpecs();
}
}

9
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs

@ -119,6 +119,12 @@ namespace Debugger @@ -119,6 +119,12 @@ namespace Debugger
}
}
DebugType type;
public DebugType Type {
get { return type; }
}
internal Function(Thread thread, FrameID frameID, ICorDebugILFrame corILFrame)
{
this.process = thread.Process;
@ -130,6 +136,9 @@ namespace Debugger @@ -130,6 +136,9 @@ namespace Debugger
methodProps = module.MetaData.GetMethodProps(corFunction.Token);
List<ICorDebugType> corTypes = corILFrame.CastTo<ICorDebugILFrame2>().EnumerateTypeParameters().ToList();
type = DebugType.Create(this.Process, corFunction.Class, corTypes);
// Force some callback when function steps out so that we can expire it
stepOutStepper = new Stepper(this, "Function Tracker");
stepOutStepper.StepOut();

27
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Types/DebugType.cs

@ -242,6 +242,33 @@ namespace Debugger @@ -242,6 +242,33 @@ namespace Debugger
this.fullName = GetFullName();
}
static internal DebugType Create(Process process, ICorDebugClass corClass, List<ICorDebugType> typeArguments)
{
MetaData metaData = process.GetModule(corClass.Module).MetaData;
bool isValueType = false;
uint superClassToken = metaData.GetTypeDefProps(corClass.Token).SuperClassToken;
if ((superClassToken & 0xFF000000) == 0x02000000) { // TypeDef
if (metaData.GetTypeDefProps(superClassToken).Name == "System.ValueType") {
isValueType = true;
}
}
if ((superClassToken & 0xFF000000) == 0x01000000) { // TypeRef
if (metaData.GetTypeRefProps(superClassToken).Name == "System.ValueType") {
isValueType = true;
}
}
int getArgsCount = metaData.GetGenericParamCount(corClass.Token);
ICorDebugType corType = corClass.CastTo<ICorDebugClass2>().GetParameterizedType(
isValueType ? (uint)CorElementType.VALUETYPE : (uint)CorElementType.CLASS,
typeArguments.GetRange(0, getArgsCount).ToArray()
);
return Create(process, corType);
}
/// <summary> Obtains instance of DebugType. Same types will return identical instance. </summary>
static internal DebugType Create(Process process, ICorDebugType corType)
{

23
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugClass2.cs

@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="David Srbecký" email="dsrbecky@gmail.com"/>
// <version>$Revision: 2077 $</version>
// </file>
#pragma warning disable 1591
namespace Debugger.Wrappers.CorDebug
{
using System;
public partial class ICorDebugClass2
{
public ICorDebugType GetParameterizedType(uint elementType, ICorDebugType[] ppTypeArgs)
{
return this.GetParameterizedType(elementType, (uint)ppTypeArgs.Length, ppTypeArgs);
}
}
}
#pragma warning restore 1591

5
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugTypeEnum.cs

@ -39,6 +39,11 @@ namespace Debugger.Wrappers.CorDebug @@ -39,6 +39,11 @@ namespace Debugger.Wrappers.CorDebug
return corTypes[0];
}
}
public List<ICorDebugType> ToList()
{
return new List<ICorDebugType>(this.Enumerator);
}
}
}

22
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/MetaData/MetaData.cs

@ -230,6 +230,28 @@ namespace Debugger.Wrappers.MetaData @@ -230,6 +230,28 @@ namespace Debugger.Wrappers.MetaData
metaData.FindTypeDefByName(typeName, enclosingClassToken, out typeDefToken);
return GetTypeDefProps(typeDefToken);
}
public int GetGenericParamCount(uint typeDef_methodDef)
{
int count = 0;
foreach(uint genericParam in EnumGenericParams(typeDef_methodDef)) count++;
return count;
}
public IEnumerable<uint> EnumGenericParams(uint typeDef_methodDef)
{
IntPtr enumerator = IntPtr.Zero;
while(true) {
uint token;
uint fetched;
metaData.EnumGenericParams(ref enumerator, typeDef_methodDef, out token, 1, out fetched);
if (fetched == 0) {
metaData.CloseEnum(enumerator);
break;
}
yield return token;
}
}
}
}

Loading…
Cancel
Save