private static int GetCodedIndexSize(TablesHeap heap, CodedTokenId id, int [] rows) { int res = 0; switch (id) { case CodedTokenId.TypeDefOrRef : res = MDUtils.Max(rows [(int) TableId.TypeDef], rows [(int) TableId.TypeRef], rows [(int) TableId.TypeSpec]); res = res < (1 << (16 - 2)) ? 2 : 4; break; case CodedTokenId.HasConstant : res = MDUtils.Max(rows [(int) TableId.Field], rows [(int) TableId.Param], rows [(int) TableId.Property]); res = res < (1 << (16 - 2)) ? 2 : 4; break; case CodedTokenId.HasCustomAttribute : res = MDUtils.Max(rows [(int) TableId.Method], rows [(int) TableId.Field], rows [(int) TableId.TypeRef], rows [(int) TableId.TypeDef], rows [(int) TableId.Param], rows [(int) TableId.InterfaceImpl], rows [(int) TableId.MemberRef], rows [(int) TableId.Module], rows [(int) TableId.DeclSecurity], rows [(int) TableId.Property], rows [(int) TableId.Event], rows [(int) TableId.StandAloneSig], rows [(int) TableId.ModuleRef], rows [(int) TableId.TypeSpec], rows [(int) TableId.Assembly], rows [(int) TableId.AssemblyRef], rows [(int) TableId.File], rows [(int) TableId.ExportedType], rows [(int) TableId.ManifestResource]); res = res < (1 << (16 - 5)) ? 2 : 4; break; case CodedTokenId.HasFieldMarshal : res = MDUtils.Max(rows [(int) TableId.Field], rows [(int) TableId.Param]); res = res < (1 << (16 - 1)) ? 2 : 4; break; case CodedTokenId.HasDeclSecurity : res = MDUtils.Max(rows [(int) TableId.TypeDef], rows [(int) TableId.Method], rows [(int) TableId.Assembly]); res = res < (1 << (16 - 2)) ? 2 : 4; break; case CodedTokenId.MemberRefParent : res = MDUtils.Max(rows [(int) TableId.TypeDef], rows [(int) TableId.TypeRef], rows [(int) TableId.ModuleRef], rows [(int) TableId.Method], rows [(int) TableId.TypeSpec]); res = res < (1 << (16 - 3)) ? 2 : 4; break; case CodedTokenId.HasSemantics : res = MDUtils.Max(rows [(int) TableId.Event], rows [(int) TableId.Property]); res = res < (1 << (16 - 1)) ? 2 : 4; break; case CodedTokenId.MethodDefOrRef : res = MDUtils.Max(rows [(int) TableId.Method], rows [(int) TableId.MemberRef]); res = res < (1 << (16 - 1)) ? 2 : 4; break; case CodedTokenId.MemberForwarded : res = MDUtils.Max(rows [(int) TableId.Field], rows [(int) TableId.Method]); res = res < (1 << (16 - 1)) ? 2 : 4; break; case CodedTokenId.Implementation : res = MDUtils.Max(rows [(int) TableId.File], rows [(int) TableId.AssemblyRef], rows [(int) TableId.ExportedType]); res = res < (1 << (16 - 2)) ? 2 : 4; break; case CodedTokenId.CustomAttributeType : res = MDUtils.Max(rows [(int) TableId.TypeRef], rows [(int) TableId.TypeDef], rows [(int) TableId.Method], rows [(int) TableId.MemberRef], (heap.StringsIndexSize > 2 ? 1 << 17 : 1)); res = res < (1 << (16 - 3)) ? 2 : 4; break; case CodedTokenId.ResolutionScope : res = MDUtils.Max(rows [(int) TableId.Module], rows [(int) TableId.ModuleRef], rows [(int) TableId.AssemblyRef], rows [(int) TableId.TypeRef]); res = res < (1 << (16 - 2)) ? 2 : 4; break; default: break; } return res; }
/// <summary> /// </summary> /// <remarks> /// </remarks> public static MDToken DecodeToken(CodedTokenId id, int data) { MDToken res = new MDToken(); int tag; int rid; TokenType tok; switch (id) { case CodedTokenId.TypeDefOrRef : tag = data & 0x03; rid = (int) ((uint) data >> 2); switch (tag) { case 0 : tok = TokenType.TypeDef; break; case 1 : tok = TokenType.TypeRef; break; case 2 : tok = TokenType.TypeSpec; break; default : throw new BadMetaDataException("Invalid coded token for TypeDefOrRef, unknown table tag - " + tag); } res = new MDToken(tok, rid); break; case CodedTokenId.HasConstant : tag = data & 0x03; rid = (int) ((uint) data >> 2); switch (tag) { case 0 : tok = TokenType.FieldDef; break; case 1 : tok = TokenType.ParamDef; break; case 2 : tok = TokenType.Property; break; default : throw new BadMetaDataException("Invalid coded token for HasConstant, unknown table tag - " + tag); } res = new MDToken(tok, rid); break; case CodedTokenId.HasCustomAttribute : tag = data & 0x1F; rid = (int) ((uint) data >> 5); switch (tag) { case 0 : tok = TokenType.MethodDef; break; case 1 : tok = TokenType.FieldDef; break; case 2 : tok = TokenType.TypeRef; break; case 3 : tok = TokenType.TypeDef; break; case 4 : tok = TokenType.ParamDef; break; case 5 : tok = TokenType.InterfaceImpl; break; case 6 : tok = TokenType.MemberRef; break; case 7 : tok = TokenType.Module; break; case 8 : tok = TokenType.Permission; break; case 9 : tok = TokenType.Property; break; case 10 : tok = TokenType.Event; break; case 11 : tok = TokenType.Signature; break; case 12 : tok = TokenType.ModuleRef; break; case 13 : tok = TokenType.TypeSpec; break; case 14 : tok = TokenType.Assembly; break; case 15 : tok = TokenType.AssemblyRef; break; case 16 : tok = TokenType.File; break; case 17 : tok = TokenType.ExportedType; break; case 18 : tok = TokenType.ManifestResource; break; default : throw new BadMetaDataException("Invalid coded token for HasCustomAttribute, unknown table tag - " + tag); } res = new MDToken(tok, rid); break; case CodedTokenId.HasFieldMarshal : tag = data & 0x01; rid = (int) ((uint) data >> 1); switch (tag) { case 0 : tok = TokenType.FieldDef; break; case 1 : tok = TokenType.ParamDef; break; default : throw new BadMetaDataException("Invalid coded token for HasFieldMarshal, unknown table tag - " + tag); } res = new MDToken(tok, rid); break; case CodedTokenId.HasDeclSecurity : tag = data & 0x03; rid = (int) ((uint) data >> 2); switch (tag) { case 0 : tok = TokenType.TypeDef; break; case 1 : tok = TokenType.MethodDef; break; case 2 : tok = TokenType.Assembly; break; default : throw new BadMetaDataException("Invalid coded token for HasDeclSecurity, unknown table tag - " + tag); } res = new MDToken(tok, rid); break; case CodedTokenId.MemberRefParent : tag = data & 0x07; rid = (int) ((uint) data >> 3); switch (tag) { case 0 : tok = TokenType.TypeDef; break; case 1 : tok = TokenType.TypeRef; break; case 2 : tok = TokenType.ModuleRef; break; case 3 : tok = TokenType.MethodDef; break; case 4 : tok = TokenType.TypeSpec; break; default : throw new BadMetaDataException("Invalid coded token for MemberRefParent, unknown table tag - " + tag); } res = new MDToken(tok, rid); break; case CodedTokenId.HasSemantics : tag = data & 0x01; rid = (int) ((uint) data >> 1); switch (tag) { case 0 : tok = TokenType.Event; break; case 1 : tok = TokenType.Property; break; default : throw new BadMetaDataException("Invalid coded token for HasSemantics, unknown table tag - " + tag); } res = new MDToken(tok, rid); break; case CodedTokenId.MethodDefOrRef : tag = data & 0x01; rid = (int) ((uint) data >> 1); switch (tag) { case 0 : tok = TokenType.MethodDef; break; case 1 : tok = TokenType.MemberRef; break; default : throw new BadMetaDataException("Invalid coded token for MethodDefOrRef, unknown table tag - " + tag); } res = new MDToken(tok, rid); break; case CodedTokenId.MemberForwarded : tag = data & 0x01; rid = (int) ((uint) data >> 1); switch (tag) { case 0 : tok = TokenType.FieldDef; break; case 1 : tok = TokenType.MethodDef; break; default : throw new BadMetaDataException("Invalid coded token for MemberForwarded, unknown table tag - " + tag); } res = new MDToken(tok, rid); break; case CodedTokenId.Implementation : tag = data & 0x03; rid = (int) ((uint) data >> 2); switch (tag) { case 0 : tok = TokenType.File; break; case 1 : tok = TokenType.AssemblyRef; break; case 2 : tok = TokenType.ExportedType; break; default : throw new BadMetaDataException("Invalid coded token for Implementation, unknown table tag - " + tag); } res = new MDToken(tok, rid); break; case CodedTokenId.CustomAttributeType : tag = data & 0x07; rid = (int) ((uint) data >> 3); switch (tag) { case 0 : tok = TokenType.TypeRef; break; case 1 : tok = TokenType.TypeDef; break; case 2 : tok = TokenType.MethodDef; break; case 3 : tok = TokenType.MemberRef; break; case 4 : tok = TokenType.String; break; default : throw new BadMetaDataException("Invalid coded token for CustomAttributeType, unknown table tag - " + tag); } res = new MDToken(tok, rid); break; case CodedTokenId.ResolutionScope : tag = data & 0x03; rid = (int) ((uint) data >> 2); switch (tag) { case 0 : tok = TokenType.Module; break; case 1 : tok = TokenType.ModuleRef; break; case 2 : tok = TokenType.AssemblyRef; break; case 3 : tok = TokenType.TypeRef; break; default : throw new BadMetaDataException("Invalid coded token for ResolutionScope, unknown table tag - " + tag); } res = new MDToken(tok, rid); break; default: break; } return res; }