38 internal struct Record : IRecord
43 internal BlobHandle Offset;
44 internal object Value;
46 readonly
int IRecord.FilterKey => Parent;
48 public readonly
int CompareTo(Record other) => Comparer<int>.Default.Compare(EncodeHasConstant(Parent), EncodeHasConstant(other.Parent));
52 internal const int Index = 0x0B;
56 for (
int i = 0; i < records.Length; i++)
58 records[i].Type = mr.ReadInt16();
59 records[i].Parent = mr.ReadHasConstant();
60 records[i].Offset = MetadataTokens.BlobHandle(mr.ReadBlobIndex());
64 internal override void Write(ModuleBuilder module)
66 for (
int i = 0; i < rowCount; i++)
69 var b = module.Metadata.GetOrAddConstantBlob(records[i].Value);
70 Debug.Assert(b == records[i].Offset);
73 var h = module.Metadata.AddConstant(MetadataTokens.EntityHandle(records[i].Parent), records[i].Value);
74 Debug.Assert(h == MetadataTokens.ConstantHandle(i + 1));
78 internal void Fixup(ModuleBuilder module)
80 for (
int i = 0; i < rowCount; i++)
81 module.FixupPseudoToken(
ref records[i].Parent);
86 internal static int EncodeHasConstant(
int token) => (token >> 24)
switch
88 FieldTable.Index => (token & 0xFFFFFF) << 2 | 0,
89 ParamTable.Index => (token & 0xFFFFFF) << 2 | 1,
90 PropertyTable.Index => (token & 0xFFFFFF) << 2 | 2,
91 _ =>
throw new InvalidOperationException(),
94 internal object GetRawConstantValue(Module module,
int parent)
96 foreach (var i
in Filter(parent))
98 var br = module.GetBlobReader(module.ConstantTable.records[i].Offset);
100 switch (module.ConstantTable.records[i].Type)
104 return br.ReadByte() != 0;
106 return br.ReadSByte();
108 return br.ReadInt16();
110 return br.ReadInt32();
112 return br.ReadInt64();
114 return br.ReadByte();
116 return br.ReadUInt16();
118 return br.ReadUInt32();
120 return br.ReadUInt64();
122 return br.ReadSingle();
124 return br.ReadDouble();
126 return br.ReadChar();
129 var chars =
new char[br.Length / 2];
130 for (
int j = 0; j < chars.Length; j++)
131 chars[j] = br.ReadChar();
133 return new string(chars);
136 if (br.ReadInt32() != 0)
137 throw new BadImageFormatException();
141 throw new BadImageFormatException();
145 throw new InvalidOperationException();