int nextMethodIndex = GCREFMAP_LOOKUP_STRIDE - 1;
for (int methodIndex = 0; methodIndex < _methods.Count; methodIndex++)
{
- if (methodIndex >= nextMethodIndex)
- {
- builder.Builder.EmitInt(offsets[nextOffsetIndex], builder.Builder.CountBytes);
- nextOffsetIndex++;
- nextMethodIndex += GCREFMAP_LOOKUP_STRIDE;
- }
IMethodNode methodNode = _methods[methodIndex];
if (methodNode == null || (methodNode is MethodWithGCInfo methodWithGCInfo && methodWithGCInfo.IsEmpty))
{
{
builder.GetCallRefMap(methodNode.Method);
}
+ if (methodIndex >= nextMethodIndex)
+ {
+ builder.Builder.EmitInt(offsets[nextOffsetIndex], builder.Builder.CountBytes);
+ nextOffsetIndex++;
+ nextMethodIndex += GCREFMAP_LOOKUP_STRIDE;
+ }
}
Debug.Assert(nextOffsetIndex == offsets.Length);
AuxiliaryDataSize = 0;
if (AuxiliaryDataRVA != 0)
{
- int startOffset = auxDataOffset + BitConverter.ToInt32(reader.Image, auxDataOffset);
+ int endOffset = auxDataOffset + BitConverter.ToInt32(reader.Image, auxDataOffset);
for (int i = 0; i < Entries.Count; i++)
{
- GCRefMapDecoder decoder = new GCRefMapDecoder(reader, startOffset);
+ int entryStartOffset = auxDataOffset + BitConverter.ToInt32(reader.Image, auxDataOffset + sizeof(int) * (Entries[i].Index / GCRefMap.GCREFMAP_LOOKUP_STRIDE));
+ int remaining = Entries[i].Index % GCRefMap.GCREFMAP_LOOKUP_STRIDE;
+ while (remaining != 0)
+ {
+ while ((reader.Image[entryStartOffset] & 0x80) != 0)
+ {
+ entryStartOffset++;
+ }
+
+ entryStartOffset++;
+ remaining--;
+ }
+
+ GCRefMapDecoder decoder = new GCRefMapDecoder(reader, entryStartOffset);
Entries[i].GCRefMap = decoder.ReadMap();
- startOffset = decoder.GetOffset();
+ endOffset = decoder.GetOffset();
}
- AuxiliaryDataSize = startOffset - auxDataOffset;
+ AuxiliaryDataSize = endOffset - auxDataOffset;
}
}