summaryrefslogtreecommitdiff
path: root/src/StardewModdingAPI/Framework
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <github@jplamondonw.com>2017-03-26 19:01:35 -0400
committerJesse Plamondon-Willard <github@jplamondonw.com>2017-03-26 19:01:35 -0400
commit85ed48809032fdbb8461ce4c34acfbe06f68652b (patch)
tree957c768ddcb8d3a7dc4928803aae775e9b632970 /src/StardewModdingAPI/Framework
parent23443721cd2cc5391510a6e65b4e6559037e5b5e (diff)
downloadSMAPI-85ed48809032fdbb8461ce4c34acfbe06f68652b.tar.gz
SMAPI-85ed48809032fdbb8461ce4c34acfbe06f68652b.tar.bz2
SMAPI-85ed48809032fdbb8461ce4c34acfbe06f68652b.zip
merge CIL finders & rewriters into one interface (#254)
Diffstat (limited to 'src/StardewModdingAPI/Framework')
-rw-r--r--src/StardewModdingAPI/Framework/AssemblyLoader.cs33
-rw-r--r--src/StardewModdingAPI/Framework/IncompatibleInstructionException.cs27
2 files changed, 15 insertions, 45 deletions
diff --git a/src/StardewModdingAPI/Framework/AssemblyLoader.cs b/src/StardewModdingAPI/Framework/AssemblyLoader.cs
index aee0bbb3..5d00c525 100644
--- a/src/StardewModdingAPI/Framework/AssemblyLoader.cs
+++ b/src/StardewModdingAPI/Framework/AssemblyLoader.cs
@@ -193,33 +193,30 @@ namespace StardewModdingAPI.Framework
this.ChangeTypeScope(type);
}
- // find incompatible instructions
+ // find (and optionally rewrite) incompatible instructions
bool anyRewritten = false;
- IInstructionFinder[] finders = Constants.GetIncompatibilityFinders().ToArray();
IInstructionRewriter[] rewriters = Constants.GetRewriters().ToArray();
foreach (MethodDefinition method in this.GetMethods(module))
{
ILProcessor cil = method.Body.GetILProcessor();
foreach (Instruction instruction in cil.Body.Instructions.ToArray())
{
- // throw exception if instruction is incompatible but can't be rewritten
- IInstructionFinder finder = finders.FirstOrDefault(p => p.IsMatch(instruction, platformChanged));
- if (finder != null)
- {
- if (!assumeCompatible)
- throw new IncompatibleInstructionException(finder.NounPhrase, $"Found an incompatible CIL instruction ({finder.NounPhrase}) while loading assembly {assembly.Name.Name}.");
- this.LogOnce(this.Monitor, loggedMessages, $"Found an incompatible CIL instruction ({finder.NounPhrase}) while loading assembly {assembly.Name.Name}, but SMAPI is configured to allow it anyway. The mod may crash or behave unexpectedly.", LogLevel.Warn);
- }
-
- // rewrite instruction if needed
foreach (IInstructionRewriter rewriter in rewriters)
{
- if (!rewriter.IsMatch(instruction, platformChanged))
- continue;
-
- this.LogOnce(this.Monitor, loggedMessages, $"Rewriting {assembly.Name.Name} to fix {rewriter.NounPhrase}...");
- rewriter.Rewrite(module, cil, instruction, this.AssemblyMap);
- anyRewritten = true;
+ try
+ {
+ if (rewriter.Rewrite(module, cil, instruction, this.AssemblyMap, platformChanged))
+ {
+ this.LogOnce(this.Monitor, loggedMessages, $"Rewrote {assembly.Name.Name} to fix {rewriter.NounPhrase}...");
+ anyRewritten = true;
+ }
+ }
+ catch (IncompatibleInstructionException)
+ {
+ if (!assumeCompatible)
+ throw new IncompatibleInstructionException(rewriter.NounPhrase, $"Found an incompatible CIL instruction ({rewriter.NounPhrase}) while loading assembly {assembly.Name.Name}.");
+ this.LogOnce(this.Monitor, loggedMessages, $"Found an incompatible CIL instruction ({rewriter.NounPhrase}) while loading assembly {assembly.Name.Name}, but SMAPI is configured to allow it anyway. The mod may crash or behave unexpectedly.", LogLevel.Warn);
+ }
}
}
}
diff --git a/src/StardewModdingAPI/Framework/IncompatibleInstructionException.cs b/src/StardewModdingAPI/Framework/IncompatibleInstructionException.cs
deleted file mode 100644
index affe2cb3..00000000
--- a/src/StardewModdingAPI/Framework/IncompatibleInstructionException.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-using System;
-
-namespace StardewModdingAPI.Framework
-{
- /// <summary>An exception raised when an incompatible instruction is found while loading a mod assembly.</summary>
- internal class IncompatibleInstructionException : Exception
- {
- /*********
- ** Accessors
- *********/
- /// <summary>A brief noun phrase which describes the incompatible instruction that was found.</summary>
- public string NounPhrase { get; }
-
-
- /*********
- ** Public methods
- *********/
- /// <summary>Construct an instance.</summary>
- /// <param name="nounPhrase">A brief noun phrase which describes the incompatible instruction that was found.</param>
- /// <param name="message">A message which describes the error.</param>
- public IncompatibleInstructionException(string nounPhrase, string message)
- : base(message)
- {
- this.NounPhrase = nounPhrase;
- }
- }
-}