// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Diagnostics; using System.Text; namespace Jint.Pooling { /// /// Pooling of StringBuilder instances. /// internal static class StringBuilderPool { private static readonly ConcurrentObjectPool _pool; static StringBuilderPool() { _pool = new ConcurrentObjectPool(() => new StringBuilder()); } public static BuilderWrapper Rent() { var builder = _pool.Allocate(); Debug.Assert(builder.Length == 0); return new BuilderWrapper(builder, _pool); } internal readonly struct BuilderWrapper : IDisposable { public readonly StringBuilder Builder; private readonly ConcurrentObjectPool _pool; public BuilderWrapper(StringBuilder builder, ConcurrentObjectPool pool) { Builder = builder; _pool = pool; } public int Length => Builder.Length; public override string ToString() { return Builder.ToString(); } public void Dispose() { var builder = Builder; // do not store builders that are too large. if (builder.Capacity <= 1024 * 1024) { builder.Clear(); _pool.Free(builder); } else { _pool.ForgetTrackedObject(builder); } } } } }