Пример #1
0
        /// <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;
        }
Пример #2
0
        /// <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);
        }