using System.Runtime.CompilerServices; using Jint.Native; namespace Jint.Pooling; /// /// Cache reusable array instances as we allocate them a lot. /// internal sealed class JsValueArrayPool { private const int PoolSize = 15; private readonly ObjectPool _poolArray1; private readonly ObjectPool _poolArray2; private readonly ObjectPool _poolArray3; public JsValueArrayPool() { _poolArray1 = new ObjectPool(Factory1, PoolSize); _poolArray2 = new ObjectPool(Factory2, PoolSize); _poolArray3 = new ObjectPool(Factory3, PoolSize); } private static JsValue[] Factory1() { return new JsValue[1]; } private static JsValue[] Factory2() { return new JsValue[2]; } private static JsValue[] Factory3() { return new JsValue[3]; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public JsValue[] RentArray(int size) { if (size == 0) { return []; } if (size == 1) { return _poolArray1.Allocate(); } if (size == 2) { return _poolArray2.Allocate(); } if (size == 3) { return _poolArray3.Allocate(); } return new JsValue[size]; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ReturnArray(JsValue[] array) { if (array.Length == 1) { _poolArray1.Free(array); } else if (array.Length == 2) { _poolArray2.Free(array); } else if (array.Length == 3) { _poolArray3.Free(array); } } }