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;
+ }
+ }
}
}