aboutsummaryrefslogtreecommitdiff
path: root/src/link/MachO/Object.zig
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2021-07-31 15:33:39 +0200
committerJakub Konka <kubkon@jakubkonka.com>2021-08-01 09:06:56 +0200
commitf023cdad7ca676977d9b5abd3d38677779aab211 (patch)
treee9f6005480147c3daa1766e37ce1715d31877bc9 /src/link/MachO/Object.zig
parent06396ddd7d632704681bbd6278f18dcc2b6bf20c (diff)
downloadzig-f023cdad7ca676977d9b5abd3d38677779aab211.tar.gz
zig-f023cdad7ca676977d9b5abd3d38677779aab211.zip
macho: don't allocate Archives on the heap
instead, transfer ownership directly to MachO struct.
Diffstat (limited to 'src/link/MachO/Object.zig')
-rw-r--r--src/link/MachO/Object.zig27
1 files changed, 10 insertions, 17 deletions
diff --git a/src/link/MachO/Object.zig b/src/link/MachO/Object.zig
index 6a1bf8fd57..ff397ed7b0 100644
--- a/src/link/MachO/Object.zig
+++ b/src/link/MachO/Object.zig
@@ -155,17 +155,18 @@ pub fn deinit(self: *Object, allocator: *Allocator) void {
}
pub fn isObject(file: fs.File) !bool {
- const reader = file.reader();
- const is_object = blk: {
- if (reader.readStruct(macho.mach_header_64)) |header| {
- break :blk header.filetype == macho.MH_OBJECT;
- } else |err| {
- switch (err) {
- error.EndOfStream => break :blk false,
- else => |e| return e,
- }
+ const Internal = struct {
+ fn isObject(reader: anytype) !bool {
+ const header = try reader.readStruct(macho.mach_header_64);
+ return header.filetype == macho.MH_OBJECT;
}
};
+ const is_object = if (Internal.isObject(file.reader())) |res|
+ res
+ else |err| switch (err) {
+ error.EndOfStream => false,
+ else => |e| return e,
+ };
try file.seekTo(0);
return is_object;
}
@@ -175,14 +176,7 @@ pub fn parse(self: *Object, allocator: *Allocator, arch: Arch) !void {
if (self.file_offset) |offset| {
try reader.context.seekTo(offset);
}
-
const header = try reader.readStruct(macho.mach_header_64);
-
- if (header.filetype != macho.MH_OBJECT) {
- log.debug("invalid filetype: expected 0x{x}, found 0x{x}", .{ macho.MH_OBJECT, header.filetype });
- return error.NotObject;
- }
-
const this_arch: Arch = switch (header.cputype) {
macho.CPU_TYPE_ARM64 => .aarch64,
macho.CPU_TYPE_X86_64 => .x86_64,
@@ -195,7 +189,6 @@ pub fn parse(self: *Object, allocator: *Allocator, arch: Arch) !void {
log.err("mismatched cpu architecture: expected {s}, found {s}", .{ arch, this_arch });
return error.MismatchedCpuArchitecture;
}
-
self.header = header;
try self.readLoadCommands(allocator, reader);