Browse Source

(hack?) Fix stackoverflow

pull/10897/head
Max Katz 3 years ago
parent
commit
55640f0c2b
  1. 26
      src/Avalonia.Base/Controls/ResourceDictionary.cs

26
src/Avalonia.Base/Controls/ResourceDictionary.cs

@ -15,6 +15,7 @@ namespace Avalonia.Controls
/// </summary>
public class ResourceDictionary : IResourceDictionary
{
private DeferredItem? s_lastDeferredItem;
private Dictionary<object, object?>? _inner;
private IResourceHost? _owner;
private AvaloniaList<IResourceProvider>? _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;
}

Loading…
Cancel
Save