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);
        }
Пример #2
0
        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);
        }
Пример #3
0
 public int GetSizeOfIndex(CodedIndexes indexType)
 {
     return(_detailsMap[indexType].RequiredNumberOfBytes());
 }
Пример #4
0
 public CodedIndex Resolve(CodedIndexes indexType, uint value)
 {
     return(DecodeIndex(value, _detailsMap[indexType]));
 }