From a9d96c67167260de8163588f6b004cc49186c700 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Srbeck=C3=BD?= Date: Sat, 26 Jan 2008 17:16:46 +0000 Subject: [PATCH] Removed some code duplication the metadata wrapper. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2925 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/Interop/MetaData/IMetaDataImport.cs | 18 +++---- .../Src/Wrappers/MetaData/MetaDataImport.cs | 49 +++++++------------ 2 files changed, 26 insertions(+), 41 deletions(-) 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 ae9b7836f5..642fb6f2be 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 @@ -23,11 +23,11 @@ namespace Debugger.Interop.MetaData [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)] void ResetEnum(IntPtr hEnum, uint ulPos); [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)] - void EnumTypeDefs(ref IntPtr phEnum, ref uint rTypeDefs, uint cMax, ref uint pcTypeDefs); + void EnumTypeDefs([In, Out] ref IntPtr phEnum, ref uint rTypeDefs, uint cMax, ref uint pcTypeDefs); [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)] - void EnumInterfaceImpls(ref IntPtr phEnum, uint td, ref uint rImpls, uint cMax, ref uint pcImpls); + void EnumInterfaceImpls([In, Out] ref IntPtr phEnum, uint td, ref uint rImpls, uint cMax, ref uint pcImpls); [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)] - void EnumTypeRefs(ref IntPtr phEnum, ref uint rTypeRefs, uint cMax, ref uint pcTypeRefs); + void EnumTypeRefs([In, Out] ref IntPtr phEnum, ref uint rTypeRefs, uint cMax, ref uint pcTypeRefs); [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)] void FindTypeDefByName([In, MarshalAs(UnmanagedType.LPWStr)] string szTypeDef, [In] uint tkEnclosingClass, out uint ptd); [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)] @@ -43,21 +43,21 @@ namespace Debugger.Interop.MetaData [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] ref IntPtr phEnum, [In] uint cl, out uint rMembers, [In] uint cMax, out uint pcTokens); + void EnumMembers([In, Out] ref IntPtr phEnum, [In] uint cl, out uint rMembers, [In] 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); [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)] - void EnumMethods([In] ref IntPtr phEnum, [In] uint cl, out uint rMethods, [In] uint cMax, out uint pcTokens); + void EnumMethods([In, Out] ref IntPtr phEnum, [In] uint cl, out uint rMethods, [In] uint cMax, out uint pcTokens); [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)] - void EnumMethodsWithName([In] ref IntPtr phEnum, [In] uint cl, [In, MarshalAs(UnmanagedType.LPWStr)] string szName, out uint rMethods, [In] uint cMax, out uint pcTokens); + 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); [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); [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); [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)] - void EnumParams([In] ref IntPtr phEnum, [In] uint mb, out uint rParams, [In] uint cMax, out uint pcTokens); + void EnumParams([In, Out] ref IntPtr phEnum, [In] uint mb, out uint rParams, [In] uint cMax, out uint pcTokens); [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)] - void EnumMemberRefs([In] ref IntPtr phEnum, [In] uint tkParent, out uint rMemberRefs, [In] uint cMax, out uint pcTokens); + void EnumMemberRefs([In, Out] ref IntPtr phEnum, [In] uint tkParent, out uint rMemberRefs, [In] 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); [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)] @@ -75,7 +75,7 @@ namespace Debugger.Interop.MetaData [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)] void GetMemberRefProps([In] uint mr, out uint ptk, [Out, MarshalAs(UnmanagedType.LPWStr)] string szMember, [In] uint cchMember, out uint pchMember, [Out] IntPtr ppvSigBlob, out uint pbSig); [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)] - void EnumProperties([In] ref IntPtr phEnum, [In] uint td, out uint rProperties, [In] uint cMax, out uint pcProperties); + void EnumProperties([In, Out] ref IntPtr phEnum, [In] uint td, out uint rProperties, [In] 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); [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)] diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/MetaData/MetaDataImport.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/MetaData/MetaDataImport.cs index ae60cd5194..f1f979539d 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/MetaData/MetaDataImport.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/MetaData/MetaDataImport.cs @@ -87,16 +87,8 @@ namespace Debugger.Wrappers.MetaData public IEnumerable EnumFields(uint typeToken) { - 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; - } - yield return GetFieldProps(fieldToken); + foreach(uint token in EnumerateTokens(metaData.EnumFields, typeToken)) { + yield return GetFieldProps(token); } } @@ -125,16 +117,8 @@ namespace Debugger.Wrappers.MetaData public IEnumerable EnumMethods(uint typeToken) { - IntPtr enumerator = IntPtr.Zero; - while(true) { - uint methodToken; - uint methodsFetched; - metaData.EnumMethods(ref enumerator, typeToken, out methodToken, 1, out methodsFetched); - if (methodsFetched == 0) { - metaData.CloseEnum(enumerator); - break; - } - yield return GetMethodProps(methodToken); + foreach(uint token in EnumerateTokens(metaData.EnumMethods, typeToken)) { + yield return GetMethodProps(token); } } @@ -176,17 +160,7 @@ namespace Debugger.Wrappers.MetaData public IEnumerable EnumParams(uint mb) { - IntPtr enumerator = IntPtr.Zero; - while(true) { - uint token; - uint fetched; - metaData.EnumParams(ref enumerator, mb, out token, 1, out fetched); - if (fetched == 0) { - metaData.CloseEnum(enumerator); - break; - } - yield return token; - } + return EnumerateTokens(metaData.EnumParams, mb); } public int GetParamCount(uint methodToken) @@ -239,12 +213,21 @@ namespace Debugger.Wrappers.MetaData } public IEnumerable EnumGenericParams(uint typeDef_methodDef) + { + return EnumerateTokens(metaData.EnumGenericParams, typeDef_methodDef); + } + + #region Util + + delegate void TokenEnumerator(ref IntPtr phEnum, uint parameter, out uint token, uint maxCount, out uint fetched); + + IEnumerable EnumerateTokens(TokenEnumerator tokenEnumerator, uint parameter) { IntPtr enumerator = IntPtr.Zero; while(true) { uint token; uint fetched; - metaData.EnumGenericParams(ref enumerator, typeDef_methodDef, out token, 1, out fetched); + tokenEnumerator(ref enumerator, parameter, out token, 1, out fetched); if (fetched == 0) { metaData.CloseEnum(enumerator); break; @@ -252,6 +235,8 @@ namespace Debugger.Wrappers.MetaData yield return token; } } + + #endregion } }