Exemplo n.º 1
0
        public static object luaM_realloc_ <T>(lua_State L, T[] old_block, int new_size)
        {
            int unmanaged_size = (int)GetUnmanagedSize(typeof(T));
            int old_size       = (old_block == null) ? 0 : old_block.Length;
            int osize          = old_size * unmanaged_size;
            int nsize          = new_size * unmanaged_size;

            T[] new_block = new T[new_size];
            for (int i = 0; i < Math.Min(old_size, new_size); i++)
            {
                new_block[i] = old_block[i];
            }
            for (int i = old_size; i < new_size; i++)
            {
                new_block[i] = (T)System.Activator.CreateInstance(typeof(T));
            }
            if (CanIndex(typeof(T)))
            {
                //FIXME:added
                T test = (T)System.Activator.CreateInstance(typeof(T));
                Debug.Assert(test is ArrayElement, String.Format("Need to derive type {0} from ArrayElement", typeof(T).ToString()));

                for (int i = 0; i < new_size; i++)
                {
                    ArrayElement elem = new_block[i] as ArrayElement;
                    //FIXME:???
                    //Debug.Assert(elem != null, String.Format("Need to derive type {0} from ArrayElement", typeof(T).ToString()));
                    if (elem != null)
                    {
                        elem.set_index(i);
                        elem.set_array(new_block);
                    }
                }
            }
            SubtractTotalBytes(L, osize);
            AddTotalBytes(L, nsize);
            return(new_block);
        }