Commit affb57aad9

Asherah Connor <ashe@kivikakk.ee>
2021-01-15 00:34:53
use interfaces
1 parent 9168b21
Changed files (3)
lib
src
lib/std/build/emit_raw.zig
@@ -51,10 +51,9 @@ const BinaryElfOutput = struct {
             .segments = ArrayList(*BinaryElfSegment).init(allocator),
             .sections = ArrayList(*BinaryElfSection).init(allocator),
         };
-        const elf_source = std.elf.FileParseSource{ .file = elf_file };
-        const elf_hdr = try std.elf.Header.read(elf_source);
+        const elf_hdr = try std.elf.Header.read(&elf_file);
 
-        var section_headers = elf_hdr.section_header_iterator(elf_source);
+        var section_headers = elf_hdr.section_header_iterator(&elf_file);
         while (try section_headers.next()) |section| {
             if (sectionValidForOutput(section)) {
                 const newSection = try allocator.create(BinaryElfSection);
@@ -68,7 +67,7 @@ const BinaryElfOutput = struct {
             }
         }
 
-        var program_headers = elf_hdr.program_header_iterator(elf_source);
+        var program_headers = elf_hdr.program_header_iterator(&elf_file);
         while (try program_headers.next()) |phdr| {
             if (phdr.p_type == elf.PT_LOAD) {
                 const newSegment = try allocator.create(BinaryElfSegment);
lib/std/elf.zig
@@ -334,40 +334,6 @@ pub const ET = extern enum(u16) {
     pub const HIPROC = 0xffff;
 };
 
-pub const FileParseSource = struct {
-    file: std.fs.File,
-
-    fn readNoEof(self: FileParseSource, buf: []u8, offset: u64) !void {
-        var i: usize = 0;
-        while (i < buf.len) {
-            const len = self.file.pread(buf[i .. buf.len - i], offset + i) catch |err| switch (err) {
-                error.SystemResources => return error.SystemResources,
-                error.IsDir => return error.UnableToReadElfFile,
-                error.OperationAborted => return error.UnableToReadElfFile,
-                error.BrokenPipe => return error.UnableToReadElfFile,
-                error.Unseekable => return error.UnableToReadElfFile,
-                error.ConnectionResetByPeer => return error.UnableToReadElfFile,
-                error.ConnectionTimedOut => return error.UnableToReadElfFile,
-                error.InputOutput => return error.FileSystem,
-                error.Unexpected => return error.Unexpected,
-                error.WouldBlock => return error.Unexpected,
-                error.NotOpenForReading => return error.Unexpected,
-                error.AccessDenied => return error.Unexpected,
-            };
-            if (len == 0) return error.UnexpectedEndOfFile;
-            i += len;
-        }
-    }
-};
-
-pub const BufferParseSource = struct {
-    buffer: []const u8,
-
-    fn readNoEof(self: BufferParseSource, buf: []u8, offset: u64) !void {
-        std.mem.copy(u8, buf, self.buffer[offset .. offset + buf.len]);
-    }
-};
-
 /// All integers are native endian.
 pub const Header = struct {
     endian: builtin.Endian,
@@ -397,7 +363,8 @@ pub const Header = struct {
 
     pub fn read(parse_source: anytype) !Header {
         var hdr_buf: [@sizeOf(Elf64_Ehdr)]u8 align(@alignOf(Elf64_Ehdr)) = undefined;
-        try parse_source.readNoEof(&hdr_buf, 0);
+        try parse_source.seekableStream().seekTo(0);
+        try parse_source.reader().readNoEof(&hdr_buf);
         return Header.parse(&hdr_buf);
     }
 
@@ -448,7 +415,8 @@ pub fn ProgramHeaderIterator(ParseSource: anytype) type {
             if (self.elf_header.is_64) {
                 var phdr: Elf64_Phdr = undefined;
                 const offset = self.elf_header.phoff + @sizeOf(@TypeOf(phdr)) * self.index;
-                try self.parse_source.readNoEof(mem.asBytes(&phdr), offset);
+                try self.parse_source.seekableStream().seekTo(offset);
+                try self.parse_source.reader().readNoEof(mem.asBytes(&phdr));
 
                 // ELF endianness matches native endianness.
                 if (self.elf_header.endian == std.builtin.endian) return phdr;
@@ -468,7 +436,8 @@ pub fn ProgramHeaderIterator(ParseSource: anytype) type {
 
             var phdr: Elf32_Phdr = undefined;
             const offset = self.elf_header.phoff + @sizeOf(@TypeOf(phdr)) * self.index;
-            try self.parse_source.readNoEof(mem.asBytes(&phdr), offset);
+            try self.parse_source.seekableStream().seekTo(offset);
+            try self.parse_source.reader().readNoEof(mem.asBytes(&phdr));
 
             // ELF endianness does NOT match native endianness.
             if (self.elf_header.endian != std.builtin.endian) {
@@ -513,7 +482,8 @@ pub fn SectionHeaderIterator(ParseSource: anytype) type {
             if (self.elf_header.is_64) {
                 var shdr: Elf64_Shdr = undefined;
                 const offset = self.elf_header.shoff + @sizeOf(@TypeOf(shdr)) * self.index;
-                try self.parse_source.readNoEof(mem.asBytes(&shdr), offset);
+                try self.parse_source.seekableStream().seekTo(offset);
+                try self.parse_source.reader().readNoEof(mem.asBytes(&shdr));
 
                 // ELF endianness matches native endianness.
                 if (self.elf_header.endian == std.builtin.endian) return shdr;
@@ -535,7 +505,8 @@ pub fn SectionHeaderIterator(ParseSource: anytype) type {
 
             var shdr: Elf32_Shdr = undefined;
             const offset = self.elf_header.shoff + @sizeOf(@TypeOf(shdr)) * self.index;
-            try self.parse_source.readNoEof(mem.asBytes(&shdr), offset);
+            try self.parse_source.seekableStream().seekTo(offset);
+            try self.parse_source.reader().readNoEof(mem.asBytes(&shdr));
 
             // ELF endianness does NOT match native endianness.
             if (self.elf_header.endian != std.builtin.endian) {
src/test.zig
@@ -989,9 +989,8 @@ pub const TestContext = struct {
             var file = try tmp_dir.openFile(bin_name, .{ .read = true });
             defer file.close();
 
-            const elf_source = std.elf.FileParseSource{ .file = file };
-            const header = try std.elf.Header.read(elf_source);
-            var iterator = header.program_header_iterator(elf_source);
+            const header = try std.elf.Header.read(&file);
+            var iterator = header.program_header_iterator(&file);
 
             var none_loaded = true;