uint GetMethodReferenceInternedId(IMethodReference methodReference) {
Contract.Requires(methodReference != null);
var genInstanceRef = methodReference as IGenericMethodInstanceReference;
if (genInstanceRef != null) return this.GetGenericMethodInstanceReferenceInternedKey(genInstanceRef);
uint containingTypeReferenceInternedId = this.GetTypeReferenceInternId(methodReference.ContainingType);
uint requiredParameterTypesInternedId = this.GetParameterTypeListInternId(methodReference.Parameters.GetEnumerator());
uint returnValueCustomModifiersInternedId = 0;
uint genericParameterCount = methodReference.GenericParameterCount;
if (methodReference.ReturnValueIsModified)
returnValueCustomModifiersInternedId = this.GetCustomModifierListInternId(methodReference.ReturnValueCustomModifiers.GetEnumerator());
uint returnTypeReferenceInternedId = this.GetTypeReferenceInternId(methodReference.Type);
MultiHashtable<SignatureStore>/*?*/ methods = this.MethodReferenceHashtable.Find(containingTypeReferenceInternedId);
if (methods == null) {
methods = new MultiHashtable<SignatureStore>();
this.MethodReferenceHashtable.Add(containingTypeReferenceInternedId, methods);
}
foreach (SignatureStore signatureStore in methods.GetValuesFor((uint)methodReference.Name.UniqueKey)) {
if (
signatureStore.CallingConvention == methodReference.CallingConvention
&& signatureStore.RequiredParameterListInternedId == requiredParameterTypesInternedId
&& signatureStore.ReturnValueCustomModifiersListInteredId == returnValueCustomModifiersInternedId
&& signatureStore.ReturnValueIsByRef == methodReference.ReturnValueIsByRef
&& signatureStore.ReturnTypeReferenceInternedId == returnTypeReferenceInternedId
&& signatureStore.GenericParameterCount == genericParameterCount
) {
return signatureStore.InternedId;
}
}
SignatureStore signatureStore1 = new SignatureStore(methodReference.CallingConvention, requiredParameterTypesInternedId,
0, methodReference.ReturnValueIsByRef, returnValueCustomModifiersInternedId, returnTypeReferenceInternedId, genericParameterCount,
this.CurrentMethodReferenceInternValue++);
methods.Add((uint)methodReference.Name.UniqueKey, signatureStore1);
return signatureStore1.InternedId;
}