public static ObjectFile FromReader(DisReader reader) { int magic = reader.ReadOP(); if ((magic != XMAGIC) && (magic != SMAGIC)) { throw new InvalidDataException("Invalid magic number"); } if (magic == SMAGIC) { int slength = reader.ReadOP(); byte[] signature = reader.ReadBytes(slength); } int runtimeFlag = reader.ReadOP(); int stackExtent = reader.ReadOP(); int codeSize = reader.ReadOP(); int dataSize = reader.ReadOP(); int typeSize = reader.ReadOP(); int linkSize = reader.ReadOP(); int entryPc = reader.ReadOP(); int entryType = reader.ReadOP(); ObjectFile result = new ObjectFile(); result.ShareMP = ((runtimeFlag & FLAG_SHAREMP) != 0); result.StackExtent = stackExtent; result.EntryPC = entryPc; result.EntryFrameType = entryType; result.Instructions = new Instruction[codeSize]; for (int i = 0; i < codeSize; i++) { Instruction inst = Instruction.FromReader(reader); result.Instructions[i] = inst; } result.Types = new TypeDescriptor[typeSize]; for (int i = 0; i < typeSize; i++) { result.Types[i] = TypeDescriptor.FromReader(reader); } List <DataDescriptor> data = new List <DataDescriptor> (); while (true) { DataDescriptor descriptor = DataDescriptor.FromReader(reader); if (descriptor.Code == 0) { break; } data.Add(descriptor); } result.Data = data.ToArray(); result.Name = reader.ReadString(); result.Link = new ExportDescriptor[linkSize]; for (int i = 0; i < linkSize; i++) { ExportDescriptor desc = ExportDescriptor.FromReader(reader); desc.FrameSize = result.Types[desc.FrameTypeId].Size; result.Link[i] = desc; } if (!reader.AtEndOfStream) { int importCount = reader.ReadOP(); List <ModuleImportDescriptor> imports = new List <ModuleImportDescriptor> (importCount); for (int i = 0; i < importCount; i++) { imports.Add(ModuleImportDescriptor.FromReader(reader)); } result.Imports = imports.ToArray(); } if (!reader.AtEndOfStream) { int handlerCount = reader.ReadOP(); List <HandlerDescriptor> handlers = new List <HandlerDescriptor> (handlerCount); for (int i = 0; i < handlerCount; i++) { handlers.Add(HandlerDescriptor.FromReader(reader)); } result.Handlers = handlers.ToArray(); } return(result); }