From a2ea8fb53ea5cce02744a7dd0a5beeea6c79cd24 Mon Sep 17 00:00:00 2001 From: Luna Date: Tue, 2 Jun 2020 17:12:34 -0300 Subject: [PATCH] make args live through lifetime of runner we just assign cloned runners the args of the parent runner and don't free the parent's, maintaining okay memory usage. --- src/runner.zig | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/runner.zig b/src/runner.zig index 234e59e..3ca9bc9 100644 --- a/src/runner.zig +++ b/src/runner.zig @@ -26,10 +26,13 @@ pub const Runner = struct { /// If the runner is in REPL mode repl: bool = false, + args: [][]u8, + pub fn init(allocator: *std.mem.Allocator, repl: bool) Runner { return Runner{ .allocator = allocator, .repl = repl, + .args = std.process.argsAlloc(allocator) catch unreachable, }; } @@ -41,7 +44,11 @@ pub const Runner = struct { pub fn clone(self: *Runner) !Runner { var cloned_image = if (self.image) |image| try image.clone() else null; - return Runner{ .allocator = self.allocator, .image = cloned_image }; + return Runner{ + .allocator = self.allocator, + .image = cloned_image, + .args = self.args, + }; } fn resolveArg(self: *Runner, load_path: []const u8) ![]const u8 { @@ -57,14 +64,12 @@ pub const Runner = struct { // ':0' should ALWAYS point to the image. if (self.repl) index += 3 else index += 2; - var args = try std.process.argsAlloc(self.allocator); - defer std.process.argsFree(self.allocator, args); - std.debug.warn("ARGS!! {} \n", .{args.len}); - for (args) |arg, idx| { + std.debug.warn("ARGS!! {} \n", .{self.args.len}); + for (self.args) |arg, idx| { std.debug.warn("arg{} = {}\n", .{ idx, arg }); } - std.debug.warn("fetch arg idx={}, val={}\n", .{ index, args[index] }); - return args[index]; + std.debug.warn("fetch arg idx={}, val={}\n", .{ index, self.args[index] }); + return self.args[index]; } else { return load_path; }