Skip to content

Commit 1c5553e

Browse files
Ensure custom pool policies corrently use default values when unspecified
1 parent 8200f37 commit 1c5553e

File tree

11 files changed

+36
-14
lines changed

11 files changed

+36
-14
lines changed

src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/Optional`1.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ public readonly struct Optional<T>(T value)
99

1010
public T Value { get; } = value;
1111

12+
public T GetValueOrDefault(T defaultValue)
13+
=> HasValue ? Value : defaultValue;
14+
1215
public static implicit operator Optional<T>(T value)
1316
=> new(value);
1417

src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/ArrayBuilderPool`1.Policy.cs

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,36 @@ internal partial class ArrayBuilderPool<T>
99
{
1010
private sealed class Policy : PooledObjectPolicy
1111
{
12-
public static readonly Policy Default = new(DefaultMaximumObjectSize);
12+
// This is the default initial capacity for ImmutableArray<T>.Builder.
13+
private const int DefaultInitialCapacity = 8;
1314

15+
public static readonly Policy Default = new(DefaultInitialCapacity, DefaultMaximumObjectSize);
16+
17+
private readonly int _initialCapacity;
1418
private readonly int _maximumObjectSize;
1519

16-
private Policy(int maximumObjectSize)
20+
private Policy(int initialCapacity, int maximumObjectSize)
1721
{
22+
ArgHelper.ThrowIfNegative(initialCapacity);
23+
ArgHelper.ThrowIfNegative(maximumObjectSize);
24+
25+
_initialCapacity = initialCapacity;
1826
_maximumObjectSize = maximumObjectSize;
1927
}
2028

21-
public static Policy Create(Optional<int> maximumObjectSize = default)
29+
public static Policy Create(
30+
Optional<int> initialCapacity = default,
31+
Optional<int> maximumObjectSize = default)
2232
{
23-
if (!maximumObjectSize.HasValue || maximumObjectSize.Value == Default._maximumObjectSize)
33+
if ((!initialCapacity.HasValue || initialCapacity.Value == Default._initialCapacity) &&
34+
(!maximumObjectSize.HasValue || maximumObjectSize.Value == Default._maximumObjectSize))
2435
{
2536
return Default;
2637
}
2738

28-
return new(maximumObjectSize.Value);
39+
return new(
40+
initialCapacity.GetValueOrDefault(DefaultInitialCapacity),
41+
maximumObjectSize.GetValueOrDefault(DefaultMaximumObjectSize));
2942
}
3043

3144
public override ImmutableArray<T>.Builder Create()

src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/ArrayBuilderPool`1.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ private ArrayBuilderPool(PooledObjectPolicy policy, Optional<int> poolSize)
2323
}
2424

2525
public static ArrayBuilderPool<T> Create(
26+
Optional<int> initialCapacity = default,
2627
Optional<int> maximumObjectSize = default,
2728
Optional<int> poolSize = default)
28-
=> new(Policy.Create(maximumObjectSize), poolSize);
29+
=> new(Policy.Create(initialCapacity, maximumObjectSize), poolSize);
2930

3031
public static ArrayBuilderPool<T> Create(PooledObjectPolicy policy, Optional<int> poolSize = default)
3132
=> new(policy, poolSize);

src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/DictionaryBuilderPool`2.Policy.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public static Policy Create(Optional<IEqualityComparer<TKey>?> keyComparer = def
2626
return Default;
2727
}
2828

29-
return new(keyComparer.Value);
29+
return new(keyComparer.GetValueOrDefault(null));
3030
}
3131

3232
public override ImmutableDictionary<TKey, TValue>.Builder Create()

src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/DictionaryPool`2.Policy.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ public static Policy Create(
3333
return Default;
3434
}
3535

36-
return new(comparer.Value, maximumObjectSize.Value);
36+
return new(
37+
comparer.GetValueOrDefault(null),
38+
maximumObjectSize.GetValueOrDefault(DefaultMaximumObjectSize));
3739
}
3840

3941
public override Dictionary<TKey, TValue> Create() => new(_comparer);

src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/HashSetPool`1.Policy.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ internal partial class HashSetPool<T>
99
{
1010
private sealed class Policy : PooledObjectPolicy
1111
{
12-
public static readonly Policy Default = new(comparer: null, DefaultMaximumObjectSize);
12+
public static readonly Policy Default = new(comparer: EqualityComparer<T>.Default, DefaultMaximumObjectSize);
1313

1414
public IEqualityComparer<T> Comparer { get; }
1515

@@ -33,7 +33,9 @@ public static Policy Create(
3333
return Default;
3434
}
3535

36-
return new(comparer.Value, maximumObjectSize.Value);
36+
return new(
37+
comparer.GetValueOrDefault(EqualityComparer<T>.Default) ?? EqualityComparer<T>.Default,
38+
maximumObjectSize.GetValueOrDefault(DefaultMaximumObjectSize));
3739
}
3840

3941
public override HashSet<T> Create() => new(Comparer);

src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/ListPool`1.Policy.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public static Policy Create(Optional<int> maximumObjectSize = default)
2525
return Default;
2626
}
2727

28-
return new(maximumObjectSize.Value);
28+
return new(maximumObjectSize.GetValueOrDefault(DefaultMaximumObjectSize));
2929
}
3030

3131
public override List<T> Create() => [];

src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/QueuePool`1.Policy.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public static Policy Create(Optional<int> maximumObjectSize = default)
2525
return Default;
2626
}
2727

28-
return new(maximumObjectSize.Value);
28+
return new(maximumObjectSize.GetValueOrDefault(DefaultMaximumObjectSize));
2929
}
3030

3131
public override Queue<T> Create() => new();

src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StackPool`1.Policy.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public static Policy Create(Optional<int> maximumObjectSize = default)
2525
return Default;
2626
}
2727

28-
return new(maximumObjectSize.Value);
28+
return new(maximumObjectSize.GetValueOrDefault(DefaultMaximumObjectSize));
2929
}
3030

3131
public override Stack<T> Create() => new();

src/Shared/Microsoft.AspNetCore.Razor.Utilities.Shared/PooledObjects/StringBuilderPool.Policy.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public static Policy Create(Optional<int> maximumObjectSize = default)
2525
return Default;
2626
}
2727

28-
return new(maximumObjectSize.Value);
28+
return new(maximumObjectSize.GetValueOrDefault(DefaultMaximumObjectSize));
2929
}
3030

3131
public override StringBuilder Create() => new();

0 commit comments

Comments
 (0)