diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2025-10-29 18:05:49 -0400 |
|---|---|---|
| committer | Jacob Young <jacobly0@users.noreply.github.com> | 2025-10-29 18:05:49 -0400 |
| commit | 6f0476e41d2f9b040a9883b288171c6a50c29ed5 (patch) | |
| tree | e8baa001358a74fbb559bd44e91e84db52d01e26 /src/link/MappedFile.zig | |
| parent | a072d821be9e4bae68c7c14e9438f3750d2c0c89 (diff) | |
| download | zig-6f0476e41d2f9b040a9883b288171c6a50c29ed5.tar.gz zig-6f0476e41d2f9b040a9883b288171c6a50c29ed5.zip | |
Elf2: start implementing input object loading
Diffstat (limited to 'src/link/MappedFile.zig')
| -rw-r--r-- | src/link/MappedFile.zig | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/src/link/MappedFile.zig b/src/link/MappedFile.zig index a9d874c23f..7550638197 100644 --- a/src/link/MappedFile.zig +++ b/src/link/MappedFile.zig @@ -1,4 +1,4 @@ -file: std.fs.File, +file: std.Io.File, flags: packed struct { block_size: std.mem.Alignment, copy_file_range_unsupported: bool, @@ -24,7 +24,7 @@ pub const Error = std.posix.MMapError || std.posix.MRemapError || std.fs.File.Se NoSpaceLeft, }; -pub fn init(file: std.fs.File, gpa: std.mem.Allocator) !MappedFile { +pub fn init(file: std.Io.File, gpa: std.mem.Allocator) !MappedFile { var mf: MappedFile = .{ .file = file, .flags = undefined, @@ -386,7 +386,7 @@ pub const Node = extern struct { fn sendFile( interface: *std.Io.Writer, - file_reader: *std.fs.File.Reader, + file_reader: *std.Io.File.Reader, limit: std.Io.Limit, ) std.Io.Writer.FileError!usize { if (limit == .nothing) return 0; @@ -397,14 +397,16 @@ pub const Node = extern struct { switch (file_reader.mode) { .positional => { const fr_buf = file_reader.interface.buffered(); - const buf_copy_size = interface.write(fr_buf) catch unreachable; - file_reader.interface.toss(buf_copy_size); - if (buf_copy_size < fr_buf.len) return buf_copy_size; - assert(file_reader.logicalPos() == file_reader.pos); + if (fr_buf.len > 0) { + const n = interface.write(fr_buf) catch unreachable; + file_reader.interface.toss(n); + return n; + } + assert(file_reader.logicalPos() == file_reader.pos); const w: *Writer = @fieldParentPtr("interface", interface); - const copy_size: usize = @intCast(w.mf.copyFileRange( - .adaptFromNewApi(file_reader.file), + const n: usize = @intCast(w.mf.copyFileRange( + file_reader.file, file_reader.pos, w.ni.fileLocation(w.mf, true).offset + interface.end, limit.minInt(interface.unusedCapacityLen()), @@ -412,8 +414,10 @@ pub const Node = extern struct { w.err = err; return error.WriteFailed; }); - interface.end += copy_size; - return copy_size; + if (n == 0) return error.Unimplemented; + file_reader.pos += n; + interface.end += n; + return n; }, .streaming, .streaming_reading, @@ -614,7 +618,7 @@ fn resizeNode(mf: *MappedFile, gpa: std.mem.Allocator, ni: Node.Index, requested // Resize the entire file if (ni == Node.Index.root) { try mf.ensureCapacityForSetLocation(gpa); - try mf.file.setEndPos(new_size); + try std.fs.File.adaptFromNewApi(mf.file).setEndPos(new_size); try mf.ensureTotalCapacity(@intCast(new_size)); ni.setLocationAssumeCapacity(mf, old_offset, new_size); return; @@ -894,7 +898,7 @@ fn copyRange(mf: *MappedFile, old_file_offset: u64, new_file_offset: u64, size: fn copyFileRange( mf: *MappedFile, - old_file: std.fs.File, + old_file: std.Io.File, old_file_offset: u64, new_file_offset: u64, size: u64, |
