Ejemplo n.º 1
0
        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;
            }
        }