Example #1
0
        private static unsafe int GetInstanceGCDescSize(TypeBuilderState state, EEType *pTemplateEEType, bool isValueType, bool isArray)
        {
            var gcBitfield = state.InstanceGCLayout;

            if (isArray)
            {
                if (state.IsArrayOfReferenceTypes)
                {
                    // Reference type arrays have a GC desc the size of 3 pointers
                    return(3 * sizeof(IntPtr));
                }
                else
                {
                    int series = 0;
                    if (gcBitfield != null)
                    {
                        series = CreateArrayGCDesc(gcBitfield, 1, true, null);
                    }

                    return(series > 0 ? (series + 2) * IntPtr.Size : 0);
                }
            }
            else if (gcBitfield != null)
            {
                int series = CreateGCDesc(gcBitfield, 0, isValueType, false, null);
                return(series > 0 ? (series * 2 + 1) * IntPtr.Size : 0);
            }
            else if (pTemplateEEType != null)
            {
                return(RuntimeAugments.GetGCDescSize(pTemplateEEType->ToRuntimeTypeHandle()));
            }
            else
            {
                return(0);
            }
        }