public bool MoveNext() { // Done? if (_reader.Position >= _reader.Buffer.Length) { return(false); } // Read type of next trace entry var entryType = (TraceEntryTypes.TraceEntryTypes)_reader.ReadByte(); // Deserialize trace entry Current = entryType switch { TraceEntryTypes.TraceEntryTypes.Allocation => new Allocation(), TraceEntryTypes.TraceEntryTypes.Branch => new Branch(), TraceEntryTypes.TraceEntryTypes.Free => new Free(), TraceEntryTypes.TraceEntryTypes.HeapMemoryAccess => new HeapMemoryAccess(), TraceEntryTypes.TraceEntryTypes.ImageMemoryAccess => new ImageMemoryAccess(), TraceEntryTypes.TraceEntryTypes.StackMemoryAccess => new StackMemoryAccess(), _ => throw new TraceFormatException("Illegal trace entry type.") }; Current.FromReader(_reader); return(true); }
/// <summary> /// Deserializes an entire trace entry from the given binary reader. /// </summary> /// <typeparam name="T">Trace entry type.</typeparam> /// <param name="reader">Binary reader containing the trace data.</param> /// <returns></returns> public static TraceEntry DeserializeNextEntry(FastBinaryReader reader) { // Read depending on type TraceEntryTypes entryType = (TraceEntryTypes)reader.ReadByte(); switch (entryType) { case TraceEntryTypes.ImageMemoryAccess: return(Deserialize <Microwalk.TraceEntryTypes.ImageMemoryAccess>(reader)); case TraceEntryTypes.HeapMemoryAccess: return(Deserialize <Microwalk.TraceEntryTypes.HeapMemoryAccess>(reader)); case TraceEntryTypes.StackMemoryAccess: return(Deserialize <Microwalk.TraceEntryTypes.StackMemoryAccess>(reader)); case TraceEntryTypes.Allocation: return(Deserialize <Microwalk.TraceEntryTypes.Allocation>(reader)); case TraceEntryTypes.Free: return(Deserialize <Microwalk.TraceEntryTypes.Free>(reader)); case TraceEntryTypes.Branch: return(Deserialize <Microwalk.TraceEntryTypes.Branch>(reader)); default: throw new TraceFormatException($"Unknown trace entry type."); } }