public void Resolve_WhenTypeDefOrRefCodedIndexAndStoresIn2Bytes_Resolves() { CodedIndexes codedIndexType = CodedIndexes.TypeDefOrRef; Dictionary <MetadataTables, int> rowsPerTable = new Dictionary <MetadataTables, int>(); rowsPerTable.Add(MetadataTables.TypeDef, 10); rowsPerTable.Add(MetadataTables.TypeRef, 15); uint indexToResolve = 0x11; // 0001 00[01] CodedIndexResolver resolver = new CodedIndexResolver(rowsPerTable); CodedIndex index = resolver.Resolve(codedIndexType, indexToResolve); Assert.AreEqual(MetadataTables.TypeRef, index.Table); Assert.AreEqual(4, index.Index.Value); }
private IndexDetails DetermineDetailsForIndexType(CodedIndexes codedIndex) { IndexDetails details = new IndexDetails(); details.Tables = new List <MetadataTables>(); switch (codedIndex) { case CodedIndexes.HasFieldMarshall: details.Tables.Add(MetadataTables.Field); details.Tables.Add(MetadataTables.Param); details.Mask = 0x01; break; case CodedIndexes.HasSemantics: details.Tables.Add(MetadataTables.Event); details.Tables.Add(MetadataTables.Property); details.Mask = 0x01; break; case CodedIndexes.MethodDefOrRef: details.Tables.Add(MetadataTables.MethodDef); details.Tables.Add(MetadataTables.MemberRef); details.Mask = 0x01; break; case CodedIndexes.MemberForwarded: details.Tables.Add(MetadataTables.Field); details.Tables.Add(MetadataTables.MethodDef); details.Mask = 0x01; break; case CodedIndexes.TypeOrMethodDef: details.Tables.Add(MetadataTables.TypeDef); details.Tables.Add(MetadataTables.MethodDef); details.Mask = 0x01; break; case CodedIndexes.TypeDefOrRef: details.Tables.Add(MetadataTables.TypeDef); details.Tables.Add(MetadataTables.TypeRef); details.Tables.Add(MetadataTables.TypeSpec); details.Mask = 0x03; break; case CodedIndexes.HasConstant: details.Tables.Add(MetadataTables.Field); details.Tables.Add(MetadataTables.Param); details.Tables.Add(MetadataTables.Property); details.Mask = 0x03; break; case CodedIndexes.HasDeclSecurity: details.Tables.Add(MetadataTables.TypeDef); details.Tables.Add(MetadataTables.MethodDef); details.Tables.Add(MetadataTables.Assembly); details.Mask = 0x03; break; case CodedIndexes.Implementation: details.Tables.Add(MetadataTables.File); details.Tables.Add(MetadataTables.AssemblyRef); details.Tables.Add(MetadataTables.ExportedType); details.Mask = 0x03; break; case CodedIndexes.ResolutionScope: details.Tables.Add(MetadataTables.Module); details.Tables.Add(MetadataTables.ModuleRef); details.Tables.Add(MetadataTables.AssemblyRef); details.Tables.Add(MetadataTables.TypeRef); details.Mask = 0x03; break; case CodedIndexes.MemberRefParent: details.Tables.Add(MetadataTables.TypeDef); details.Tables.Add(MetadataTables.TypeRef); details.Tables.Add(MetadataTables.ModuleRef); details.Tables.Add(MetadataTables.MethodDef); details.Tables.Add(MetadataTables.TypeSpec); details.Mask = 0x07; break; case CodedIndexes.CustomAttributeType: details.Tables.Add(MetadataTables.Unused1); details.Tables.Add(MetadataTables.Unused1); details.Tables.Add(MetadataTables.MethodDef); details.Tables.Add(MetadataTables.MemberRef); details.Tables.Add(MetadataTables.Unused1); details.Mask = 0x07; break; case CodedIndexes.HasCustomAttribute: details.Tables.Add(MetadataTables.MethodDef); details.Tables.Add(MetadataTables.Field); details.Tables.Add(MetadataTables.TypeRef); details.Tables.Add(MetadataTables.TypeDef); details.Tables.Add(MetadataTables.Param); details.Tables.Add(MetadataTables.InterfaceImpl); details.Tables.Add(MetadataTables.MemberRef); details.Tables.Add(MetadataTables.Module); details.Tables.Add(MetadataTables.DeclSecurity); details.Tables.Add(MetadataTables.Property); details.Tables.Add(MetadataTables.Event); details.Tables.Add(MetadataTables.StandAloneSig); details.Tables.Add(MetadataTables.ModuleRef); details.Tables.Add(MetadataTables.TypeSpec); details.Tables.Add(MetadataTables.Assembly); details.Tables.Add(MetadataTables.AssemblyRef); details.Tables.Add(MetadataTables.File); details.Tables.Add(MetadataTables.ExportedType); details.Tables.Add(MetadataTables.ManifestResource); details.Tables.Add(MetadataTables.GenericParam); details.Tables.Add(MetadataTables.GenericParamConstraint); details.Tables.Add(MetadataTables.MethodSpec); details.Mask = 0x1F; break; } details.BitsToRepresentTag = details.Mask == 1 ? (byte)1 : (byte)Math.Round(Math.Log(details.Mask, 2), MidpointRounding.AwayFromZero); return(details); }
public int GetSizeOfIndex(CodedIndexes indexType) { return(_detailsMap[indexType].RequiredNumberOfBytes()); }
public CodedIndex Resolve(CodedIndexes indexType, uint value) { return(DecodeIndex(value, _detailsMap[indexType])); }