From 9695680666a789ea02781d7c283ecec3c00bf2ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Srbeck=C3=BD?= Date: Wed, 2 Jan 2008 13:14:36 +0000 Subject: [PATCH] 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 --- .../Project/Debugger.Core.csproj | 1 + .../Src/Interop/MetaData/IMetaDataImport.cs | 19 +++++++++++++ .../Project/Src/Threads/Function.cs | 9 +++++++ .../Project/Src/Variables/Types/DebugType.cs | 27 +++++++++++++++++++ .../Src/Wrappers/CorDebug/ICorDebugClass2.cs | 23 ++++++++++++++++ .../Wrappers/CorDebug/ICorDebugTypeEnum.cs | 5 ++++ .../Project/Src/Wrappers/MetaData/MetaData.cs | 22 +++++++++++++++ 7 files changed, 106 insertions(+) create mode 100644 src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugClass2.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 04a9aaecc8..f715b76f20 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj @@ -326,6 +326,7 @@ + diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Interop/MetaData/IMetaDataImport.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Interop/MetaData/IMetaDataImport.cs index 00920db135..ae9b7836f5 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Interop/MetaData/IMetaDataImport.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Interop/MetaData/IMetaDataImport.cs @@ -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(); } } diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs index ca6ba8ff35..e1a8b51689 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs @@ -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 methodProps = module.MetaData.GetMethodProps(corFunction.Token); + List corTypes = corILFrame.CastTo().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(); diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Types/DebugType.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Types/DebugType.cs index aeeae95e63..dc61bcfa74 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Types/DebugType.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Types/DebugType.cs @@ -242,6 +242,33 @@ namespace Debugger this.fullName = GetFullName(); } + static internal DebugType Create(Process process, ICorDebugClass corClass, List 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().GetParameterizedType( + isValueType ? (uint)CorElementType.VALUETYPE : (uint)CorElementType.CLASS, + typeArguments.GetRange(0, getArgsCount).ToArray() + ); + + return Create(process, corType); + } + /// Obtains instance of DebugType. Same types will return identical instance. static internal DebugType Create(Process process, ICorDebugType corType) { diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugClass2.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugClass2.cs new file mode 100644 index 0000000000..2e0841f12d --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugClass2.cs @@ -0,0 +1,23 @@ +// +// +// +// +// $Revision: 2077 $ +// + +#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 diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugTypeEnum.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugTypeEnum.cs index e327e1f4e6..34f7804397 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugTypeEnum.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugTypeEnum.cs @@ -39,6 +39,11 @@ namespace Debugger.Wrappers.CorDebug return corTypes[0]; } } + + public List ToList() + { + return new List(this.Enumerator); + } } } diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/MetaData/MetaData.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/MetaData/MetaData.cs index 49a5f90196..97c82eda2c 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/MetaData/MetaData.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/MetaData/MetaData.cs @@ -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 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; + } + } } }