diff --git a/src/backend/Assembly.zig b/src/backend/Assembly.zig index ec9d671034bd211f4d1064014b7bca08927052e0..0844b71579e3803230b8706aa694c9db7f22e0f2 100644 --- a/src/backend/Assembly.zig +++ b/src/backend/Assembly.zig @@ -1,17 +1,57 @@ const std = @import("std"); const Allocator = std.mem.Allocator; +/// Assembly结构体包含编译后的汇编代码数据 +/// data字段存储二进制数据,text字段存储汇编文本 data: []const u8, text: []const u8, const Assembly = @This(); +/// 释放Assembly对象占用的内存 +/// 使用提供的分配器释放data和text字段 +/// +/// ## 参数 +/// - `self`: 指向const Assembly的指针,包含要释放的数据 +/// - `gpa`: 通用分配器,用于释放内存 +/// +/// ## 行为 +/// - 释放Assembly.data指向的内存 +/// - 释放Assembly.text指向的内存 +/// - 假设data和text都是通过同一个分配器分配的 +/// +/// ## 注意事项 +/// - 此函数不会修改原始的data和text切片值 +/// - 确保在调用此函数后不再使用已释放的内存 +/// - 建议在释放前检查指针是否为null(Zig会自动处理) pub fn deinit(self: *const Assembly, gpa: Allocator) void { gpa.free(self.data); gpa.free(self.text); } -pub fn writeToFile(self: Assembly, file: std.fs.File) !void { +/// 将Assembly的data和text字段写入到文件中 +/// 使用writev系统调用一次性写入两个缓冲区,保证原子性 +/// +/// ## 参数 +/// - `self`: Assembly实例,包含要写入的数据 +/// - `file`: 目标文件,必须是可写的std.fs.File +/// +/// ## 行为 +/// - 首先写入data字段的二进制数据 +/// - 然后写入text字段的汇编文本 +/// - 使用writevAll确保原子写入操作 +/// +/// ## 返回值 +/// - `void`: 成功时无返回值 +/// - `error`: 返回文件系统操作可能产生的错误 +/// +/// ## 可能的错误 +/// - `error.InputOutput`: I/O操作失败 +/// - `error.BrokenPipe`: 管道损坏 +/// - `error.SystemResources`: 系统资源不足 +/// - `error.AccessDenied`: 权限不足 +/// - `error.NotOpenForWriting`: 文件未以写入模式打开 +pub fn writeToAllFile(self: Assembly, file: std.fs.File) !void { var vec: [2]std.posix.iovec_const = .{ .{ .base = self.data.ptr, .len = self.data.len }, .{ .base = self.text.ptr, .len = self.text.len },