using Microsoft.CodeAnalysis.PooledObjects; namespace Microsoft.CodeAnalysis.CSharp.CodeGen; internal class LocalDefUseInfo { private readonly ObjectPool _pool; private static readonly ObjectPool s_poolInstance = CreatePool(); private ArrayBuilder _localDefs; public int StackAtDeclaration { get; private set; } public ArrayBuilder LocalDefs { get { ArrayBuilder val = _localDefs; if (val == null) { val = (_localDefs = ArrayBuilder.GetInstance()); } return val; } } public bool CannotSchedule { get; private set; } public void ShouldNotSchedule() { CannotSchedule = true; } private LocalDefUseInfo(ObjectPool pool) { _pool = pool; } public void Free() { if (_localDefs != null) { _localDefs.Free(); _localDefs = null; } _pool?.Free(this); } public static ObjectPool CreatePool() { ObjectPool pool = null; pool = new ObjectPool((Factory)(() => new LocalDefUseInfo(pool)), 128, true); return pool; } public static LocalDefUseInfo GetInstance(int stackAtDeclaration) { LocalDefUseInfo localDefUseInfo = s_poolInstance.Allocate(); localDefUseInfo.StackAtDeclaration = stackAtDeclaration; localDefUseInfo.CannotSchedule = false; return localDefUseInfo; } }