Skip to content

Commit 88e29fc

Browse files
committed
Use ref struct as disposable instance to avoid heap allocation in SkipTakeRewriterState.CreateScope method
1 parent 71b7039 commit 88e29fc

File tree

1 file changed

+17
-6
lines changed

1 file changed

+17
-6
lines changed

Orm/Xtensive.Orm/Orm/Rse/Transformation/Internals/SkipTakeRewriterState.cs

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
// Created: 2010.01.21
66

77
using System;
8-
using Xtensive.Core;
9-
108

119
namespace Xtensive.Orm.Rse.Transformation
1210
{
@@ -56,12 +54,25 @@ private static Func<int> PositiveSelector(Func<int> valueSelector)
5654
};
5755
}
5856

59-
public IDisposable CreateScope()
57+
internal readonly ref struct SkipTakeRewriterScope
58+
{
59+
private readonly SkipTakeRewriter rewriter;
60+
private readonly SkipTakeRewriterState prevState;
61+
62+
public void Dispose() => rewriter.State = prevState;
63+
64+
public SkipTakeRewriterScope(SkipTakeRewriter rewriter, SkipTakeRewriterState prevState)
65+
{
66+
this.rewriter = rewriter;
67+
this.prevState = prevState;
68+
}
69+
}
70+
71+
public SkipTakeRewriterScope CreateScope()
6072
{
6173
var currentState = rewriter.State;
62-
var newState = new SkipTakeRewriterState(currentState);
63-
rewriter.State = newState;
64-
return new Disposable(_ => rewriter.State = currentState);
74+
rewriter.State = new SkipTakeRewriterState(currentState);
75+
return new SkipTakeRewriterScope(rewriter, currentState);
6576
}
6677

6778

0 commit comments

Comments
 (0)