diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiAlgorithm.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiAlgorithm.cs
index 3372d2be51..0bea4def28 100644
--- a/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiAlgorithm.cs
+++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiAlgorithm.cs
@@ -6,6 +6,7 @@ using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Threading;
+using Avalonia.Collections.Pooled;
using Avalonia.Utilities;
namespace Avalonia.Media.TextFormatting.Unicode
@@ -27,7 +28,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
/// as much as possible.
///
///
- internal sealed class BidiAlgorithm : IDisposable
+ internal struct BidiAlgorithm : IDisposable
{
///
/// The original BiDiClass classes as provided by the caller
@@ -97,7 +98,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
/// The status stack used during resolution of explicit
/// embedding and isolating runs
///
- private readonly Stack _statusStack = new Stack();
+ private readonly PooledStack _statusStack = new PooledStack();
///
/// Mapping used to virtually remove characters for rule X9
@@ -107,7 +108,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
///
/// Re-usable list of level runs
///
- private readonly List _levelRuns = new List();
+ private readonly PooledList _levelRuns = new PooledList();
///
/// Mapping for the current isolating sequence, built
@@ -118,7 +119,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
///
/// A stack of pending isolate openings used by FindIsolatePairs()
///
- private readonly Stack _pendingIsolateOpenings = new Stack();
+ private readonly PooledStack _pendingIsolateOpenings = new PooledStack();
///
/// The level of the isolating run currently being processed
@@ -174,17 +175,17 @@ namespace Avalonia.Media.TextFormatting.Unicode
/// Reusable list of pending opening brackets used by the
/// LocatePairedBrackets method
///
- private readonly List _pendingOpeningBrackets = new List();
+ private readonly PooledList _pendingOpeningBrackets = new PooledList();
///
/// Resolved list of paired brackets
///
- private readonly List _pairedBrackets = new List();
+ private readonly PooledList _pairedBrackets = new PooledList();
///
/// Initializes a new instance of the class.
///
- internal BidiAlgorithm()
+ public BidiAlgorithm()
{
}
@@ -1272,7 +1273,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
/// Locate all pair brackets in the current isolating run
///
/// A sorted list of BracketPairs
- private List LocatePairedBrackets()
+ private PooledList LocatePairedBrackets()
{
// Clear work collections
_pendingOpeningBrackets.Clear();
@@ -1719,8 +1720,13 @@ namespace Avalonia.Media.TextFormatting.Unicode
{
_workingClassesBuffer.Dispose();
_resolvedLevelsBuffer.Dispose();
+ _statusStack.Dispose();
_x9Map.Dispose();
+ _levelRuns.Dispose();
_isolatedRunMapping.Dispose();
+ _pendingIsolateOpenings.Dispose();
+ _pendingOpeningBrackets.Dispose();
+ _pairedBrackets.Dispose();
}
}
}
diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiData.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiData.cs
index 7e5b3a6620..644f7e9a8a 100644
--- a/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiData.cs
+++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiData.cs
@@ -11,7 +11,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
/// Represents a unicode string and all associated attributes
/// for each character required for the bidirectional Unicode algorithm
///
- internal class BidiData : IDisposable
+ internal struct BidiData : IDisposable
{
private ArrayBuilder _classes;
private ArrayBuilder _pairedBracketTypes;