From 55640f0c2bc8a49ba385f376db6bdbaf64cc795b Mon Sep 17 00:00:00 2001 From: Max Katz Date: Mon, 3 Apr 2023 19:35:32 -0400 Subject: [PATCH] (hack?) Fix stackoverflow --- .../Controls/ResourceDictionary.cs | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/Avalonia.Base/Controls/ResourceDictionary.cs b/src/Avalonia.Base/Controls/ResourceDictionary.cs index 5123803f6e..878797d9b6 100644 --- a/src/Avalonia.Base/Controls/ResourceDictionary.cs +++ b/src/Avalonia.Base/Controls/ResourceDictionary.cs @@ -15,6 +15,7 @@ namespace Avalonia.Controls /// public class ResourceDictionary : IResourceDictionary { + private DeferredItem? s_lastDeferredItem; private Dictionary? _inner; private IResourceHost? _owner; private AvaloniaList? _mergedDictionaries; @@ -241,12 +242,27 @@ namespace Avalonia.Controls { if (value is DeferredItem deffered) { - _inner[key] = value = deffered.Factory(null) switch + // Avoid simple reentrancy, which could commonly occur on redefining the resource. + if (s_lastDeferredItem == deffered) { - ITemplateResult t => t.Result, - object v => v, - _ => null, - }; + value = null; + return false; + } + + try + { + s_lastDeferredItem = deffered; + _inner[key] = value = deffered.Factory(null) switch + { + ITemplateResult t => t.Result, + { } v => v, + _ => null, + }; + } + finally + { + s_lastDeferredItem = null; + } } return true; }