/// <summary> /// Read a method that describes the type system to metadata mappings. /// </summary> private void ReadMetadataMethod(MethodIL methodOfMappings, Dictionary <MetadataType, int> typeMappings, Dictionary <MethodDesc, int> methodMappings, Dictionary <FieldDesc, int> fieldMappings, HashSet <ModuleDesc> metadataModules) { ILStreamReader il = new ILStreamReader(methodOfMappings); // structure is // REPEAT N TIMES // ldtoken type/method/field OR ldc.i4 0. If ldtoken instruction is replaced with a ldc.i4, skip this entry // ldc.i4 metadata value // pop // pop while (true) { if (il.TryReadRet()) // ret { break; } TypeSystemEntity tse; if (il.TryReadLdtokenAsTypeSystemEntity(out tse)) { int metadataTokenValue = il.ReadLdcI4(); il.ReadPop(); il.ReadPop(); if (tse is MetadataType) { MetadataType type = (MetadataType)tse; metadataModules.Add(type.Module); typeMappings.Add(type, metadataTokenValue); } else if (tse is MethodDesc) { MethodDesc method = (MethodDesc)tse; // Finalizers are called via a field on the EEType. They should not be reflectable. if (!method.IsFinalizer) { metadataModules.Add(((MetadataType)method.OwningType).Module); methodMappings.Add(method, metadataTokenValue); } } else if (tse is FieldDesc) { FieldDesc field = (FieldDesc)tse; metadataModules.Add(((MetadataType)field.OwningType).Module); fieldMappings.Add(field, metadataTokenValue); } } else { int deadLdtokenSignifier = il.ReadLdcI4(); Debug.Assert(deadLdtokenSignifier == 0); il.ReadLdcI4(); il.ReadPop(); il.ReadPop(); } } }
/// <summary> /// Read a method that describes the type system to metadata mappings. /// </summary> private void ReadMetadataMethod(MethodIL methodOfMappings, out List <MetadataMapping <MetadataType> > typeMappings, out List <MetadataMapping <MethodDesc> > methodMappings, out List <MetadataMapping <FieldDesc> > fieldMappings, ref HashSet <ModuleDesc> metadataModules) { typeMappings = new List <MetadataMapping <MetadataType> >(); methodMappings = new List <MetadataMapping <MethodDesc> >(); fieldMappings = new List <MetadataMapping <FieldDesc> >(); ILStreamReader il = new ILStreamReader(methodOfMappings); // structure is // REPEAT N TIMES // ldtoken type/method/field OR ldc.i4 0. If ldtoken instruction is replaced with a ldc.i4, skip this entry // ldc.i4 metadata value // pop // pop while (true) { if (il.TryReadRet()) // ret { break; } TypeSystemEntity tse; if (il.TryReadLdtokenAsTypeSystemEntity(out tse)) { int metadataTokenValue = il.ReadLdcI4(); il.ReadPop(); il.ReadPop(); if (tse is MetadataType) { MetadataType type = (MetadataType)tse; metadataModules.Add(type.Module); typeMappings.Add(new MetadataMapping <MetadataType>(type, metadataTokenValue)); } else if (tse is MethodDesc) { MethodDesc method = (MethodDesc)tse; metadataModules.Add(((MetadataType)method.OwningType).Module); methodMappings.Add(new MetadataMapping <MethodDesc>(method, metadataTokenValue)); } else if (tse is FieldDesc) { FieldDesc field = (FieldDesc)tse; metadataModules.Add(((MetadataType)field.OwningType).Module); fieldMappings.Add(new MetadataMapping <FieldDesc>(field, metadataTokenValue)); } } else { int deadLdtokenSignifier = il.ReadLdcI4(); Debug.Assert(deadLdtokenSignifier == 0); il.ReadLdcI4(); il.ReadPop(); il.ReadPop(); } } }