public static RuntimeTypeHandle CreateEEType(TypeDesc type, TypeBuilderState state) { Debug.Assert(type != null && state != null); EEType* pTemplateEEType = null; bool requireVtableSlotMapping = false; if (type is PointerType) { Debug.Assert(0 == state.NonGcDataSize); Debug.Assert(false == state.HasStaticConstructor); Debug.Assert(0 == state.GcDataSize); Debug.Assert(0 == state.ThreadStaticOffset); Debug.Assert(0 == state.NumSealedVTableEntries); Debug.Assert(IntPtr.Zero == state.GcStaticDesc); Debug.Assert(IntPtr.Zero == state.ThreadStaticDesc); RuntimeTypeHandle templateTypeHandle = typeof(void*).TypeHandle; pTemplateEEType = templateTypeHandle.ToEETypePtr(); } else if ((type is MetadataType) && (state.TemplateType == null || !state.TemplateType.RetrieveRuntimeTypeHandleIfPossible())) { requireVtableSlotMapping = true; pTemplateEEType = null; } else if (type.IsMdArray) { pTemplateEEType = typeof(object[,]).TypeHandle.ToEETypePtr(); requireVtableSlotMapping = false; } else { Debug.Assert(state.TemplateType != null && !state.TemplateType.RuntimeTypeHandle.IsNull()); requireVtableSlotMapping = state.TemplateType.IsCanonicalSubtype(CanonicalFormKind.Universal); RuntimeTypeHandle templateTypeHandle = state.TemplateType.RuntimeTypeHandle; pTemplateEEType = templateTypeHandle.ToEETypePtr(); } DefType typeAsDefType = type as DefType; // Use a checked typecast to 'ushort' for the arity to ensure its value never exceeds 65535 and cause integer // overflows later when computing size of memory blocks to allocate for the type and its GenericInstanceDescriptor structures int arity = checked((ushort)((typeAsDefType != null && typeAsDefType.HasInstantiation ? typeAsDefType.Instantiation.Length : 0))); CreateEETypeWorker(pTemplateEEType, (uint)type.GetHashCode(), arity, requireVtableSlotMapping, state); return state.HalfBakedRuntimeTypeHandle; }
public override int GetHashCode() { return(TypeHashingAlgorithms.ComputeMethodSignatureHashCode(_returnType.GetHashCode(), _parameters)); }