38 internal struct Record : IRecord
41 internal short Number;
44 internal StringHandle
Name;
49 internal int UnsortedIndex;
51 readonly
int IRecord.FilterKey => Owner;
53 public readonly
int CompareTo(Record other)
55 if (Owner == other.Owner)
56 return Comparer<short>.Default.Compare(Number, other.Number);
58 return Comparer<int>.Default.Compare(EncodeOwner(Owner), EncodeOwner(other.Owner));
63 internal const int Index = 0x2A;
67 for (
int i = 0; i < records.Length; i++)
69 records[i].Number = mr.ReadInt16();
70 records[i].Flags = mr.ReadInt16();
71 records[i].Owner = mr.ReadTypeOrMethodDef();
72 records[i].Name = MetadataTokens.StringHandle(mr.ReadStringIndex());
76 internal override void Write(ModuleBuilder module)
78 for (
int i = 0; i < rowCount; i++)
80 var h = module.Metadata.AddGenericParameter(
81 MetadataTokens.EntityHandle(records[i].Owner),
82 (
System.Reflection.GenericParameterAttributes)records[i].Flags,
86 Debug.Assert(h == MetadataTokens.GenericParameterHandle(i + 1));
90 internal void Fixup(ModuleBuilder moduleBuilder)
92 for (
int i = 0; i < rowCount; i++)
94 moduleBuilder.FixupPseudoToken(
ref records[i].Owner);
95 records[i].UnsortedIndex = i;
101 internal static int EncodeOwner(
int token) => (token >> 24)
switch
103 TypeDefTable.Index => (token & 0xFFFFFF) << 1 | 0,
105 _ =>
throw new InvalidOperationException(),
108 internal void PatchAttribute(
int token, GenericParameterAttributes genericParameterAttributes)
110 records[(token & 0xFFFFFF) - 1].Flags = (
short)genericParameterAttributes;
113 internal int[] GetIndexFixup()
115 var array =
new int[rowCount];
116 for (
int i = 0; i < rowCount; i++)
117 array[records[i].UnsortedIndex] = i;
122 internal int FindFirstByOwner(
int token)
124 foreach (
int i
in Filter(token))