Beispiel #1
0
		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;
		}
Beispiel #2
0
		/// <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;
		}