Browse Source

(hack?) Fix stackoverflow

pull/10897/head
Max Katz 4 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> /// </summary>
public class ResourceDictionary : IResourceDictionary public class ResourceDictionary : IResourceDictionary
{ {
private DeferredItem? s_lastDeferredItem;
private Dictionary<object, object?>? _inner; private Dictionary<object, object?>? _inner;
private IResourceHost? _owner; private IResourceHost? _owner;
private AvaloniaList<IResourceProvider>? _mergedDictionaries; private AvaloniaList<IResourceProvider>? _mergedDictionaries;
@ -241,12 +242,27 @@ namespace Avalonia.Controls
{ {
if (value is DeferredItem deffered) 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, value = null;
object v => v, return false;
_ => null, }
};
try
{
s_lastDeferredItem = deffered;
_inner[key] = value = deffered.Factory(null) switch
{
ITemplateResult t => t.Result,
{ } v => v,
_ => null,
};
}
finally
{
s_lastDeferredItem = null;
}
} }
return true; return true;
} }

Loading…
Cancel
Save