PageRenderTime 66ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 2ms

/SHFB/Source/MRefBuilder/CCI/Reader.cs

#
C# | 5822 lines | 5398 code | 311 blank | 113 comment | 1647 complexity | 4e5dc2e8accf5056413d2140985e6bc7 MD5 | raw file
Possible License(s): CC-BY-SA-3.0

Large files files are truncated, but you can click here to view the full file

  1. // Copyright Š Microsoft Corporation.
  2. // This source file is subject to the Microsoft Permissive License.
  3. // See http://www.microsoft.com/resources/sharedsource/licensingbasics/sharedsourcelicenses.mspx.
  4. // All other rights reserved.
  5. // Change history:
  6. // 11/21/2013 - EFW - Cleared out the conditional statements and updated based on changes to ListTemplate.cs.
  7. // 12/15/2013 - EFW - Fixed a bug found when parsing the .NET 4.5.1 Framework assemblies
  8. using System.Collections;
  9. using System.Collections.Generic;
  10. using System.Diagnostics;
  11. using System.Globalization;
  12. using System.IO;
  13. using System.Linq;
  14. using Marshal = System.Runtime.InteropServices.Marshal;
  15. using System.Runtime.InteropServices;
  16. namespace System.Compiler.Metadata
  17. {
  18. enum CorOpenFlags : uint
  19. {
  20. ofRead = 0x00000000, // Open scope for read
  21. ofWrite = 0x00000001, // Open scope for write.
  22. ofCopyMemory = 0x00000002, // Open scope with memory. Ask metadata to maintain its own copy of memory.
  23. ofCacheImage = 0x00000004, // EE maps but does not do relocations or verify image
  24. ofNoTypeLib = 0x00000080, // Don't OpenScope on a typelib.
  25. }
  26. [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("809c652e-7396-11d2-9771-00A0C9B4D50C")]
  27. interface IMetaDataDispenser
  28. {
  29. void DefineScope(ref Guid clsid, uint createFlags, [In] ref Guid iid, [MarshalAs(UnmanagedType.IUnknown)] out object retval);
  30. [PreserveSig]
  31. int OpenScope(string scope, uint openFlags, [In] ref Guid iid, [MarshalAs(UnmanagedType.IUnknown)] out object import);
  32. void OpenScopeOnMemory(IntPtr data, uint dataSize, uint openFlags, [In] ref Guid iid, [MarshalAs(UnmanagedType.IUnknown)] out object retval);
  33. }
  34. [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("AA544D42-28CB-11d3-BD22-0000F80849BD")]
  35. interface ISymUnmanagedBinder
  36. {
  37. [PreserveSig]
  38. int GetReaderForFile([MarshalAs(UnmanagedType.IUnknown)] object importer, string filename, string searchPath, out ISymUnmanagedReader reader);
  39. ISymUnmanagedReader GetReaderForStream([MarshalAs(UnmanagedType.IUnknown)] object importer, [MarshalAs(UnmanagedType.IUnknown)] object stream);
  40. }
  41. [ComImport, Guid("ACCEE350-89AF-4ccb-8B40-1C2C4C6F9434"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), ComVisible(false)]
  42. interface ISymUnmanagedBinder2 : ISymUnmanagedBinder
  43. {
  44. void GetReaderForFile(IntPtr importer, [MarshalAs(UnmanagedType.LPWStr)] String filename, [MarshalAs(UnmanagedType.LPWStr)] String SearchPath, [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedReader retVal);
  45. void GetReaderFromStream(IntPtr importer, IntPtr stream, [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedReader retVal);
  46. [PreserveSig]
  47. int GetReaderForFile2([MarshalAs(UnmanagedType.IUnknown)] object importer, [MarshalAs(UnmanagedType.LPWStr)] String fileName, [MarshalAs(UnmanagedType.LPWStr)] String searchPath, int searchPolicy, [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedReader pRetVal);
  48. // void GetReaderForFile3(IntPtr importer, [MarshalAs(UnmanagedType.LPWStr)] String fileName, [MarshalAs(UnmanagedType.LPWStr)] String searchPath, int searchPolicy, IntPtr callback, [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedReader pRetVal);
  49. }
  50. [ComImport, Guid("AA544D41-28CB-11d3-BD22-0000F80849BD")]
  51. class CorSymBinder
  52. {
  53. }
  54. [ComImport, Guid("0A29FF9E-7F9C-4437-8B11-F424491E3931")]
  55. class CorSymBinder2
  56. {
  57. }
  58. [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("B4CE6286-2A6B-3712-A3B7-1EE1DAD467B5")]
  59. interface ISymUnmanagedReader
  60. {
  61. ISymUnmanagedDocument GetDocument(string url, ref Guid language, ref Guid languageVendor, ref Guid documentType);
  62. void GetDocuments(uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ISymUnmanagedDocument[] docs);
  63. uint GetUserEntryPoint();
  64. [PreserveSig]
  65. int GetMethod(uint token, ref ISymUnmanagedMethod method);
  66. ISymUnmanagedMethod GetMethodByVersion(uint token, int version);
  67. void GetVariables(uint parent, uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] ISymUnmanagedVariable[] vars);
  68. void GetGlobalVariables(uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ISymUnmanagedVariable[] vars);
  69. ISymUnmanagedMethod GetMethodFromDocumentPosition(ISymUnmanagedDocument document, uint line, uint column);
  70. void GetSymAttribute(uint parent, string name, ulong size, ref uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] buffer);
  71. void GetNamespaces(uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] IntPtr[] namespaces);
  72. void Initialize([MarshalAs(UnmanagedType.IUnknown)] object importer, string filename, string searchPath, [MarshalAs(UnmanagedType.IUnknown)] object stream);
  73. void UpdateSymbolStore(string filename, [MarshalAs(UnmanagedType.IUnknown)] object stream);
  74. void ReplaceSymbolStore(string filename, [MarshalAs(UnmanagedType.IUnknown)] object stream);
  75. void GetSymbolStoreFileName(uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] char[] name);
  76. void GetMethodsFromDocumentPosition(ISymUnmanagedDocument document, uint line, uint column, uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] ISymUnmanagedMethod[] retval);
  77. void GetDocumentVersion(ISymUnmanagedDocument doc, out int version, out bool isLatest);
  78. void GetMethodVersion(ISymUnmanagedMethod method, out int version);
  79. }
  80. [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("B62B923C-B500-3158-A543-24F307A8B7E1")]
  81. interface ISymUnmanagedMethod
  82. {
  83. uint GetToken();
  84. uint GetSequencePointCount();
  85. ISymUnmanagedScope GetRootScope();
  86. ISymUnmanagedScope GetScopeFromOffset(uint offset);
  87. uint Getoffset(ISymUnmanagedDocument document, uint line, uint column);
  88. void GetRanges(ISymUnmanagedDocument document, uint line, uint column, uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] uint[] ranges);
  89. void GetParameters(uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ISymUnmanagedVariable[] parms);
  90. IntPtr GetNamespace();
  91. bool GetSourceStartEnd([MarshalAs(UnmanagedType.LPArray, SizeConst = 2)] ISymUnmanagedDocument[] docs, [MarshalAs(UnmanagedType.LPArray)] uint[] lines, [MarshalAs(UnmanagedType.LPArray)] uint[] columns);
  92. void GetSequencePoints(uint size, out uint length,
  93. [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] uint[] offsets,
  94. [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.IUnknown, SizeParamIndex = 0)] IntPtr[] documents,
  95. [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] uint[] lines,
  96. [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] uint[] columns,
  97. [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] uint[] endLines,
  98. [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] uint[] endColumns);
  99. }
  100. [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("40DE4037-7C81-3E1E-B022-AE1ABFF2CA08")]
  101. interface ISymUnmanagedDocument
  102. {
  103. void GetURL(uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] char[] url);
  104. void GetDocumentType(out Guid retval);
  105. void GetLanguage(out Guid retval);
  106. void GetLanguageVendor(out Guid retval);
  107. void GetCheckSumAlgorithmId(out Guid retval);
  108. void GetCheckSum(uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] byte[] data);
  109. uint FindClosestLine(uint line);
  110. bool HasEmbeddedSource();
  111. uint GetSourceLength();
  112. void GetSourceRange(uint startLine, uint startColumn, uint endLine, uint endColumn, uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 4)] byte[] source);
  113. }
  114. [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("9F60EEBE-2D9A-3F7C-BF58-80BC991C60BB")]
  115. interface ISymUnmanagedVariable
  116. {
  117. void GetName(uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] char[] name);
  118. uint GetAttributes();
  119. void GetSignature(uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] byte[] name);
  120. uint GetAddressKind();
  121. uint GetAddressField1();
  122. uint GetAddressField2();
  123. uint GetAddressField3();
  124. uint GetStartOffset();
  125. uint GetEndOffset();
  126. }
  127. [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("68005D0F-B8E0-3B01-84D5-A11A94154942")]
  128. interface ISymUnmanagedScope
  129. {
  130. ISymUnmanagedMethod GetMethod();
  131. ISymUnmanagedScope GetParent();
  132. void GetChildren(uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] IntPtr[] children);
  133. uint GetStartOffset();
  134. uint GetEndOffset();
  135. uint GetLocalCount();
  136. void GetLocals(uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] IntPtr[] locals);
  137. void GetNamespaces(uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] IntPtr[] namespaces);
  138. }
  139. internal sealed class UnmanagedBuffer : IDisposable
  140. {
  141. internal IntPtr Pointer;
  142. internal UnmanagedBuffer(int length)
  143. {
  144. this.Pointer = Marshal.AllocHGlobal(length);
  145. }
  146. public void Dispose()
  147. {
  148. if (this.Pointer != IntPtr.Zero)
  149. Marshal.FreeHGlobal(this.Pointer);
  150. this.Pointer = IntPtr.Zero;
  151. GC.SuppressFinalize(this);
  152. }
  153. ~UnmanagedBuffer()
  154. {
  155. this.Dispose();
  156. }
  157. }
  158. internal unsafe class Reader : IDisposable
  159. {
  160. private string directory;
  161. private string fileName;
  162. private bool doNotLockFile;
  163. private Module/*!*/ module = new Module();
  164. internal TypeNode currentType;
  165. private long sortedTablesMask;
  166. internal MetadataReader/*!*/ tables;
  167. private UnmanagedBuffer unmanagedBuffer;
  168. private int bufferLength;
  169. private IDictionary/*!*/ localAssemblyCache; //use for simple names
  170. internal readonly static IDictionary/*!*/ StaticAssemblyCache = new SynchronizedWeakDictionary(); //use for strong names
  171. private bool useStaticCache;
  172. //^ [Microsoft.Contracts.SpecInternal]
  173. private TrivialHashtable namespaceTable;
  174. internal NamespaceList namespaceList;
  175. internal ISymUnmanagedReader debugReader;
  176. internal bool getDebugSymbols;
  177. private bool getDebugSymbolsFailed;
  178. private TypeNodeList currentTypeParameters;
  179. private TypeNodeList currentMethodTypeParameters;
  180. internal bool preserveShortBranches;
  181. internal unsafe Reader(byte[]/*!*/ buffer, IDictionary localAssemblyCache, bool doNotLockFile, bool getDebugInfo, bool useStaticCache, bool preserveShortBranches)
  182. {
  183. Debug.Assert(buffer != null);
  184. if (localAssemblyCache == null) localAssemblyCache = new Hashtable();
  185. this.localAssemblyCache = localAssemblyCache;
  186. this.getDebugSymbols = getDebugInfo;
  187. this.doNotLockFile = false;
  188. this.useStaticCache = useStaticCache;
  189. this.preserveShortBranches = preserveShortBranches;
  190. int n = this.bufferLength = buffer.Length;
  191. this.unmanagedBuffer = new UnmanagedBuffer(n);
  192. //^ base();
  193. byte* pb = (byte*)this.unmanagedBuffer.Pointer;
  194. for (int i = 0; i < n; i++) *pb++ = buffer[i];
  195. }
  196. internal Reader(string/*!*/ fileName, IDictionary localAssemblyCache, bool doNotLockFile, bool getDebugInfo, bool useStaticCache, bool preserveShortBranches)
  197. {
  198. if (localAssemblyCache == null) localAssemblyCache = new Hashtable();
  199. this.localAssemblyCache = localAssemblyCache;
  200. fileName = System.IO.Path.GetFullPath(fileName);
  201. this.fileName = fileName;
  202. this.directory = System.IO.Path.GetDirectoryName(fileName);
  203. this.getDebugSymbols = getDebugInfo;
  204. this.doNotLockFile = doNotLockFile;
  205. this.useStaticCache = useStaticCache;
  206. this.preserveShortBranches = preserveShortBranches;
  207. //^ base();
  208. }
  209. internal Reader(IDictionary localAssemblyCache, bool doNotLockFile, bool getDebugInfo, bool useStaticCache, bool preserveShortBranches)
  210. {
  211. if (localAssemblyCache == null) localAssemblyCache = new Hashtable();
  212. this.localAssemblyCache = localAssemblyCache;
  213. this.directory = System.IO.Directory.GetCurrentDirectory();
  214. this.getDebugSymbols = getDebugInfo;
  215. this.doNotLockFile = doNotLockFile;
  216. this.useStaticCache = useStaticCache;
  217. this.preserveShortBranches = preserveShortBranches;
  218. //^ base();
  219. }
  220. public void Dispose()
  221. {
  222. if (this.unmanagedBuffer != null)
  223. this.unmanagedBuffer.Dispose();
  224. this.unmanagedBuffer = null;
  225. if (this.tables != null)
  226. this.tables.Dispose();
  227. //this.tables = null;
  228. if (this.debugReader != null)
  229. Marshal.ReleaseComObject(this.debugReader);
  230. this.debugReader = null;
  231. }
  232. private unsafe void SetupReader()
  233. {
  234. Debug.Assert(this.localAssemblyCache != null);
  235. if (this.doNotLockFile)
  236. {
  237. using (System.IO.FileStream inputStream = new System.IO.FileStream(this.fileName,
  238. System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read))
  239. {
  240. this.ReadFileIntoUnmanagedBuffer(inputStream);
  241. }
  242. }
  243. if (this.unmanagedBuffer == null)
  244. this.tables = new MetadataReader(this.fileName); //Uses a memory map that locks the file
  245. else
  246. this.tables = new MetadataReader((byte*)this.unmanagedBuffer.Pointer, this.bufferLength);
  247. //^ assume this.tables.tablesHeader != null;
  248. this.sortedTablesMask = this.tables.tablesHeader.maskSorted;
  249. }
  250. [DllImport("kernel32", SetLastError = true)]
  251. [return: MarshalAs(UnmanagedType.Bool)]
  252. static extern unsafe bool ReadFile(IntPtr FileHandle, byte* Buffer, int NumberOfBytesToRead, int* NumberOfBytesRead, IntPtr Overlapped);
  253. private unsafe void ReadFileIntoUnmanagedBuffer(System.IO.FileStream/*!*/ inputStream)
  254. {
  255. long size = inputStream.Seek(0, System.IO.SeekOrigin.End);
  256. if (size > int.MaxValue) throw new System.IO.FileLoadException();
  257. inputStream.Seek(0, System.IO.SeekOrigin.Begin);
  258. int n = (int)size;
  259. this.bufferLength = n;
  260. this.unmanagedBuffer = new UnmanagedBuffer(n);
  261. byte* pb = (byte*)this.unmanagedBuffer.Pointer;
  262. if(!Reader.ReadFile(inputStream.SafeFileHandle.DangerousGetHandle(), pb, n, &n, IntPtr.Zero))
  263. throw new System.IO.FileLoadException();
  264. }
  265. internal void SetupDebugReader(string filename, string pdbSearchPath)
  266. {
  267. if (filename == null) return;
  268. CorSymBinder binderObj1 = null;
  269. CorSymBinder2 binderObj2 = null;
  270. getDebugSymbolsFailed = false;
  271. object importer = null;
  272. try
  273. {
  274. int hresult = 0;
  275. try
  276. {
  277. binderObj2 = new CorSymBinder2();
  278. ISymUnmanagedBinder2 binder2 = (ISymUnmanagedBinder2)binderObj2;
  279. importer = new EmptyImporter();
  280. hresult = binder2.GetReaderForFile(importer, filename, pdbSearchPath, out this.debugReader);
  281. }
  282. catch (COMException e)
  283. {
  284. // could not instantiate ISymUnmanagedBinder2, fall back to ISymUnmanagedBinder
  285. if ((uint)e.ErrorCode == 0x80040111)
  286. {
  287. binderObj1 = new CorSymBinder();
  288. ISymUnmanagedBinder binder = (ISymUnmanagedBinder)binderObj1;
  289. hresult = binder.GetReaderForFile(importer, filename, null, out this.debugReader);
  290. }
  291. else
  292. {
  293. throw;
  294. }
  295. }
  296. switch ((uint)hresult)
  297. {
  298. case 0x0: break;
  299. case 0x806d0005: // EC_NOT_FOUND
  300. case 0x806d0014: // EC_INVALID_EXE_TIMESTAMP
  301. // Sometimes GetReaderForFile erroneously reports missing pdb files as being "out of date",
  302. // so we check if the file actually exists before reporting the error.
  303. // The mere absence of a pdb file is not an error. If not present, do not report.
  304. if (System.IO.File.Exists(System.IO.Path.ChangeExtension(filename, ".pdb")))
  305. throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, ExceptionStrings.PdbAssociatedWithFileIsOutOfDate, filename));
  306. break;
  307. default:
  308. throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture,
  309. ExceptionStrings.GetReaderForFileReturnedUnexpectedHResult, hresult.ToString("X")));
  310. }
  311. }
  312. catch (Exception e)
  313. {
  314. this.getDebugSymbols = false;
  315. this.getDebugSymbolsFailed = true;
  316. if (this.module.MetadataImportErrors == null) this.module.MetadataImportErrors = new ArrayList();
  317. this.module.MetadataImportErrors.Add(e);
  318. }
  319. finally
  320. {
  321. if (binderObj1 != null) Marshal.ReleaseComObject(binderObj1);
  322. if (binderObj2 != null) Marshal.ReleaseComObject(binderObj2);
  323. }
  324. }
  325. private AssemblyNode ReadAssembly()
  326. {
  327. try
  328. {
  329. AssemblyNode assembly = new AssemblyNode(new Module.TypeNodeProvider(this.GetTypeFromName),
  330. new Module.TypeNodeListProvider(this.GetTypeList), new Module.CustomAttributeProvider(this.GetCustomAttributesFor),
  331. new Module.ResourceProvider(this.GetResources), this.directory);
  332. assembly.reader = this;
  333. this.ReadModuleProperties(assembly);
  334. this.ReadAssemblyProperties(assembly); //Hashvalue, Name, etc.
  335. this.module = assembly;
  336. this.ReadAssemblyReferences(assembly);
  337. this.ReadModuleReferences(assembly);
  338. AssemblyNode cachedAssembly = this.GetCachedAssembly(assembly);
  339. if (cachedAssembly != null) return cachedAssembly;
  340. if (this.getDebugSymbols) assembly.SetupDebugReader(null);
  341. assembly.AfterAssemblyLoadProcessing();
  342. return assembly;
  343. }
  344. catch (Exception e)
  345. {
  346. if (this.module == null) return null;
  347. if (this.module.MetadataImportErrors == null) this.module.MetadataImportErrors = new ArrayList();
  348. this.module.MetadataImportErrors.Add(e);
  349. return this.module as AssemblyNode;
  350. }
  351. }
  352. private AssemblyNode GetCachedAssembly(AssemblyNode/*!*/ assembly)
  353. {
  354. //Always return the one true mscorlib. Things get too weird if more than one mscorlib is being read at the same time.
  355. //if (CoreSystemTypes.SystemAssembly != null && CoreSystemTypes.SystemAssembly.Name == assembly.Name && CoreSystemTypes.SystemAssembly.reader != null) {
  356. // if (CoreSystemTypes.SystemAssembly.reader != this) {
  357. // if (this.getDebugSymbols && !CoreSystemTypes.SystemAssembly.reader.getDebugSymbols && !CoreSystemTypes.SystemAssembly.reader.getDebugSymbolsFailed)
  358. // CoreSystemTypes.SystemAssembly.SetupDebugReader(null);
  359. // this.Dispose();
  360. // }
  361. // return CoreSystemTypes.SystemAssembly;
  362. //}
  363. if (assembly.PublicKeyOrToken == null || assembly.PublicKeyOrToken.Length == 0)
  364. {
  365. AssemblyNode cachedAssembly = null;
  366. if (assembly.Location != null)
  367. cachedAssembly = this.localAssemblyCache[assembly.Location] as AssemblyNode;
  368. if (cachedAssembly == null && assembly.Name != null)
  369. {
  370. cachedAssembly = this.localAssemblyCache[assembly.Name] as AssemblyNode;
  371. if (cachedAssembly != null && assembly.Location != null)
  372. this.localAssemblyCache[assembly.Location] = cachedAssembly;
  373. }
  374. if (cachedAssembly != null)
  375. {
  376. if (cachedAssembly.reader != this && cachedAssembly.reader != null)
  377. {
  378. if (this.getDebugSymbols && !cachedAssembly.reader.getDebugSymbols && !cachedAssembly.reader.getDebugSymbolsFailed)
  379. cachedAssembly.SetupDebugReader(null);
  380. this.Dispose();
  381. }
  382. return cachedAssembly;
  383. }
  384. lock (Reader.StaticAssemblyCache)
  385. {
  386. if (assembly.Name != null)
  387. this.localAssemblyCache[assembly.Name] = assembly;
  388. if (this.fileName != null)
  389. this.localAssemblyCache[this.fileName] = assembly;
  390. }
  391. }
  392. else
  393. {
  394. string assemblyStrongName = assembly.StrongName;
  395. AssemblyNode cachedAssembly = null;
  396. if (this.useStaticCache)
  397. {
  398. //See if assembly is a platform assembly (and apply unification)
  399. AssemblyReference assemblyReference = new AssemblyReference(assembly);
  400. AssemblyReference aRef = (AssemblyReference)TargetPlatform.AssemblyReferenceFor[Identifier.For(assemblyReference.Name).UniqueIdKey];
  401. if (aRef != null && assemblyReference.Version != null && aRef.Version >= assemblyReference.Version && aRef.MatchesIgnoringVersion(assemblyReference))
  402. {
  403. AssemblyNode platformAssembly = aRef.assembly;
  404. if (platformAssembly == null)
  405. {
  406. Debug.Assert(aRef.Location != null);
  407. if (Path.GetFullPath(aRef.Location) == assembly.Location)
  408. {
  409. if (aRef.Version != assemblyReference.Version)
  410. {
  411. HandleError(assembly, String.Format(CultureInfo.CurrentCulture, ExceptionStrings.BadTargetPlatformLocation, assembly.Name, TargetPlatform.PlatformAssembliesLocation, assembly.Version, aRef.Version));
  412. }
  413. lock (Reader.StaticAssemblyCache)
  414. {
  415. Reader.StaticAssemblyCache[assemblyStrongName] = assembly;
  416. if (aRef.Location != null)
  417. Reader.StaticAssemblyCache[aRef.Location] = assembly;
  418. }
  419. return null; //Prevents infinite recursion
  420. }
  421. platformAssembly = AssemblyNode.GetAssembly(aRef.Location, this.doNotLockFile, this.getDebugSymbols, this.useStaticCache);
  422. }
  423. if (platformAssembly != null)
  424. {
  425. lock (Reader.StaticAssemblyCache)
  426. {
  427. if (aRef.Location != null)
  428. Reader.StaticAssemblyCache[aRef.Location] = platformAssembly;
  429. Reader.StaticAssemblyCache[assemblyStrongName] = platformAssembly;
  430. }
  431. return aRef.assembly = platformAssembly;
  432. }
  433. }
  434. cachedAssembly = Reader.StaticAssemblyCache[assemblyStrongName] as AssemblyNode;
  435. if (cachedAssembly != null)
  436. {
  437. if (aRef == null && assembly.FileLastWriteTimeUtc > cachedAssembly.FileLastWriteTimeUtc &&
  438. assembly.Location != null && cachedAssembly.Location != null && assembly.Location == cachedAssembly.Location)
  439. {
  440. lock (Reader.StaticAssemblyCache)
  441. {
  442. Reader.StaticAssemblyCache[assemblyStrongName] = assembly;
  443. }
  444. return null;
  445. }
  446. if (cachedAssembly.reader != this && cachedAssembly.reader != null)
  447. {
  448. if (this.getDebugSymbols && !cachedAssembly.reader.getDebugSymbols && !cachedAssembly.reader.getDebugSymbolsFailed)
  449. cachedAssembly.SetupDebugReader(null);
  450. this.Dispose();
  451. }
  452. return cachedAssembly;
  453. }
  454. lock (Reader.StaticAssemblyCache)
  455. {
  456. Reader.StaticAssemblyCache[assemblyStrongName] = assembly;
  457. if (this.fileName != null)
  458. {
  459. Reader.StaticAssemblyCache[this.fileName] = assembly;
  460. }
  461. }
  462. }
  463. else
  464. {
  465. cachedAssembly = this.localAssemblyCache[assemblyStrongName] as AssemblyNode;
  466. if (cachedAssembly != null)
  467. {
  468. if (assembly.FileLastWriteTimeUtc > cachedAssembly.FileLastWriteTimeUtc &&
  469. assembly.Location != null && cachedAssembly.Location != null && assembly.Location == cachedAssembly.Location)
  470. {
  471. this.localAssemblyCache[assemblyStrongName] = assembly;
  472. return null;
  473. }
  474. if (cachedAssembly.reader != this && cachedAssembly.reader != null)
  475. {
  476. if (this.getDebugSymbols && cachedAssembly.reader.debugReader == null && !cachedAssembly.reader.getDebugSymbolsFailed)
  477. cachedAssembly.SetupDebugReader(null);
  478. this.Dispose();
  479. }
  480. return cachedAssembly;
  481. }
  482. this.localAssemblyCache[assemblyStrongName] = assembly;
  483. if (this.fileName != null) this.localAssemblyCache[this.fileName] = assembly;
  484. }
  485. }
  486. return null;
  487. }
  488. internal Module ReadModule()
  489. {
  490. try
  491. {
  492. if (this.fileName != null)
  493. {
  494. if (!System.IO.File.Exists(this.fileName)) return null;
  495. AssemblyNode cachedAssembly;
  496. if (this.useStaticCache)
  497. {
  498. cachedAssembly = Reader.StaticAssemblyCache[this.fileName] as AssemblyNode;
  499. if (cachedAssembly != null && cachedAssembly.FileLastWriteTimeUtc == System.IO.File.GetLastWriteTimeUtc(this.fileName))
  500. {
  501. this.Dispose();
  502. return cachedAssembly;
  503. }
  504. }
  505. cachedAssembly = this.localAssemblyCache[this.fileName] as AssemblyNode;
  506. if (cachedAssembly != null && cachedAssembly.FileLastWriteTimeUtc == System.IO.File.GetLastWriteTimeUtc(this.fileName))
  507. {
  508. this.Dispose();
  509. return cachedAssembly;
  510. }
  511. }
  512. this.SetupReader();
  513. if (this.tables.AssemblyTable.Length > 0) return this.ReadAssembly();
  514. Module module = this.module = new Module(new Module.TypeNodeProvider(this.GetTypeFromName),
  515. new Module.TypeNodeListProvider(this.GetTypeList), new Module.CustomAttributeProvider(this.GetCustomAttributesFor),
  516. new Module.ResourceProvider(this.GetResources));
  517. module.reader = this;
  518. this.ReadModuleProperties(module);
  519. this.module = module;
  520. this.ReadAssemblyReferences(module);
  521. this.ReadModuleReferences(module);
  522. if (this.getDebugSymbols) this.SetupDebugReader(this.fileName, null);
  523. return module;
  524. }
  525. catch (Exception e)
  526. {
  527. if (this.module == null) return null;
  528. if (this.module.MetadataImportErrors == null) this.module.MetadataImportErrors = new ArrayList();
  529. this.module.MetadataImportErrors.Add(e);
  530. return module;
  531. }
  532. }
  533. private void ReadModuleProperties(Module/*!*/ module)
  534. {
  535. ModuleRow[] mods = this.tables.ModuleTable;
  536. if (mods.Length != 1) throw new InvalidMetadataException(ExceptionStrings.InvalidModuleTable);
  537. ModuleRow mrow = mods[0];
  538. module.reader = this;
  539. module.FileAlignment = this.tables.fileAlignment;
  540. module.HashValue = this.tables.HashValue;
  541. module.Kind = this.tables.moduleKind;
  542. module.Location = this.fileName;
  543. module.TargetRuntimeVersion = this.tables.targetRuntimeVersion;
  544. module.LinkerMajorVersion = this.tables.linkerMajorVersion;
  545. module.LinkerMinorVersion = this.tables.linkerMinorVersion;
  546. module.MetadataFormatMajorVersion = this.tables.metadataFormatMajorVersion;
  547. module.MetadataFormatMinorVersion = this.tables.metadataFormatMinorVersion;
  548. module.Name = this.tables.GetString(mrow.Name);
  549. module.Mvid = this.tables.GetGuid(mrow.Mvid);
  550. module.PEKind = this.tables.peKind;
  551. module.TrackDebugData = this.tables.TrackDebugData;
  552. }
  553. private void ReadAssemblyProperties(AssemblyNode/*!*/ assembly)
  554. {
  555. AssemblyRow assemblyRow = this.tables.AssemblyTable[0];
  556. assembly.HashAlgorithm = (AssemblyHashAlgorithm)assemblyRow.HashAlgId;
  557. assembly.Version = new System.Version(assemblyRow.MajorVersion, assemblyRow.MinorVersion, assemblyRow.BuildNumber, assemblyRow.RevisionNumber);
  558. assembly.Flags = (AssemblyFlags)assemblyRow.Flags;
  559. assembly.PublicKeyOrToken = this.tables.GetBlob(assemblyRow.PublicKey);
  560. assembly.ModuleName = assembly.Name;
  561. assembly.Name = this.tables.GetString(assemblyRow.Name);
  562. assembly.Culture = this.tables.GetString(assemblyRow.Culture);
  563. if (this.fileName != null)
  564. {
  565. assembly.FileLastWriteTimeUtc = System.IO.File.GetLastWriteTimeUtc(this.fileName);
  566. }
  567. assembly.ContainingAssembly = assembly;
  568. }
  569. private void ReadAssemblyReferences(Module/*!*/ module)
  570. {
  571. AssemblyRefRow[] assems = this.tables.AssemblyRefTable;
  572. int n = assems.Length;
  573. AssemblyReferenceList assemblies = module.AssemblyReferences = new AssemblyReferenceList();
  574. for(int i = 0; i < n; i++)
  575. {
  576. AssemblyRefRow arr = assems[i];
  577. AssemblyReference assemRef = new AssemblyReference();
  578. assemRef.Version = new System.Version(arr.MajorVersion, arr.MinorVersion, arr.BuildNumber, arr.RevisionNumber);
  579. assemRef.Flags = (AssemblyFlags)arr.Flags;
  580. assemRef.PublicKeyOrToken = this.tables.GetBlob(arr.PublicKeyOrToken);
  581. assemRef.Name = this.tables.GetString(arr.Name);
  582. //if (CoreSystemTypes.SystemAssembly != null && CoreSystemTypes.SystemAssembly.Name == assemRef.Name &&
  583. // assemRef.Version > CoreSystemTypes.SystemAssembly.Version){
  584. // HandleError(module, ExceptionStrings.ModuleOrAssemblyDependsOnMoreRecentVersionOfCoreLibrary);
  585. //}
  586. assemRef.Culture = this.tables.GetString(arr.Culture);
  587. if(assemRef.Culture != null && assemRef.Culture.Length == 0)
  588. assemRef.Culture = null;
  589. assemRef.HashValue = this.tables.GetBlob(arr.HashValue);
  590. assemRef.Reader = this;
  591. assems[i].AssemblyReference = assemRef;
  592. assemblies.Add(assemRef);
  593. }
  594. }
  595. private void ReadModuleReferences(Module/*!*/ module)
  596. {
  597. FileRow[] files = this.tables.FileTable;
  598. ModuleRefRow[] modRefs = this.tables.ModuleRefTable;
  599. int n = modRefs.Length;
  600. ModuleReferenceList modules = module.ModuleReferences = new ModuleReferenceList();
  601. for(int i = 0; i < n; i++)
  602. {
  603. Module mod;
  604. int nameIndex = modRefs[i].Name;
  605. string name = this.tables.GetString(nameIndex);
  606. string dir = GetDirectoryName(this.module.Location);
  607. string location = Combine(dir, name);
  608. for (int j = 0, m = files == null ? 0 : files.Length; j < m; j++)
  609. {
  610. if(files[j].Name != nameIndex)
  611. continue;
  612. if ((files[j].Flags & (int)FileFlags.ContainsNoMetaData) == 0)
  613. mod = Module.GetModule(location, this.doNotLockFile, this.getDebugSymbols, false);
  614. else
  615. mod = null;
  616. if(mod == null)
  617. {
  618. mod = new Module();
  619. mod.Name = name;
  620. mod.Location = location;
  621. mod.Kind = ModuleKind.UnmanagedDynamicallyLinkedLibrary;
  622. }
  623. mod.HashValue = this.tables.GetBlob(files[j].HashValue);
  624. mod.ContainingAssembly = module.ContainingAssembly;
  625. modRefs[i].Module = mod;
  626. modules.Add(new ModuleReference(name, mod));
  627. goto nextModRef;
  628. }
  629. mod = new Module();
  630. mod.Name = name;
  631. mod.Kind = ModuleKind.UnmanagedDynamicallyLinkedLibrary;
  632. if (System.IO.File.Exists(location)) mod.Location = location;
  633. mod.ContainingAssembly = module.ContainingAssembly;
  634. modRefs[i].Module = mod;
  635. modules.Add(new ModuleReference(name, mod));
  636. nextModRef: ;
  637. }
  638. }
  639. private static string ReadSerString(MemoryCursor/*!*/ sigReader)
  640. {
  641. int n = sigReader.ReadCompressedInt();
  642. if (n < 0) return null;
  643. return sigReader.ReadUTF8(n);
  644. }
  645. private void AddFieldsToType(TypeNode/*!*/ type, FieldRow[]/*!*/ fieldDefs, FieldPtrRow[]/*!*/ fieldPtrs, int start, int end)
  646. {
  647. for (int i = start; i < end; i++)
  648. {
  649. int ii = i;
  650. if (fieldPtrs.Length > 0) ii = fieldPtrs[i - 1].Field;
  651. Field field = this.GetFieldFromDef(ii, type);
  652. if (field != null) type.Members.Add(field);
  653. }
  654. }
  655. private void GetUnderlyingTypeOfEnumNode(EnumNode /*!*/enumNode, FieldRow[]/*!*/ fieldDefs, FieldPtrRow[]/*!*/ fieldPtrs, int start, int end)
  656. {
  657. TypeNode underlyingType = null;
  658. for (int i = start; i < end; i++)
  659. {
  660. int ii = i;
  661. if (fieldPtrs.Length > 0) ii = fieldPtrs[i - 1].Field;
  662. FieldRow fld = fieldDefs[ii - 1];
  663. if (fld.Field != null && !fld.Field.IsStatic)
  664. {
  665. underlyingType = fld.Field.Type;
  666. break;
  667. }
  668. FieldFlags fieldFlags = (FieldFlags)fld.Flags;
  669. if ((fieldFlags & FieldFlags.Static) == 0)
  670. {
  671. this.tables.GetSignatureLength(fld.Signature);
  672. MemoryCursor sigReader = this.tables.GetNewCursor();
  673. GetAndCheckSignatureToken(6, sigReader);
  674. underlyingType = this.ParseTypeSignature(sigReader);
  675. break;
  676. }
  677. }
  678. enumNode.underlyingType = underlyingType;
  679. }
  680. private void AddMethodsToType(TypeNode/*!*/ type, MethodPtrRow[]/*!*/ methodPtrs, int start, int end)
  681. //^ requires type.members != null;
  682. {
  683. for (int i = start; i < end; i++)
  684. {
  685. int ii = i;
  686. if (methodPtrs.Length > 0) ii = methodPtrs[i - 1].Method;
  687. Method method = this.GetMethodFromDef(ii, type);
  688. if (method != null && ((method.Flags & MethodFlags.RTSpecialName) == 0 || method.Name.UniqueIdKey != StandardIds._Deleted.UniqueIdKey))
  689. type.members.Add(method);
  690. }
  691. }
  692. private void AddMoreStuffToParameters(Method method, ParameterList parameters, int start, int end)
  693. {
  694. ParamRow[] pars = this.tables.ParamTable;
  695. int n = parameters == null ? 0 : parameters.Count;
  696. for (int i = start; i < end; i++)
  697. {
  698. ParamRow pr = pars[i - 1];
  699. if (pr.Sequence == 0 && method != null)
  700. {
  701. //The parameter entry with sequence 0 is used as a target for custom attributes that apply to the return value
  702. method.ReturnAttributes = this.GetCustomAttributesFor((i << 5) | 4);
  703. if ((pr.Flags & (int)ParameterFlags.HasFieldMarshal) != 0)
  704. method.ReturnTypeMarshallingInformation = this.GetMarshallingInformation((i << 1) | 1);
  705. this.AddMoreStuffToParameters(null, parameters, start + 1, end);
  706. return;
  707. }
  708. int j = pr.Sequence;
  709. if (j < 1 || j > n) continue; //Bad metadata, ignore
  710. if (parameters == null) continue;
  711. Parameter par = parameters[j - 1];
  712. par.Attributes = this.GetCustomAttributesFor((i << 5) | 4);
  713. par.Flags = (ParameterFlags)pr.Flags;
  714. if ((par.Flags & ParameterFlags.HasDefault) != 0)
  715. par.DefaultValue = this.GetLiteral((i << 2) | 1, par.Type);
  716. if ((par.Flags & ParameterFlags.HasFieldMarshal) != 0)
  717. par.MarshallingInformation = this.GetMarshallingInformation((i << 1) | 1);
  718. par.Name = tables.GetIdentifier(pr.Name);
  719. }
  720. }
  721. private void AddPropertiesToType(TypeNode/*!*/ type, PropertyRow[]/*!*/ propertyDefs, PropertyPtrRow[]/*!*/ propertyPtrs, int start, int end)
  722. //requires type.members != null;
  723. {
  724. MetadataReader tables = this.tables;
  725. for (int i = start; i < end; i++)
  726. {
  727. int ii = i;
  728. if (propertyPtrs.Length > 0) ii = propertyPtrs[i - 1].Property;
  729. PropertyRow prop = propertyDefs[ii - 1];
  730. Property property = new Property();
  731. property.Attributes = this.GetCustomAttributesFor((ii << 5) | 9);
  732. property.DeclaringType = type;
  733. property.Flags = (PropertyFlags)prop.Flags;
  734. property.Name = tables.GetIdentifier(prop.Name);
  735. if ((property.Flags & PropertyFlags.RTSpecialName) == 0 || property.Name.UniqueIdKey != StandardIds._Deleted.UniqueIdKey)
  736. {
  737. this.AddMethodsToProperty(ii, property);
  738. type.members.Add(property);
  739. }
  740. //REVIEW: the signature seems to be redundant. Is there any point in retrieving it?
  741. }
  742. }
  743. private void AddMethodsToProperty(int propIndex, Property/*!*/ property)
  744. {
  745. int codedPropIndex = (propIndex << 1) | 1;
  746. MetadataReader tables = this.tables;
  747. MethodRow[] methods = tables.MethodTable;
  748. MethodSemanticsRow[] methodSemantics = tables.MethodSemanticsTable;
  749. int i = 0, n = methodSemantics.Length, j = n - 1;
  750. bool sorted = (this.sortedTablesMask >> (int)TableIndices.MethodSemantics) % 2 == 1;
  751. if (sorted)
  752. {
  753. while (i < j)
  754. {
  755. int k = (i + j) / 2;
  756. if (methodSemantics[k].Association < codedPropIndex)
  757. i = k + 1;
  758. else
  759. j = k;
  760. }
  761. while (i > 0 && methodSemantics[i - 1].Association == codedPropIndex) i--;
  762. }
  763. for (; i < n; i++)
  764. {
  765. MethodSemanticsRow meth = methodSemantics[i];
  766. Method propertyMethod = methods[meth.Method - 1].Method;
  767. if (propertyMethod == null) continue;
  768. if (meth.Association == codedPropIndex)
  769. {
  770. propertyMethod.DeclaringMember = property;
  771. switch (meth.Semantics)
  772. {
  773. case 0x0001: property.Setter = propertyMethod; break;
  774. case 0x0002: property.Getter = propertyMethod; break;
  775. default:
  776. if (property.OtherMethods == null) property.OtherMethods = new MethodList();
  777. property.OtherMethods.Add(propertyMethod); break;
  778. }
  779. }
  780. else if (sorted)
  781. break;
  782. }
  783. }
  784. private void AddEventsToType(TypeNode/*!*/ type, EventRow[]/*!*/ eventDefs, EventPtrRow[]/*!*/ eventPtrs, int start, int end)
  785. {
  786. MetadataReader tables = this.tables;
  787. for (int i = start; i < end; i++)
  788. {
  789. int ii = i;
  790. if (eventPtrs.Length > 0) ii = eventPtrs[i].Event;
  791. EventRow ev = eventDefs[ii - 1];
  792. Event evnt = new Event();
  793. evnt.Attributes = this.GetCustomAttributesFor((ii << 5) | 10);
  794. evnt.DeclaringType = type;
  795. evnt.Flags = (EventFlags)ev.Flags;
  796. evnt.HandlerType = this.DecodeAndGetTypeDefOrRefOrSpec(ev.EventType);
  797. evnt.Name = tables.GetIdentifier(ev.Name);
  798. if ((evnt.Flags & EventFlags.RTSpecialName) == 0 || evnt.Name.UniqueIdKey != StandardIds._Deleted.UniqueIdKey)
  799. {
  800. this.AddMethodsToEvent(ii, evnt);
  801. type.Members.Add(evnt);
  802. }
  803. }
  804. }
  805. private void AddMethodsToEvent(int eventIndex, Event/*!*/ evnt)
  806. {
  807. int codedEventIndex = eventIndex << 1;
  808. MetadataReader tables = this.tables;
  809. MethodRow[] methods = tables.MethodTable;
  810. MethodSemanticsRow[] methodSemantics = tables.MethodSemanticsTable;
  811. int i = 0, n = methodSemantics.Length, j = n - 1;
  812. bool sorted = (this.sortedTablesMask >> (int)TableIndices.MethodSemantics) % 2 == 1;
  813. if (sorted)
  814. {
  815. while (i < j)
  816. {
  817. int k = (i + j) / 2;
  818. if (methodSemantics[k].Association < codedEventIndex)
  819. i = k + 1;
  820. else
  821. j = k;
  822. }
  823. while (i > 0 && methodSemantics[i - 1].Association == codedEventIndex) i--;
  824. }
  825. MethodFlags handlerFlags = (MethodFlags)0;
  826. for (; i < n; i++)
  827. {
  828. MethodSemanticsRow meth = methodSemantics[i];
  829. Method eventMethod = methods[meth.Method - 1].Method;
  830. if (eventMethod == null) continue;
  831. if (meth.Association == codedEventIndex)
  832. {
  833. eventMethod.DeclaringMember = evnt;
  834. switch (meth.Semantics)
  835. {
  836. case 0x0008: evnt.HandlerAdder = eventMethod; handlerFlags = eventMethod.Flags; break;
  837. case 0x0010: evnt.HandlerRemover = eventMethod; handlerFlags = eventMethod.Flags; break;
  838. case 0x0020: evnt.HandlerCaller = eventMethod; break;
  839. default:
  840. if (evnt.OtherMethods == null) evnt.OtherMethods = new MethodList();
  841. evnt.OtherMethods.Add(eventMethod); break;
  842. }
  843. }
  844. else if (sorted)
  845. break;
  846. }
  847. evnt.HandlerFlags = handlerFlags;
  848. }
  849. private bool TypeDefOrRefOrSpecIsClass(int codedIndex)
  850. {
  851. if (codedIndex == 0) return false;
  852. switch (codedIndex & 0x3)
  853. {
  854. case 0x00: return this.TypeDefIsClass(codedIndex >> 2);
  855. case 0x01: TypeNode t = this.GetTypeFromRef(codedIndex >> 2); return t is Class;
  856. case 0x02: return this.TypeSpecIsClass(codedIndex >> 2);
  857. }
  858. throw new InvalidMetadataException(ExceptionStrings.BadTypeDefOrRef);
  859. }
  860. private bool TypeDefOrRefOrSpecIsClassButNotValueTypeBaseClass(int codedIndex)
  861. {
  862. if (codedIndex == 0) return false;
  863. switch (codedIndex & 0x3)
  864. {
  865. case 0x00: return this.TypeDefIsClassButNotValueTypeBaseClass(codedIndex >> 2);
  866. case 0x01:
  867. TypeNode t = this.GetTypeFromRef(codedIndex >> 2);
  868. return t != CoreSystemTypes.ValueType && t != CoreSystemTypes.Enum && t is Class;
  869. case 0x02: return this.TypeSpecIsClass(codedIndex >> 2);
  870. }
  871. throw new InvalidMetadataException(ExceptionStrings.BadTypeDefOrRef);
  872. }
  873. private TypeNode DecodeAndGetTypeDefOrRefOrSpec(int codedIndex)
  874. {
  875. if (codedIndex == 0) return null;
  876. switch (codedIndex & 0x3)
  877. {
  878. case 0x00: return this.GetTypeFromDef(codedIndex >> 2);
  879. case 0x01: return this.GetTypeFromRef(codedIndex >> 2);
  880. case 0x02: return this.GetTypeFromSpec(codedIndex >> 2);
  881. }
  882. throw new InvalidMetadataException(ExceptionStrings.BadTypeDefOrRef);
  883. }
  884. private TypeNode DecodeAndGetTypeDefOrRefOrSpec(int codedIndex, bool expectStruct)
  885. {
  886. if (codedIndex == 0) return null;
  887. switch (codedIndex & 0x3)
  888. {
  889. case 0x00: return this.GetTypeFromDef(codedIndex >> 2);
  890. case 0x01: return this.GetTypeFromRef(codedIndex >> 2, expectStruct);
  891. case 0x02: return this.GetTypeFromSpec(codedIndex >> 2);
  892. }
  893. throw new InvalidMetadataException(ExceptionStrings.BadTypeDefOrRef);
  894. }
  895. private TypeNode GetTypeIfNotGenericInstance(int codedIndex)
  896. {
  897. if (codedIndex == 0) return null;
  898. switch (codedIndex & 0x3)
  899. {
  900. case 0x00: return this.GetTypeFromDef(codedIndex >> 2);
  901. case 0x01: return this.GetTypeFromRef(codedIndex >> 2, false);
  902. }
  903. return null;
  904. }
  905. internal AssemblyNode/*!*/ GetAssemblyFromReference(AssemblyReference/*!*/ assemblyReference)
  906. {
  907. lock (this)
  908. {
  909. if (SystemAssemblyLocation.ParsedAssembly != null && (assemblyReference.Name == "mscorlib" || assembl

Large files files are truncated, but you can click here to view the full file