public void SaveStateBinary(BinaryWriter bw) { Enter(); try { bw.Write(MAGIC); bw.Write(_elfhash); bw.Write(_loadoffset); foreach (var sec in _elf.Sections.Where(s => (s.Flags & SectionFlags.Writable) != 0)) { var ms = _base.GetStream((ulong)(sec.LoadAddress + _loadoffset), (ulong)sec.Size, false); bw.Write(sec.Size); ms.CopyTo(bw.BaseStream); } if (_heap != null) { _heap.SaveStateBinary(bw); } if (_sealedheap != null) { _sealedheap.SaveStateBinary(bw); } bw.Write(MAGIC); } finally { Exit(); } }
private void SaveStateBodyBinary(BinaryWriter writer) { writer.Write(Count); for (var i = _firstStateIndex; i != _nextStateIndex; i = (i + 1) & STATEMASK) { writer.Write(_states[i].Frame); writer.Write(_states[i].Size); } if (Count != 0) { var startByte = _states[_firstStateIndex].Start; var endByte = (_states[HeadStateIndex].Start + _states[HeadStateIndex].Size) & _sizeMask; // TODO: Use spans to avoid these extra copies in .net core if (startByte > endByte) { { var stream = _buffer.GetStream(_buffer.Start + (ulong)startByte, (ulong)(Size - startByte), false); stream.CopyTo(writer.BaseStream); } startByte = 0; } { var stream = _buffer.GetStream(_buffer.Start + (ulong)startByte, (ulong)(endByte - startByte), false); stream.CopyTo(writer.BaseStream); } } }