From 048f41244f6b2c7f95ac5bf75be2b16f42b99169 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sun, 15 May 2022 01:54:01 -0400 Subject: reduce performance impact of deprecation warnings Creating a stack is *very* slow, so it should be avoided if possible until after the duplicate-warning check. --- src/SMAPI/Framework/ContentManagers/GameContentManager.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'src/SMAPI/Framework/ContentManagers') diff --git a/src/SMAPI/Framework/ContentManagers/GameContentManager.cs b/src/SMAPI/Framework/ContentManagers/GameContentManager.cs index 2aa50542..1c603f85 100644 --- a/src/SMAPI/Framework/ContentManagers/GameContentManager.cs +++ b/src/SMAPI/Framework/ContentManagers/GameContentManager.cs @@ -177,6 +177,7 @@ namespace StardewModdingAPI.Framework.ContentManagers // fetch asset from loader IModMetadata mod = loader.Mod; T data; + Context.HeuristicModsRunningCode.Push(loader.Mod); try { data = (T)loader.GetData(info); @@ -187,6 +188,10 @@ namespace StardewModdingAPI.Framework.ContentManagers mod.LogAsMod($"Mod crashed when loading asset '{info.Name}'{this.GetOnBehalfOfLabel(loader.OnBehalfOf)}. SMAPI will use the default asset instead. Error details:\n{ex.GetLogSummary()}", LogLevel.Error); return null; } + finally + { + Context.HeuristicModsRunningCode.TryPop(out _); + } // return matched asset return this.TryFixAndValidateLoadedAsset(info, data, loader) @@ -229,6 +234,7 @@ namespace StardewModdingAPI.Framework.ContentManagers // try edit object prevAsset = asset.Data; + Context.HeuristicModsRunningCode.Push(editor.Mod); try { editor.ApplyEdit(asset); @@ -238,9 +244,13 @@ namespace StardewModdingAPI.Framework.ContentManagers { mod.LogAsMod($"Mod crashed when editing asset '{info.Name}'{this.GetOnBehalfOfLabel(editor.OnBehalfOf)}, which may cause errors in-game. Error details:\n{ex.GetLogSummary()}", LogLevel.Error); } + finally + { + Context.HeuristicModsRunningCode.TryPop(out _); + } // validate edit - // ReSharper disable once ConditionIsAlwaysTrueOrFalse -- it's only guaranteed non-null after this method + // ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract -- it's only guaranteed non-null after this method if (asset.Data == null) { mod.LogAsMod($"Mod incorrectly set asset '{info.Name}'{this.GetOnBehalfOfLabel(editor.OnBehalfOf)} to a null value; ignoring override.", LogLevel.Warn); -- cgit