Skip to content

Commit c127e41

Browse files
committed
Fix memory leak
1 parent 5f4bf50 commit c127e41

2 files changed

Lines changed: 15 additions & 15 deletions

File tree

source/Handlebars/Compiler/Middlewares/ClosureExpressionMiddleware.cs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,25 @@ internal class ClosureExpressionMiddleware : IExpressionMiddleware
1111
{
1212
public Expression<T> Invoke<T>(Expression<T> expression) where T : Delegate
1313
{
14-
using var container = GenericObjectPool<List<ConstantExpression>>.Shared.Use();
15-
var constants = container.Value;
14+
var constants = new List<ConstantExpression>();
1615
var closureCollectorVisitor = new ClosureCollectorVisitor(constants);
1716
expression = (Expression<T>) closureCollectorVisitor.Visit(expression);
1817

1918
if (constants.Count == 0) return expression;
20-
21-
using var closureBuilder = ClosureBuilder.Create();
22-
for (var index = 0; index < constants.Count; index++)
19+
20+
KeyValuePair<ParameterExpression, Dictionary<Expression, Expression>> closureDefinition;
21+
Closure closure;
22+
using (var closureBuilder = ClosureBuilder.Create())
2323
{
24-
var value = constants[index];
25-
closureBuilder.Add(value);
24+
for (var index = 0; index < constants.Count; index++)
25+
{
26+
var value = constants[index];
27+
closureBuilder.Add(value);
28+
}
29+
30+
closureDefinition = closureBuilder.Build(out closure);
2631
}
2732

28-
var closureDefinition = closureBuilder.Build(out var closure);
29-
3033
var closureVisitor = new ClosureVisitor(closureDefinition);
3134
expression = (Expression<T>) closureVisitor.Visit(expression);
3235

source/Handlebars/Pools/GenericObjectPool.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
1-
using System;
2-
3-
namespace HandlebarsDotNet.Pools
1+
namespace HandlebarsDotNet.Pools
42
{
53
internal class GenericObjectPool<T> : InternalObjectPool<T, GenericObjectPool<T>.Policy>
64
where T : class, new()
75
{
8-
private static readonly Lazy<GenericObjectPool<T>> Instance = new(() => new GenericObjectPool<T>());
9-
public static GenericObjectPool<T> Shared => Instance.Value;
10-
6+
public static GenericObjectPool<T> Shared { get; } = new();
7+
118
private GenericObjectPool() : base(new Policy()) { }
129

1310
public readonly struct Policy : IInternalObjectPoolPolicy<T>

0 commit comments

Comments
 (0)