/// <summary> /// Marks a variable as free so it can be reused later. /// </summary> /// <param name="local">Local variable to free.</param> public void Free(LocalBuilder local) { if (local == null) { return; } List <LocalDesc> localList; if (!_pool.TryGetValue(local.LocalType, out localList)) { return; } LocalDesc descToFree = localList.FirstOrDefault(desc => desc.Local == local); descToFree.Reserved = false; }
/// <summary> /// In private storage searches a free local variable with /// the type specified. If no sutable variable is found it /// allocates new variable. The variable is marked as /// reserved and is returned. /// </summary> /// <param name="type">Demanded type of variable.</param> public LocalBuilder Reserve(Type type) { List <LocalDesc> localList; if (!_pool.TryGetValue(type, out localList)) { localList = new List <LocalDesc>(); _pool.Add(type, localList); } LocalDesc descToReserve = localList.FirstOrDefault(desc => !desc.Reserved); if (descToReserve == null) { descToReserve = new LocalDesc { Local = _il.DeclareLocal(type) }; localList.Add(descToReserve); } descToReserve.Reserved = true; return(descToReserve.Local); }