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); } }