/symbols/pdb/Mono.Cecil.Pdb/PdbHelper.cs

http://github.com/jbevain/cecil · C# · 127 lines · 87 code · 31 blank · 9 comment · 8 complexity · bb0f161c22e455ecd608a8c45b874fd6 MD5 · raw file

  1. //
  2. // Author:
  3. // Jb Evain (jbevain@gmail.com)
  4. //
  5. // Copyright (c) 2008 - 2015 Jb Evain
  6. // Copyright (c) 2008 - 2011 Novell, Inc.
  7. //
  8. // Licensed under the MIT/X11 license.
  9. //
  10. using System;
  11. using System.IO;
  12. using Mono.Cecil.Cil;
  13. namespace Mono.Cecil.Pdb {
  14. public sealed class NativePdbReaderProvider : ISymbolReaderProvider {
  15. public ISymbolReader GetSymbolReader (ModuleDefinition module, string fileName)
  16. {
  17. Mixin.CheckModule (module);
  18. Mixin.CheckFileName (fileName);
  19. return new NativePdbReader (Disposable.Owned (File.OpenRead (Mixin.GetPdbFileName (fileName)) as Stream));
  20. }
  21. public ISymbolReader GetSymbolReader (ModuleDefinition module, Stream symbolStream)
  22. {
  23. Mixin.CheckModule (module);
  24. Mixin.CheckStream (symbolStream);
  25. return new NativePdbReader (Disposable.NotOwned (symbolStream));
  26. }
  27. }
  28. public sealed class PdbReaderProvider : ISymbolReaderProvider {
  29. public ISymbolReader GetSymbolReader (ModuleDefinition module, string fileName)
  30. {
  31. Mixin.CheckModule (module);
  32. if (module.HasDebugHeader) {
  33. var header = module.GetDebugHeader ();
  34. var entry = header.GetEmbeddedPortablePdbEntry ();
  35. if (entry != null)
  36. return new EmbeddedPortablePdbReaderProvider ().GetSymbolReader (module, fileName);
  37. }
  38. Mixin.CheckFileName (fileName);
  39. return Mixin.IsPortablePdb (Mixin.GetPdbFileName (fileName))
  40. ? new PortablePdbReaderProvider ().GetSymbolReader (module, fileName)
  41. : new NativePdbReaderProvider ().GetSymbolReader (module, fileName);
  42. }
  43. public ISymbolReader GetSymbolReader (ModuleDefinition module, Stream symbolStream)
  44. {
  45. Mixin.CheckModule (module);
  46. Mixin.CheckStream (symbolStream);
  47. Mixin.CheckReadSeek (symbolStream);
  48. return Mixin.IsPortablePdb (symbolStream)
  49. ? new PortablePdbReaderProvider ().GetSymbolReader (module, symbolStream)
  50. : new NativePdbReaderProvider ().GetSymbolReader (module, symbolStream);
  51. }
  52. }
  53. public sealed class NativePdbWriterProvider : ISymbolWriterProvider {
  54. public ISymbolWriter GetSymbolWriter (ModuleDefinition module, string fileName)
  55. {
  56. Mixin.CheckModule (module);
  57. Mixin.CheckFileName (fileName);
  58. return new NativePdbWriter (module, CreateWriter (module, Mixin.GetPdbFileName (fileName)));
  59. }
  60. static SymWriter CreateWriter (ModuleDefinition module, string pdb)
  61. {
  62. var writer = new SymWriter ();
  63. if (File.Exists (pdb))
  64. File.Delete (pdb);
  65. writer.Initialize (new ModuleMetadata (module), pdb, true);
  66. return writer;
  67. }
  68. public ISymbolWriter GetSymbolWriter (ModuleDefinition module, Stream symbolStream)
  69. {
  70. throw new NotImplementedException ();
  71. }
  72. }
  73. public sealed class PdbWriterProvider : ISymbolWriterProvider {
  74. public ISymbolWriter GetSymbolWriter (ModuleDefinition module, string fileName)
  75. {
  76. Mixin.CheckModule (module);
  77. Mixin.CheckFileName (fileName);
  78. if (HasPortablePdbSymbols (module))
  79. return new PortablePdbWriterProvider ().GetSymbolWriter (module, fileName);
  80. return new NativePdbWriterProvider ().GetSymbolWriter (module, fileName);
  81. }
  82. static bool HasPortablePdbSymbols (ModuleDefinition module)
  83. {
  84. return module.symbol_reader != null && module.symbol_reader is PortablePdbReader;
  85. }
  86. public ISymbolWriter GetSymbolWriter (ModuleDefinition module, Stream symbolStream)
  87. {
  88. Mixin.CheckModule (module);
  89. Mixin.CheckStream (symbolStream);
  90. Mixin.CheckReadSeek (symbolStream);
  91. if (HasPortablePdbSymbols (module))
  92. return new PortablePdbWriterProvider ().GetSymbolWriter (module, symbolStream);
  93. return new NativePdbWriterProvider ().GetSymbolWriter (module, symbolStream);
  94. }
  95. }
  96. }