Browse Source

Improving performance of metadata enumerators

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3217 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
David Srbecký 17 years ago
parent
commit
07eb82d08e
  1. 6
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Options/DebuggingOptions.cs
  2. 28
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Module.cs
  3. 6
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/NDebugger.cs
  4. 3
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Process-StateControl.cs
  5. 9
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Internal/ManagedCallback.cs
  6. 116
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Interop/MetaData/IMetaDataImport.cs
  7. 2
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType.cs
  8. 136
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/MetaData/MetaDataImport.cs
  9. 19
      src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestPrograms/Metadata.cs

6
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Options/DebuggingOptions.cs

@ -70,6 +70,11 @@ namespace ICSharpCode.SharpDevelop.Services @@ -70,6 +70,11 @@ namespace ICSharpCode.SharpDevelop.Services
set { DebuggingProperties.Set("SkipOnlySingleLineProperties", value); }
}
public static bool Verbose {
get { return DebuggingProperties.Get("Verbose", false); }
set { DebuggingProperties.Set("Verbose", value); }
}
public static void ApplyToCurrentDebugger()
{
WindowsDebugger winDbg = DebuggerService.CurrentDebugger as WindowsDebugger;
@ -81,6 +86,7 @@ namespace ICSharpCode.SharpDevelop.Services @@ -81,6 +86,7 @@ namespace ICSharpCode.SharpDevelop.Services
debugger.SymbolsSearchPaths = SymbolsSearchPaths;
debugger.SkipProperties = SkipProperties;
debugger.SkipOnlySingleLineProperties = SkipOnlySingleLineProperties;
debugger.Verbose = Verbose;
}
}
}

28
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Module.cs

@ -195,7 +195,7 @@ namespace Debugger @@ -195,7 +195,7 @@ namespace Debugger
/// </summary>
public void SetJustMyCodeStatus()
{
DateTime start = Util.HighPrecisionTimer.Now;
DateTime start, end;
uint unused = 0;
if (!this.Debugger.JustMyCodeEnabled) {
@ -208,9 +208,14 @@ namespace Debugger @@ -208,9 +208,14 @@ namespace Debugger
return;
}
this.Process.TraceMessage("JMC for " + this.Filename);
start = Util.HighPrecisionTimer.Now;
// By default the code is my code
corModule.CastTo<ICorDebugModule2>().SetJMCStatus(1, 0, ref unused);
end = Util.HighPrecisionTimer.Now;
this.Process.TraceMessage(" * Defualt ({0} ms)", (end - start).TotalMilliseconds);
start = Util.HighPrecisionTimer.Now;
// Apply non-user code attributes
if (this.Debugger.ObeyDebuggerAttributes) {
foreach(CustomAttributeProps ca in metaData.EnumCustomAttributeProps(0, 0)) {
@ -233,16 +238,24 @@ namespace Debugger @@ -233,16 +238,24 @@ namespace Debugger
}
}
}
end = Util.HighPrecisionTimer.Now;
this.Process.TraceMessage(" * Attributes ({0} ms)", (end - start).TotalMilliseconds);
start = Util.HighPrecisionTimer.Now;
// Mark all methods without symbols as non-user code
foreach(uint typeDef in metaData.EnumTypeDefs()) {
foreach(uint methodDef in metaData.EnumMethods(typeDef)) {
if (!HasMethodSymbols(methodDef)) {
DisableJustMyCode(methodDef);
if (this.Debugger.ObeyDebuggerAttributes) { // TODO: Remove
foreach(uint typeDef in metaData.EnumTypeDefs()) {
foreach(uint methodDef in metaData.EnumMethods(typeDef)) {
if (!HasMethodSymbols(methodDef)) {
DisableJustMyCode(methodDef);
}
}
}
}
end = Util.HighPrecisionTimer.Now;
this.Process.TraceMessage(" * All functions ({0} ms)", (end - start).TotalMilliseconds);
start = Util.HighPrecisionTimer.Now;
// Skip properties
if (this.Debugger.SkipProperties) {
foreach(uint typeDef in metaData.EnumTypeDefs()) {
@ -260,9 +273,10 @@ namespace Debugger @@ -260,9 +273,10 @@ namespace Debugger
}
}
}
end = Util.HighPrecisionTimer.Now;
this.Process.TraceMessage(" * Properties ({0} ms)", (end - start).TotalMilliseconds);
DateTime end = Util.HighPrecisionTimer.Now;
this.Process.TraceMessage("Set Just-My-Code for module \"{0}\" ({1} ms)", this.Filename, (end - start).TotalMilliseconds);
// this.Process.TraceMessage("Set Just-My-Code for module \"{0}\" ({1} ms)", this.Filename, (end - start).TotalMilliseconds);
}
bool HasMethodSymbols(uint methodDef)

6
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/NDebugger.cs

@ -52,11 +52,9 @@ namespace Debugger @@ -52,11 +52,9 @@ namespace Debugger
mta2sta.CallMethod = CallMethod.DirectCall;
}
Wrappers.ResourceManager.TraceMessagesEnabled = true;
Wrappers.ResourceManager.TraceMessagesEnabled = false;
Wrappers.ResourceManager.TraceMessage += delegate (object s, MessageEventArgs e) {
if (this.Verbose) {
TraceMessage(e.Message);
}
TraceMessage(e.Message);
};
}

3
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Process-StateControl.cs

@ -209,6 +209,9 @@ namespace Debugger @@ -209,6 +209,9 @@ namespace Debugger
NotifyResumed(action);
corProcess.Continue(0);
if (this.Debugger.Verbose) {
this.TraceMessage("Continue");
}
if (action == DebuggeeStateAction.Clear) {
OnResumed();

9
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Internal/ManagedCallback.cs

@ -92,6 +92,9 @@ namespace Debugger @@ -92,6 +92,9 @@ namespace Debugger
if (!pauseOnNextExit || process.Evaluating || hasQueuedCallbacks) {
process.AsyncContinue(DebuggeeStateAction.Keep);
} else {
if (process.Debugger.Verbose) {
process.TraceMessage("Callback exit: Paused");
}
pauseOnNextExit = false;
Pause();
}
@ -190,7 +193,7 @@ namespace Debugger @@ -190,7 +193,7 @@ namespace Debugger
ExitCallback();
}
public unsafe void Exception(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, int unhandled)
public void Exception(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, int unhandled)
{
// Exception2 is used in .NET Framework 2.0
@ -310,9 +313,9 @@ namespace Debugger @@ -310,9 +313,9 @@ namespace Debugger
ExitCallback();
}
public unsafe void LoadModule(ICorDebugAppDomain pAppDomain, ICorDebugModule pModule)
public void LoadModule(ICorDebugAppDomain pAppDomain, ICorDebugModule pModule)
{
EnterCallback(PausedReason.Other, "LoadModule", pAppDomain);
EnterCallback(PausedReason.Other, "LoadModule " + pModule.Name, pAppDomain);
process.AddModule(pModule);

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

@ -19,132 +19,132 @@ namespace Debugger.Interop.MetaData @@ -19,132 +19,132 @@ namespace Debugger.Interop.MetaData
[PreserveSig, MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void CloseEnum(IntPtr hEnum);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void CountEnum(IntPtr hEnum, ref uint pulCount);
void CountEnum(IntPtr hEnum, out uint pulCount);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void ResetEnum(IntPtr hEnum, uint ulPos);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void EnumTypeDefs([In, Out] ref IntPtr phEnum, out uint rTypeDefs, uint cMax, out uint pcTypeDefs);
void EnumTypeDefs(ref IntPtr phEnum, [Out, MarshalAsAttribute(UnmanagedType.LPArray)] uint[] rTypeDefs, uint cMax, out uint pcTypeDefs);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void EnumInterfaceImpls([In, Out] ref IntPtr phEnum, uint td, out uint rImpls, uint cMax, out uint pcImpls);
void EnumInterfaceImpls(ref IntPtr phEnum, uint td, [Out, MarshalAsAttribute(UnmanagedType.LPArray)] uint[] rImpls, uint cMax, out uint pcImpls);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void EnumTypeRefs([In, Out] ref IntPtr phEnum, out uint rTypeRefs, uint cMax, out uint pcTypeRefs);
void EnumTypeRefs(ref IntPtr phEnum, [Out, MarshalAsAttribute(UnmanagedType.LPArray)] uint[] rTypeRefs, uint cMax, out uint pcTypeRefs);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void FindTypeDefByName([In, MarshalAs(UnmanagedType.LPWStr)] string szTypeDef, [In] uint tkEnclosingClass, out uint ptd);
void FindTypeDefByName([In, MarshalAs(UnmanagedType.LPWStr)] string szTypeDef, uint tkEnclosingClass, out uint ptd);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetScopeProps([Out] IntPtr szName, [In] uint cchName, out uint pchName, out Guid pmvid);
void GetScopeProps([Out] IntPtr szName, uint cchName, out uint pchName, out Guid pmvid);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetModuleFromScope(out uint pmd);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetTypeDefProps([In] uint td, [Out] IntPtr szTypeDef, [In] uint cchTypeDef, out uint pchTypeDef, out uint pdwTypeDefFlags, out uint ptkExtends);
void GetTypeDefProps(uint td, [Out] IntPtr szTypeDef, uint cchTypeDef, out uint pchTypeDef, out uint pdwTypeDefFlags, out uint ptkExtends);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetInterfaceImplProps([In] uint iiImpl, out uint pClass, out uint ptkIface);
void GetInterfaceImplProps(uint iiImpl, out uint pClass, out uint ptkIface);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetTypeRefProps([In] uint tr, out uint ptkResolutionScope, [Out] IntPtr szName, [In] uint cchName, out uint pchName);
void GetTypeRefProps(uint tr, out uint ptkResolutionScope, [Out] IntPtr szName, uint cchName, out uint pchName);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void ResolveTypeRef(uint tr, ref Guid riid, [MarshalAs(UnmanagedType.IUnknown)] ref object ppIScope, ref uint ptd);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void EnumMembers([In, Out] ref IntPtr phEnum, [In] uint cl, out uint rMembers, [In] uint cMax, out uint pcTokens);
void EnumMembers(ref IntPtr phEnum, uint cl, [Out, MarshalAsAttribute(UnmanagedType.LPArray)] uint[] rMembers, uint cMax, out uint pcTokens);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void EnumMembersWithName([In, Out] ref IntPtr phEnum, [In] uint cl, [In, MarshalAs(UnmanagedType.LPWStr)] string szName, out uint rMembers, [In] uint cMax, out uint pcTokens);
void EnumMembersWithName(ref IntPtr phEnum, uint cl, [In, MarshalAs(UnmanagedType.LPWStr)] string szName, [Out, MarshalAsAttribute(UnmanagedType.LPArray)] uint[] rMembers, uint cMax, out uint pcTokens);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void EnumMethods([In, Out] ref IntPtr phEnum, [In] uint cl, out uint rMethods, [In] uint cMax, out uint pcTokens);
void EnumMethods(ref IntPtr phEnum, uint cl, [Out, MarshalAsAttribute(UnmanagedType.LPArray)] uint[] rMethods, uint cMax, out uint pcTokens);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void EnumMethodsWithName([In, Out] ref IntPtr phEnum, [In] uint cl, [In, MarshalAs(UnmanagedType.LPWStr)] string szName, out uint rMethods, [In] uint cMax, out uint pcTokens);
void EnumMethodsWithName(ref IntPtr phEnum, uint cl, [In, MarshalAs(UnmanagedType.LPWStr)] string szName, [Out, MarshalAsAttribute(UnmanagedType.LPArray)] uint[] rMethods, uint cMax, out uint pcTokens);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void EnumFields([In, Out] ref IntPtr phEnum, [In] uint cl, out uint rFields, [In] uint cMax, out uint pcTokens);
void EnumFields(ref IntPtr phEnum, uint cl, [Out, MarshalAsAttribute(UnmanagedType.LPArray)] uint[] rFields, uint cMax, out uint pcTokens);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void EnumFieldsWithName([In, Out] ref IntPtr phEnum, [In] uint cl, [In, MarshalAs(UnmanagedType.LPWStr)] string szName, out uint rFields, [In] uint cMax, out uint pcTokens);
void EnumFieldsWithName(ref IntPtr phEnum, uint cl, [In, MarshalAs(UnmanagedType.LPWStr)] string szName, [Out, MarshalAsAttribute(UnmanagedType.LPArray)] uint[] rFields, uint cMax, out uint pcTokens);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void EnumParams([In, Out] ref IntPtr phEnum, [In] uint mb, out uint rParams, [In] uint cMax, out uint pcTokens);
void EnumParams(ref IntPtr phEnum, uint mb, [Out, MarshalAsAttribute(UnmanagedType.LPArray)] uint[] rParams, uint cMax, out uint pcTokens);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void EnumMemberRefs([In, Out] ref IntPtr phEnum, [In] uint tkParent, out uint rMemberRefs, [In] uint cMax, out uint pcTokens);
void EnumMemberRefs(ref IntPtr phEnum, uint tkParent, [Out, MarshalAsAttribute(UnmanagedType.LPArray)] uint[] rMemberRefs, uint cMax, out uint pcTokens);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void EnumMethodImpls([In, Out] ref IntPtr phEnum, [In] uint td, out uint rMethodBody, out uint rMethodDecl, [In] uint cMax, out uint pcTokens);
void EnumMethodImpls(ref IntPtr phEnum, uint td, [Out, MarshalAsAttribute(UnmanagedType.LPArray)] uint[] rMethodBody, [Out, MarshalAsAttribute(UnmanagedType.LPArray)] uint[] rMethodDecl, uint cMax, out uint pcTokens);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void EnumPermissionSets([In, Out] ref IntPtr phEnum, [In] uint tk, [In] uint dwActions, out uint rPermission, [In] uint cMax, out uint pcTokens);
void EnumPermissionSets(ref IntPtr phEnum, uint tk, uint dwActions, [Out, MarshalAsAttribute(UnmanagedType.LPArray)] uint[] rPermission, uint cMax, out uint pcTokens);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void FindMember([In] uint td, [In, MarshalAs(UnmanagedType.LPWStr)] string szName, [In] IntPtr pvSigBlob, [In] uint cbSigBlob, out uint pmb);
void FindMember(uint td, [In, MarshalAs(UnmanagedType.LPWStr)] string szName, [In] IntPtr pvSigBlob, uint cbSigBlob, out uint pmb);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void FindMethod([In] uint td, [In, MarshalAs(UnmanagedType.LPWStr)] string szName, [In] IntPtr pvSigBlob, [In] uint cbSigBlob, out uint pmb);
void FindMethod(uint td, [In, MarshalAs(UnmanagedType.LPWStr)] string szName, [In] IntPtr pvSigBlob, uint cbSigBlob, out uint pmb);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void FindField([In] uint td, [In, MarshalAs(UnmanagedType.LPWStr)] string szName, [In] IntPtr pvSigBlob, [In] uint cbSigBlob, out uint pmb);
void FindField(uint td, [In, MarshalAs(UnmanagedType.LPWStr)] string szName, [In] IntPtr pvSigBlob, uint cbSigBlob, out uint pmb);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void FindMemberRef([In] uint td, [In, MarshalAs(UnmanagedType.LPWStr)] string szName, [In] IntPtr pvSigBlob, [In] uint cbSigBlob, out uint pmr);
void FindMemberRef(uint td, [In, MarshalAs(UnmanagedType.LPWStr)] string szName, [In] IntPtr pvSigBlob, uint cbSigBlob, out uint pmr);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetMethodProps([In] uint mb, out uint pClass, [Out] IntPtr szMethod, [In] uint cchMethod, out uint pchMethod, out uint pdwAttr, out IntPtr ppvSigBlob, out uint pcbSigBlob, out uint pulCodeRVA, out uint pdwImplFlags);
void GetMethodProps(uint mb, out uint pClass, [Out] IntPtr szMethod, uint cchMethod, out uint pchMethod, out uint pdwAttr, out IntPtr ppvSigBlob, out uint pcbSigBlob, out uint pulCodeRVA, out uint pdwImplFlags);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetMemberRefProps([In] uint mr, out uint ptk, [Out] IntPtr szMember, [In] uint cchMember, out uint pchMember, out IntPtr ppvSigBlob, out uint pbSig);
void GetMemberRefProps(uint mr, out uint ptk, [Out] IntPtr szMember, uint cchMember, out uint pchMember, out IntPtr ppvSigBlob, out uint pbSig);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void EnumProperties([In, Out] ref IntPtr phEnum, [In] uint td, out uint rProperties, [In] uint cMax, out uint pcProperties);
void EnumProperties(ref IntPtr phEnum, uint td, [Out, MarshalAsAttribute(UnmanagedType.LPArray)] uint[] rProperties, uint cMax, out uint pcProperties);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void EnumEvents([In, Out] ref IntPtr phEnum, [In] uint td, out uint rEvents, [In] uint cMax, out uint pcEvents);
void EnumEvents(ref IntPtr phEnum, uint td, [Out, MarshalAsAttribute(UnmanagedType.LPArray)] uint[] rEvents, uint cMax, out uint pcEvents);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetEventProps([In] uint ev, out uint pClass, [Out] IntPtr szEvent, [In] uint cchEvent, out uint pchEvent, out uint pdwEventFlags, out uint ptkEventType, out uint pmdAddOn, out uint pmdRemoveOn, out uint pmdFire, uint[] rmdOtherMethod, [In] uint cMax, out uint pcOtherMethod);
void GetEventProps(uint ev, out uint pClass, [Out] IntPtr szEvent, uint cchEvent, out uint pchEvent, out uint pdwEventFlags, out uint ptkEventType, out uint pmdAddOn, out uint pmdRemoveOn, out uint pmdFire, uint[] rmdOtherMethod, uint cMax, out uint pcOtherMethod);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void EnumMethodSemantics([In, Out] ref IntPtr phEnum, [In] uint mb, out uint rEventProp, [In] uint cMax, out uint pcEventProp);
void EnumMethodSemantics(ref IntPtr phEnum, uint mb, [Out, MarshalAsAttribute(UnmanagedType.LPArray)] uint[] rEventProp, uint cMax, out uint pcEventProp);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetMethodSemantics([In] uint mb, [In] uint tkEventProp, out uint pdwSemanticsFlags);
void GetMethodSemantics(uint mb, uint tkEventProp, out uint pdwSemanticsFlags);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetClassLayout([In] uint td, out uint pdwPackSize, COR_FIELD_OFFSET[] rFieldOffset, [In] uint cMax, out uint pcFieldOffset, out uint pulClassSize);
void GetClassLayout(uint td, out uint pdwPackSize, COR_FIELD_OFFSET[] rFieldOffset, uint cMax, out uint pcFieldOffset, out uint pulClassSize);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetFieldMarshal([In] uint tk, out IntPtr ppvNativeType, out uint pcbNativeType);
void GetFieldMarshal(uint tk, out IntPtr ppvNativeType, out uint pcbNativeType);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetRVA([In] uint tk, out uint pulCodeRVA, out uint pdwImplFlags);
void GetRVA(uint tk, out uint pulCodeRVA, out uint pdwImplFlags);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetPermissionSetProps([In] uint pm, out uint pdwAction, out IntPtr ppvPermission, out uint pcbPermission);
void GetPermissionSetProps(uint pm, out uint pdwAction, out IntPtr ppvPermission, out uint pcbPermission);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetSigFromToken([In] uint mdSig, out IntPtr ppvSig, out uint pcbSig);
void GetSigFromToken(uint mdSig, out IntPtr ppvSig, out uint pcbSig);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetModuleRefProps([In] uint mur, [Out] IntPtr szName, [In] uint cchName, out uint pchName);
void GetModuleRefProps(uint mur, [Out] IntPtr szName, uint cchName, out uint pchName);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void EnumModuleRefs([In, Out] ref IntPtr phEnum, out uint rModuleRefs, [In] uint cMax, out uint pcModuleRefs);
void EnumModuleRefs(ref IntPtr phEnum, [Out, MarshalAsAttribute(UnmanagedType.LPArray)] uint[] rModuleRefs, uint cMax, out uint pcModuleRefs);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetTypeSpecFromToken([In] uint typespec, out IntPtr ppvSig, out uint pcbSig);
void GetTypeSpecFromToken(uint typespec, out IntPtr ppvSig, out uint pcbSig);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetNameFromToken([In] uint tk, [Out] IntPtr pszUtf8NamePtr);
void GetNameFromToken(uint tk, [Out] IntPtr pszUtf8NamePtr);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void EnumUnresolvedMethods([In, Out] ref IntPtr phEnum, out uint rMethods, [In] uint cMax, out uint pcTokens);
void EnumUnresolvedMethods(ref IntPtr phEnum, [Out, MarshalAsAttribute(UnmanagedType.LPArray)] uint[] rMethods, uint cMax, out uint pcTokens);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetUserString([In] uint stk, [Out] IntPtr szString, [In] uint cchString, out uint pchString);
void GetUserString(uint stk, [Out] IntPtr szString, uint cchString, out uint pchString);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetPinvokeMap([In] uint tk, out uint pdwMappingFlags, [Out] IntPtr szImportName, [In] uint cchImportName, out uint pchImportName, out uint pmrImportDLL);
void GetPinvokeMap(uint tk, out uint pdwMappingFlags, [Out] IntPtr szImportName, uint cchImportName, out uint pchImportName, out uint pmrImportDLL);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void EnumSignatures([In, Out] ref IntPtr phEnum, out uint rSignatures, [In] uint cMax, out uint pcSignatures);
void EnumSignatures(ref IntPtr phEnum, [Out, MarshalAsAttribute(UnmanagedType.LPArray)] uint[] rSignatures, uint cMax, out uint pcSignatures);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void EnumTypeSpecs([In, Out] ref IntPtr phEnum, out uint rTypeSpecs, [In] uint cMax, out uint pcTypeSpecs);
void EnumTypeSpecs(ref IntPtr phEnum, [Out, MarshalAsAttribute(UnmanagedType.LPArray)] uint[] rTypeSpecs, uint cMax, out uint pcTypeSpecs);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void EnumUserStrings([In, Out] ref IntPtr phEnum, out uint rStrings, [In] uint cMax, out uint pcStrings);
void EnumUserStrings(ref IntPtr phEnum, [Out, MarshalAsAttribute(UnmanagedType.LPArray)] uint[] rStrings, uint cMax, out uint pcStrings);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetParamForMethodIndex([In] uint md, [In] uint ulParamSeq, [In] ref uint ppd);
void GetParamForMethodIndex(uint md, uint ulParamSeq, [In] ref uint ppd);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void EnumCustomAttributes([In, Out] ref IntPtr phEnum, [In] uint tk, [In] uint tkType, out uint rCustomAttributes, [In] uint cMax, out uint pcCustomAttributes);
void EnumCustomAttributes(ref IntPtr phEnum, uint tk, uint tkType, [Out, MarshalAsAttribute(UnmanagedType.LPArray)] uint[] rCustomAttributes, uint cMax, out uint pcCustomAttributes);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetCustomAttributeProps([In] uint cv, out uint ptkObj, out uint ptkType, out IntPtr ppBlob, out uint pcbSize);
void GetCustomAttributeProps(uint cv, out uint ptkObj, out uint ptkType, out IntPtr ppBlob, out uint pcbSize);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void FindTypeRef([In] uint tkResolutionScope, [In, MarshalAs(UnmanagedType.LPWStr)] string szName, out uint ptr);
void FindTypeRef(uint tkResolutionScope, [In, MarshalAs(UnmanagedType.LPWStr)] string szName, out uint ptr);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetMemberProps([In] uint mb, out uint pClass, IntPtr szMember, [In] uint cchMember, out uint pchMember, out uint pdwAttr, out IntPtr ppvSigBlob, out uint pcbSigBlob, out uint pulCodeRVA, out uint pdwImplFlags, out uint pdwCPlusTypeFlag, out IntPtr ppValue, out uint pcchValue);
void GetMemberProps(uint mb, out uint pClass, IntPtr szMember, uint cchMember, out uint pchMember, out uint pdwAttr, out IntPtr ppvSigBlob, out uint pcbSigBlob, out uint pulCodeRVA, out uint pdwImplFlags, out uint pdwCPlusTypeFlag, out IntPtr ppValue, out uint pcchValue);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetFieldProps([In] uint mb, out uint pClass, [In] IntPtr szField, [In] uint cchField, out uint pchField, out uint pdwAttr, out IntPtr ppvSigBlob, out uint pcbSigBlob, out uint pdwCPlusTypeFlag, out IntPtr ppValue, out uint pcchValue);
void GetFieldProps(uint mb, out uint pClass, [In] IntPtr szField, uint cchField, out uint pchField, out uint pdwAttr, out IntPtr ppvSigBlob, out uint pcbSigBlob, out uint pdwCPlusTypeFlag, out IntPtr ppValue, out uint pcchValue);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetPropertyProps([In] uint prop, out uint pClass, [Out] IntPtr szProperty, [In] uint cchProperty, out uint pchProperty, out uint pdwPropFlags, out IntPtr ppvSig, out uint pbSig, out uint pdwCPlusTypeFlag, out IntPtr ppDefaultValue, out uint pcchDefaultValue, out uint pmdSetter, out uint pmdGetter, uint[] rmdOtherMethod, [In] uint cMax, out uint pcOtherMethod);
void GetPropertyProps(uint prop, out uint pClass, [Out] IntPtr szProperty, uint cchProperty, out uint pchProperty, out uint pdwPropFlags, out IntPtr ppvSig, out uint pbSig, out uint pdwCPlusTypeFlag, out IntPtr ppDefaultValue, out uint pcchDefaultValue, out uint pmdSetter, out uint pmdGetter, uint[] rmdOtherMethod, uint cMax, out uint pcOtherMethod);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetParamProps([In] uint tk, out uint pmd, out uint pulSequence, [Out] IntPtr szName, [In] uint cchName, out uint pchName, out uint pdwAttr, out uint pdwCPlusTypeFlag, out IntPtr ppValue, out uint pcchValue);
void GetParamProps(uint tk, out uint pmd, out uint pulSequence, [Out] IntPtr szName, uint cchName, out uint pchName, out uint pdwAttr, out uint pdwCPlusTypeFlag, out IntPtr ppValue, out uint pcchValue);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetCustomAttributeByName([In] uint tkObj, [In, MarshalAs(UnmanagedType.LPWStr)] string szName, out IntPtr ppData, out uint pcbData);
void GetCustomAttributeByName(uint tkObj, [In, MarshalAs(UnmanagedType.LPWStr)] string szName, out IntPtr ppData, out uint pcbData);
[PreserveSig, MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
int IsValidToken(uint tk);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetNestedClassProps([In] uint tdNestedClass, out uint ptdEnclosingClass);
void GetNestedClassProps(uint tdNestedClass, out uint ptdEnclosingClass);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetNativeCallConvFromSig([In] IntPtr pvSig, [In] uint cbSig, out uint pCallConv);
void GetNativeCallConvFromSig([In] IntPtr pvSig, uint cbSig, out uint pCallConv);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void IsGlobal([In] uint pd, out int pbGlobal);
void IsGlobal(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 EnumGenericParams(ref IntPtr hEnum, uint tk, [Out, MarshalAsAttribute(UnmanagedType.LPArray)] uint[] rGenericParams, uint cMax, out uint pcGenericParams);
void GetGenericParamProps();

2
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Metadata/DebugType.cs

@ -431,8 +431,8 @@ namespace Debugger.MetaData @@ -431,8 +431,8 @@ namespace Debugger.MetaData
TimeSpan totalTime2 = Util.HighPrecisionTimer.Now - startTime;
string prefix = type.IsInterface ? "interface" : "type";
process.TraceMessage("Loaded {0} {1} ({2} ms)", prefix, type.FullName, totalTime2.TotalMilliseconds);
if (process.Debugger.Verbose) {
process.TraceMessage("Loaded {0} {1} ({2} ms)", prefix, type.FullName, totalTime2.TotalMilliseconds);
foreach(DebugType inter in type.Interfaces) {
process.TraceMessage(" - Implements {0}", inter.FullName);
}

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

@ -58,7 +58,7 @@ namespace Debugger.Wrappers.MetaData @@ -58,7 +58,7 @@ namespace Debugger.Wrappers.MetaData
// CloseEnum, CountEnum and ResetEnum are not wrapped
public IEnumerable<uint> EnumCustomAttributes(uint token_Scope, uint token_TypeOfAttributes)
public uint[] EnumCustomAttributes(uint token_Scope, uint token_TypeOfAttributes)
{
return EnumerateTokens(metaData.EnumCustomAttributes, token_Scope, token_TypeOfAttributes);
}
@ -70,7 +70,7 @@ namespace Debugger.Wrappers.MetaData @@ -70,7 +70,7 @@ namespace Debugger.Wrappers.MetaData
}
}
public IEnumerable<uint> EnumEvents(uint typeDef)
public uint[] EnumEvents(uint typeDef)
{
return EnumerateTokens(metaData.EnumEvents, typeDef);
}
@ -82,7 +82,7 @@ namespace Debugger.Wrappers.MetaData @@ -82,7 +82,7 @@ namespace Debugger.Wrappers.MetaData
}
}
public IEnumerable<uint> EnumFields(uint typeDef)
public uint[] EnumFields(uint typeDef)
{
return EnumerateTokens(metaData.EnumFields, typeDef);
}
@ -94,7 +94,7 @@ namespace Debugger.Wrappers.MetaData @@ -94,7 +94,7 @@ namespace Debugger.Wrappers.MetaData
}
}
public IEnumerable<uint> EnumFieldsWithName(uint typeDef, string name)
public uint[] EnumFieldsWithName(uint typeDef, string name)
{
return EnumerateTokens(metaData.EnumFieldsWithName, typeDef, name);
}
@ -106,13 +106,13 @@ namespace Debugger.Wrappers.MetaData @@ -106,13 +106,13 @@ namespace Debugger.Wrappers.MetaData
}
}
public IEnumerable<uint> EnumGenericParams(uint typeDef_methodDef)
public uint[] EnumGenericParams(uint typeDef_methodDef)
{
return EnumerateTokens(metaData.EnumGenericParams, typeDef_methodDef);
}
/// <returns>MethodDef tokens</returns>
public IEnumerable<uint> EnumInterfaceImpls(uint typeDef)
public uint[] EnumInterfaceImpls(uint typeDef)
{
return EnumerateTokens(metaData.EnumInterfaceImpls, typeDef);
}
@ -124,7 +124,7 @@ namespace Debugger.Wrappers.MetaData @@ -124,7 +124,7 @@ namespace Debugger.Wrappers.MetaData
}
}
public IEnumerable<uint> EnumMemberRefs(uint typeDef_typeRef_methodDef_moduleRef)
public uint[] EnumMemberRefs(uint typeDef_typeRef_methodDef_moduleRef)
{
return EnumerateTokens(metaData.EnumMemberRefs, typeDef_typeRef_methodDef_moduleRef);
}
@ -136,7 +136,7 @@ namespace Debugger.Wrappers.MetaData @@ -136,7 +136,7 @@ namespace Debugger.Wrappers.MetaData
}
}
public IEnumerable<uint> EnumMembers(uint typeDef)
public uint[] EnumMembers(uint typeDef)
{
return EnumerateTokens(metaData.EnumMembers, typeDef);
}
@ -148,7 +148,7 @@ namespace Debugger.Wrappers.MetaData @@ -148,7 +148,7 @@ namespace Debugger.Wrappers.MetaData
}
}
public IEnumerable<uint> EnumMembersWithName(uint typeDef, string name)
public uint[] EnumMembersWithName(uint typeDef, string name)
{
return EnumerateTokens(metaData.EnumMembersWithName, typeDef, name);
}
@ -166,17 +166,21 @@ namespace Debugger.Wrappers.MetaData @@ -166,17 +166,21 @@ namespace Debugger.Wrappers.MetaData
IntPtr enumerator = IntPtr.Zero;
while(true) {
MethodImpl ret = new MethodImpl();
uint[] body = new uint[1];
uint[] decl = new uint[1];
uint fetched;
metaData.EnumMethodImpls(ref enumerator, typeDef, out ret.MethodBody, out ret.MethodDecl, 1, out fetched);
metaData.EnumMethodImpls(ref enumerator, typeDef, body, decl, 1, out fetched);
if (fetched == 0) {
metaData.CloseEnum(enumerator);
break;
}
ret.MethodBody = body[0];
ret.MethodDecl = decl[0];
yield return ret;
}
}
public IEnumerable<uint> EnumMethods(uint typeDef)
public uint[] EnumMethods(uint typeDef)
{
return EnumerateTokens(metaData.EnumMethods, typeDef);
}
@ -189,12 +193,12 @@ namespace Debugger.Wrappers.MetaData @@ -189,12 +193,12 @@ namespace Debugger.Wrappers.MetaData
}
/// <returns>Events or properties</returns>
public IEnumerable<uint> EnumMethodSemantics(uint methodDef)
public uint[] EnumMethodSemantics(uint methodDef)
{
return EnumerateTokens(metaData.EnumMethodSemantics, methodDef);
}
public IEnumerable<uint> EnumMethodsWithName(uint typeDef, string name)
public uint[] EnumMethodsWithName(uint typeDef, string name)
{
return EnumerateTokens(metaData.EnumMethodsWithName, typeDef, name);
}
@ -206,7 +210,7 @@ namespace Debugger.Wrappers.MetaData @@ -206,7 +210,7 @@ namespace Debugger.Wrappers.MetaData
}
}
public IEnumerable<uint> EnumModuleRefs()
public uint[] EnumModuleRefs()
{
return EnumerateTokens(metaData.EnumModuleRefs);
}
@ -218,7 +222,7 @@ namespace Debugger.Wrappers.MetaData @@ -218,7 +222,7 @@ namespace Debugger.Wrappers.MetaData
}
}
public IEnumerable<uint> EnumParams(uint methodDef)
public uint[] EnumParams(uint methodDef)
{
return EnumerateTokens(metaData.EnumParams, methodDef);
}
@ -230,7 +234,7 @@ namespace Debugger.Wrappers.MetaData @@ -230,7 +234,7 @@ namespace Debugger.Wrappers.MetaData
}
}
public IEnumerable<uint> EnumPermissionSets(uint token_scope_nullable, uint actions)
public uint[] EnumPermissionSets(uint token_scope_nullable, uint actions)
{
return EnumerateTokens(metaData.EnumPermissionSets, token_scope_nullable, actions);
}
@ -242,7 +246,7 @@ namespace Debugger.Wrappers.MetaData @@ -242,7 +246,7 @@ namespace Debugger.Wrappers.MetaData
}
}
public IEnumerable<uint> EnumProperties(uint typeDef)
public uint[] EnumProperties(uint typeDef)
{
return EnumerateTokens(metaData.EnumProperties, typeDef);
}
@ -254,12 +258,12 @@ namespace Debugger.Wrappers.MetaData @@ -254,12 +258,12 @@ namespace Debugger.Wrappers.MetaData
}
}
public IEnumerable<uint> EnumSignatures()
public uint[] EnumSignatures()
{
return EnumerateTokens(metaData.EnumSignatures);
}
public IEnumerable<uint> EnumTypeDefs()
public uint[] EnumTypeDefs()
{
return EnumerateTokens(metaData.EnumTypeDefs);
}
@ -271,7 +275,7 @@ namespace Debugger.Wrappers.MetaData @@ -271,7 +275,7 @@ namespace Debugger.Wrappers.MetaData
}
}
public IEnumerable<uint> EnumTypeRefs()
public uint[] EnumTypeRefs()
{
return EnumerateTokens(metaData.EnumTypeRefs);
}
@ -283,7 +287,7 @@ namespace Debugger.Wrappers.MetaData @@ -283,7 +287,7 @@ namespace Debugger.Wrappers.MetaData
}
}
public IEnumerable<uint> EnumTypeSpecs()
public uint[] EnumTypeSpecs()
{
return EnumerateTokens(metaData.EnumTypeSpecs);
}
@ -295,12 +299,12 @@ namespace Debugger.Wrappers.MetaData @@ -295,12 +299,12 @@ namespace Debugger.Wrappers.MetaData
}
}
public IEnumerable<uint> EnumUnresolvedMethods()
public uint[] EnumUnresolvedMethods()
{
return EnumerateTokens(metaData.EnumUnresolvedMethods);
}
public IEnumerable<uint> EnumUserStrings()
public uint[] EnumUserStrings()
{
return EnumerateTokens(metaData.EnumUserStrings);
}
@ -854,55 +858,81 @@ namespace Debugger.Wrappers.MetaData @@ -854,55 +858,81 @@ namespace Debugger.Wrappers.MetaData
#region Util
delegate void TokenEnumerator0(ref IntPtr phEnum, out uint token, uint maxCount, out uint fetched);
const int initialBufferSize = 8;
IEnumerable<uint> EnumerateTokens(TokenEnumerator0 tokenEnumerator)
delegate void TokenEnumerator0(ref IntPtr phEnum, uint[] token, uint maxCount, out uint fetched);
uint[] EnumerateTokens(TokenEnumerator0 tokenEnumerator)
{
IntPtr enumerator = IntPtr.Zero;
while(true) {
uint token;
uint fetched;
tokenEnumerator(ref enumerator, out token, 1, out fetched);
if (fetched == 0) {
metaData.CloseEnum(enumerator);
break;
uint[] buffer = new uint[initialBufferSize];
uint fetched;
tokenEnumerator(ref enumerator, buffer, (uint)buffer.Length, out fetched);
if (fetched < buffer.Length) {
// The tokens did fit the buffer
Array.Resize(ref buffer, (int)fetched);
} else {
// The tokens did not fit the buffer -> Refetch
uint actualCount;
metaData.CountEnum(enumerator, out actualCount);
if (actualCount > buffer.Length) {
buffer = new uint[actualCount];
metaData.ResetEnum(enumerator, 0);
tokenEnumerator(ref enumerator, buffer, (uint)buffer.Length, out fetched);
}
yield return token;
}
metaData.CloseEnum(enumerator);
return buffer;
}
delegate void TokenEnumerator1<T>(ref IntPtr phEnum, T parameter, out uint token, uint maxCount, out uint fetched);
delegate void TokenEnumerator1<T>(ref IntPtr phEnum, T parameter, uint[] token, uint maxCount, out uint fetched);
IEnumerable<uint> EnumerateTokens<T>(TokenEnumerator1<T> tokenEnumerator, T parameter)
uint[] EnumerateTokens<T>(TokenEnumerator1<T> tokenEnumerator, T parameter)
{
IntPtr enumerator = IntPtr.Zero;
while(true) {
uint token;
uint fetched;
tokenEnumerator(ref enumerator, parameter, out token, 1, out fetched);
if (fetched == 0) {
metaData.CloseEnum(enumerator);
break;
uint[] buffer = new uint[initialBufferSize];
uint fetched;
tokenEnumerator(ref enumerator, parameter, buffer, (uint)buffer.Length, out fetched);
if (fetched < buffer.Length) {
// The tokens did fit the buffer
Array.Resize(ref buffer, (int)fetched);
} else {
// The tokens did not fit the buffer -> Refetch
uint actualCount;
metaData.CountEnum(enumerator, out actualCount);
if (actualCount > buffer.Length) {
buffer = new uint[actualCount];
metaData.ResetEnum(enumerator, 0);
tokenEnumerator(ref enumerator, parameter, buffer, (uint)buffer.Length, out fetched);
}
yield return token;
}
metaData.CloseEnum(enumerator);
return buffer;
}
delegate void TokenEnumerator2<T,R>(ref IntPtr phEnum, T parameter1, R parameter2, out uint token, uint maxCount, out uint fetched);
delegate void TokenEnumerator2<T,R>(ref IntPtr phEnum, T parameter1, R parameter2, uint[] token, uint maxCount, out uint fetched);
IEnumerable<uint> EnumerateTokens<T,R>(TokenEnumerator2<T,R> tokenEnumerator, T parameter1, R parameter2)
uint[] EnumerateTokens<T,R>(TokenEnumerator2<T,R> tokenEnumerator, T parameter1, R parameter2)
{
IntPtr enumerator = IntPtr.Zero;
while(true) {
uint token;
uint fetched;
tokenEnumerator(ref enumerator, parameter1, parameter2, out token, 1, out fetched);
if (fetched == 0) {
metaData.CloseEnum(enumerator);
break;
uint[] buffer = new uint[initialBufferSize];
uint fetched;
tokenEnumerator(ref enumerator, parameter1, parameter2, buffer, (uint)buffer.Length, out fetched);
if (fetched < buffer.Length) {
// The tokens did fit the buffer
Array.Resize(ref buffer, (int)fetched);
} else {
// The tokens did not fit the buffer -> Refetch
uint actualCount;
metaData.CountEnum(enumerator, out actualCount);
if (actualCount > buffer.Length) {
buffer = new uint[actualCount];
metaData.ResetEnum(enumerator, 0);
tokenEnumerator(ref enumerator, parameter1, parameter2, buffer, (uint)buffer.Length, out fetched);
}
yield return token;
}
metaData.CloseEnum(enumerator);
return buffer;
}
#endregion

19
src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestPrograms/Metadata.cs

@ -39,6 +39,13 @@ namespace Debugger.Tests.TestPrograms @@ -39,6 +39,13 @@ namespace Debugger.Tests.TestPrograms
System.Diagnostics.Debugger.Break();
}
}
public class Metadata2 {}
public class Metadata3 {}
public class Metadata4 {}
public class Metadata5 {}
public class Metadata6 {}
public class Metadata7 {}
}
#if TEST_CODE
@ -53,6 +60,7 @@ namespace Debugger.Tests { @@ -53,6 +60,7 @@ namespace Debugger.Tests {
StartTest("Metadata.cs");
ObjectDump("Members", process.SelectedStackFrame.MethodInfo.DeclaringType.GetMembers(BindingFlags.All));
ObjectDump("Types", process.SelectedStackFrame.MethodInfo.Module.GetNamesOfDefinedTypes());
EndTest();
}
@ -376,6 +384,17 @@ namespace Debugger.Tests { @@ -376,6 +384,17 @@ namespace Debugger.Tests {
SetMethod="null" />
</Item>
</Members>
<Types
Capacity="8"
Count="7">
<Item>Debugger.Tests.TestPrograms.Metadata</Item>
<Item>Debugger.Tests.TestPrograms.Metadata2</Item>
<Item>Debugger.Tests.TestPrograms.Metadata3</Item>
<Item>Debugger.Tests.TestPrograms.Metadata4</Item>
<Item>Debugger.Tests.TestPrograms.Metadata5</Item>
<Item>Debugger.Tests.TestPrograms.Metadata6</Item>
<Item>Debugger.Tests.TestPrograms.Metadata7</Item>
</Types>
<ProcessExited />
</Test>
</DebuggerTests>

Loading…
Cancel
Save