public InstructionReaderDump(System.IO.Stream dump) { // header(type, name.Length, il.Length) byte[] header = new byte[sizeof(byte) + sizeof(int) * 2]; dump.Read(header, 0, header.Length); IBinaryReader headerReader = new BinaryReader(header); Type = (Context.OperandReaderContextType)headerReader.ReadByte(); byte[] nameBytes = new byte[headerReader.ReadInt()]; ilBytes = new byte[headerReader.ReadInt()]; // data dump.Read(nameBytes, 0, nameBytes.Length); dump.Read(ilBytes, 0, ilBytes.Length); // Name = DumpHelper.GetString(nameBytes); metadata = DumpHelper.ReadMedatataItems(dump).ToArray(); DumpHelper.Read(ref @this, dump); DumpHelper.Read(ref arguments, dump); DumpHelper.Read(ref variables, dump); DumpHelper.Read(methods.tokens, dump); DumpHelper.Read(fields.tokens, dump); DumpHelper.Read(types.tokens, dump); DumpHelper.Read(members.tokens, dump); DumpHelper.Read(strings.tokens, dump); DumpHelper.Read(signatures.tokens, dump); }
// internal static IEnumerable <Readers.IMetadataItem> ReadMedatataItems(System.IO.Stream stream) { int count = DumpHelper.ReadInt(stream); for (int i = 0; i < count; i++) { yield return(ReadMedatataItem(stream)); } }
// internal static void WriteMedatataItems(System.IO.Stream stream, IEnumerable <Readers.IMetadataItem> metadata) { var items = metadata.ToArray(); DumpHelper.Write(items.Length, stream); // count for (int i = 0; i < items.Length; i++) { WriteMedatataItem(stream, items[i]); } }
static void WriteMetadataItemValue(System.IO.Stream stream, Readers.IMetadataItem item) { DumpHelper.Write(item.Value is int? 1 : 0, stream); if (item.Value is int) { DumpHelper.Write((int)item.Value, stream); } else { DumpHelper.Write((item.Value ?? string.Empty).ToString(), stream); } }
static void WriteMedatataItem(System.IO.Stream stream, Readers.IMetadataItem item) { DumpHelper.Write(item.HasChildren ? 1 : 0, stream); // hasChildren DumpHelper.Write(item.Name, stream); // name if (!item.HasChildren) { WriteMetadataItemValue(stream, item); } else { WriteMedatataItems(stream, item.Children); } }
// public static void Write(System.IO.Stream stream, Context.IOperandReaderContext context) { // type stream.Write(new byte[] { (byte)context.Type }, 0, 1); // name byte[] nameBytes = null; DumpHelper.GetBytes(ref nameBytes, context.Name); DumpHelper.Write(nameBytes.Length, stream); // IL byte[] ILBytes = context.GetIL(); DumpHelper.Write(ILBytes.Length, stream); // context data stream.Write(nameBytes, 0, nameBytes.Length); stream.Write(ILBytes, 0, ILBytes.Length); // meta DumpHelper.WriteMedatataItems(stream, context.GetMetadata()); // body context.Dump(stream); }