summaryrefslogtreecommitdiff
path: root/src/SMAPI/Framework/ModLoading/Symbols
diff options
context:
space:
mode:
Diffstat (limited to 'src/SMAPI/Framework/ModLoading/Symbols')
-rw-r--r--src/SMAPI/Framework/ModLoading/Symbols/SymbolReader.cs51
-rw-r--r--src/SMAPI/Framework/ModLoading/Symbols/SymbolReaderProvider.cs35
-rw-r--r--src/SMAPI/Framework/ModLoading/Symbols/SymbolWriterProvider.cs22
3 files changed, 108 insertions, 0 deletions
diff --git a/src/SMAPI/Framework/ModLoading/Symbols/SymbolReader.cs b/src/SMAPI/Framework/ModLoading/Symbols/SymbolReader.cs
new file mode 100644
index 00000000..f1ae86a2
--- /dev/null
+++ b/src/SMAPI/Framework/ModLoading/Symbols/SymbolReader.cs
@@ -0,0 +1,51 @@
+using System;
+using System.IO;
+using Mono.Cecil;
+using Mono.Cecil.Cil;
+using Mono.Cecil.Pdb;
+
+namespace StardewModdingAPI.Framework.ModLoading.Symbols
+{
+ internal class SymbolReader : ISymbolReader
+ {
+ private ModuleDefinition Module;
+ private Stream Stream;
+ private ISymbolReader Using;
+
+ public SymbolReader( ModuleDefinition module, Stream stream )
+ {
+ this.Module = module;
+ this.Stream = stream;
+ this.Using = new NativePdbReaderProvider().GetSymbolReader( module, stream );
+ }
+
+ public void Dispose()
+ {
+ this.Using.Dispose();
+ }
+
+ public ISymbolWriterProvider GetWriterProvider()
+ {
+ return new PortablePdbWriterProvider();
+ }
+
+ public bool ProcessDebugHeader( ImageDebugHeader header )
+ {
+ try
+ {
+ return this.Using.ProcessDebugHeader( header );
+ }
+ catch (Exception e)
+ {
+ this.Using.Dispose();
+ this.Using = new PortablePdbReaderProvider().GetSymbolReader( this.Module, this.Stream );
+ return this.Using.ProcessDebugHeader( header );
+ }
+ }
+
+ public MethodDebugInformation Read( MethodDefinition method )
+ {
+ return this.Using.Read( method );
+ }
+ }
+}
diff --git a/src/SMAPI/Framework/ModLoading/Symbols/SymbolReaderProvider.cs b/src/SMAPI/Framework/ModLoading/Symbols/SymbolReaderProvider.cs
new file mode 100644
index 00000000..e2a6d21e
--- /dev/null
+++ b/src/SMAPI/Framework/ModLoading/Symbols/SymbolReaderProvider.cs
@@ -0,0 +1,35 @@
+using System.Collections.Generic;
+using System.IO;
+using Mono.Cecil;
+using Mono.Cecil.Cil;
+
+namespace StardewModdingAPI.Framework.ModLoading.Symbols
+{
+ internal class SymbolReaderProvider : ISymbolReaderProvider
+ {
+ private readonly ISymbolReaderProvider BaseProvider = new DefaultSymbolReaderProvider();
+
+ private readonly Dictionary<string, Stream> SymbolMapping = new Dictionary<string, Stream>();
+
+ public void AddSymbolMapping( string dllName, Stream symbolStream )
+ {
+ this.SymbolMapping.Add( dllName, symbolStream );
+ }
+
+ public ISymbolReader GetSymbolReader( ModuleDefinition module, string fileName )
+ {
+ if ( this.SymbolMapping.ContainsKey( module.Name ) )
+ return new SymbolReader( module, this.SymbolMapping[ module.Name ] );
+
+ return this.BaseProvider.GetSymbolReader( module, fileName );
+ }
+
+ public ISymbolReader GetSymbolReader( ModuleDefinition module, Stream symbolStream )
+ {
+ if ( this.SymbolMapping.ContainsKey( module.Name ) )
+ return new SymbolReader( module, this.SymbolMapping[ module.Name ] );
+
+ return this.BaseProvider.GetSymbolReader( module, symbolStream );
+ }
+ }
+}
diff --git a/src/SMAPI/Framework/ModLoading/Symbols/SymbolWriterProvider.cs b/src/SMAPI/Framework/ModLoading/Symbols/SymbolWriterProvider.cs
new file mode 100644
index 00000000..33e91db0
--- /dev/null
+++ b/src/SMAPI/Framework/ModLoading/Symbols/SymbolWriterProvider.cs
@@ -0,0 +1,22 @@
+using System.IO;
+using Mono.Cecil;
+using Mono.Cecil.Cil;
+
+namespace StardewModdingAPI.Framework.ModLoading.Symbols
+{
+ internal class SymbolWriterProvider : ISymbolWriterProvider
+ {
+ private readonly ISymbolWriterProvider BaseProvider = new DefaultSymbolWriterProvider();
+
+ public ISymbolWriter GetSymbolWriter( ModuleDefinition module, string fileName )
+ {
+ return this.BaseProvider.GetSymbolWriter( module, fileName );
+ }
+
+ public ISymbolWriter GetSymbolWriter( ModuleDefinition module, Stream symbolStream )
+ {
+ // Not implemented in default native pdb writer, so fallback to portable
+ return new PortablePdbWriterProvider().GetSymbolWriter( module, symbolStream );
+ }
+ }
+}