From 8c4edc27656b7b60b4036a158c30f4fc1caccdd7 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Wed, 3 Jun 2020 18:52:16 -0400 Subject: [PATCH] tweak new code, add release note (#718) --- docs/release-notes.md | 1 + .../ModLoading/Framework/RecursiveRewriter.cs | 31 ++++++++++--------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index dcb4a485..b2ef5a8d 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -6,6 +6,7 @@ * Mod warnings are now listed alphabetically. * MacOS files starting with `._` are now ignored and can no longer cause skipped mods. * Simplified paranoid warning logs and reduced their log level. + * Reduced startup time when loading mod DLLs (thanks to ZaneYork!). * Fixed `BadImageFormatException` error detection. * Fixed black maps on Android for mods which use `.tmx` files. diff --git a/src/SMAPI/Framework/ModLoading/Framework/RecursiveRewriter.cs b/src/SMAPI/Framework/ModLoading/Framework/RecursiveRewriter.cs index 579c3a08..c4e6013e 100644 --- a/src/SMAPI/Framework/ModLoading/Framework/RecursiveRewriter.cs +++ b/src/SMAPI/Framework/ModLoading/Framework/RecursiveRewriter.cs @@ -57,16 +57,18 @@ namespace StardewModdingAPI.Framework.ModLoading.Framework /// Returns whether the module was modified. public bool RewriteModule() { - Tuple aggregateResult = this.Module.GetTypes() - .AsParallel().WithExecutionMode(ParallelExecutionMode.ForceParallelism) + // rewrite each type in the assembly, tracking whether any type was rewritten (Item1) + // and any exception that occurred during rewriting (Item2). + Tuple result = this.Module + .GetTypes() + .Where(type => type.BaseType != null) // skip special types like + .AsParallel() + .WithExecutionMode(ParallelExecutionMode.ForceParallelism) .Select(type => { + bool anyRewritten = false; try { - bool anyRewritten = false; - if (type.BaseType == null) - return new Tuple(anyRewritten, null); // special type like - anyRewritten |= this.RewriteCustomAttributes(type.CustomAttributes); anyRewritten |= this.RewriteGenericParameters(type.GenericParameters); @@ -112,19 +114,20 @@ namespace StardewModdingAPI.Framework.ModLoading.Framework } } - return new Tuple(anyRewritten, null); + return Tuple.Create(anyRewritten, null as Exception); } catch (Exception e) { - return new Tuple(false, e.InnerException ?? e); + return Tuple.Create(anyRewritten, e); } }) - .Aggregate((tupleA, tupleB) => new Tuple(tupleA.Item1 | tupleB.Item1, tupleA.Item2 ?? tupleB.Item2)); // Aggregate result and exception - if (aggregateResult.Item2 != null) - { - throw aggregateResult.Item2; // rethrow inner Exception - } - return aggregateResult.Item1; + .Aggregate((a, b) => Tuple.Create(a.Item1 || b.Item1, a.Item2 ?? b.Item2)); + + bool rewritten = result.Item1; + Exception exception = result.Item2; + return exception == null + ? rewritten + : throw exception; }