Esempio n. 1
0
        private int CalculateSelfSize()
        {
            string str = Object as string;

            if (str != null)
            {
                // string needs special handling
                int strSize = 3 * IntPtr.Size + 2;
                strSize += str.Length * sizeof(char);
                int pad = strSize % IntPtr.Size;
                if (pad != 0)
                {
                    strSize += IntPtr.Size - pad;
                }
                return(strSize);
            }


            if (Object.GetType().IsArray)
            {
                var elementType = Object.GetType().GetElementType();
                if (elementType != null && (elementType.IsValueType || elementType.IsPrimitive || elementType.IsEnum))
                {
                    // no overhead for array
                    return(0);
                }
                else
                {
                    int arraySize = GetTotalArrayLength((Array)Object);
                    return(IntPtr.Size * arraySize);
                }
            }

            return(TypeData.Get(Object.GetType()).Size);
        }
        private void CrawlRoot([NotNull] CrawlItem root, [NotNull] CrawlSettings crawlSettings)
        {
            var queue = new Queue <CrawlItem>();

            queue.Enqueue(root);

            while (queue.Count > 0)
            {
                var next     = queue.Dequeue();
                var type     = next.Object.GetType();
                var typeData = TypeData.Get(type);

                if (type.IsArray)
                {
                    QueueArrayElements(next, queue, next.Object, crawlSettings);
                }
                if (type == typeof(GameObject))
                {
                    QueueHierarchy(next, queue, next.Object, crawlSettings);
                }
                if (typeData.DynamicSizedFields != null)
                {
                    foreach (var field in typeData.DynamicSizedFields)
                    {
                        var v = field.GetValue(next.Object);
                        QueueValue(next, queue, v, field.Name, crawlSettings);
                    }
                }
            }

            root.UpdateSize(SizeMode);
        }