private void ReadMetadata() { int codeStartOffset = ModuleReader.PeekInt32(); var blockOffsets = ReadInt32Array(startOffset: HeaderSize, endOffset: codeStartOffset).ToList(); var blocks = ImmutableArray.CreateBuilder <BlockDefinition>(blockOffsets.Count); for (int idxNext = 1; idxNext <= blockOffsets.Count; idxNext++) { int idxCurr = idxNext - 1; int currStart = blockOffsets[idxCurr]; int length; if (idxNext < blockOffsets.Count) { if (blockOffsets[idxNext] > blockOffsets[idxCurr]) { length = blockOffsets[idxNext] - blockOffsets[idxCurr]; } else { int currEnd = idxNext + 1 < blockOffsets.Count ? blockOffsets[idxNext + 1] : _stringTableEndOffset; length = currEnd - blockOffsets[idxCurr]; } } else { length = _stringTableOffset - blockOffsets[idxCurr]; } blocks.Add(new BlockDefinition(this, idxCurr, currStart, length)); } Blocks = blocks.ToImmutable(); if (_stringTableOffset != _stringTableEndOffset) { var stringOffsets = ReadInt32Array(startOffset: _stringTableOffset, endOffset: _stringTableEndOffset).ToList(); for (int idxNext = 1; idxNext <= stringOffsets.Count; idxNext++) { int idxCurr = idxNext - 1; int currStart = stringOffsets[idxCurr]; int currEnd = idxNext < stringOffsets.Count ? stringOffsets[idxNext] : (int)ModuleStream.Length; int length = currEnd - currStart; _stringTable.Add(new StringHandle(this, idxCurr, currStart, length)); } } if (_stringTable.Any()) { _stringHeapOffset = _stringTable.First().Offset; } }