From e71eba583e2a92928d72821e2444c35ced987979 Mon Sep 17 00:00:00 2001 From: Luna Date: Mon, 1 Jun 2020 22:34:56 -0300 Subject: [PATCH] make load command own its path memory --- src/lang.zig | 3 ++- src/main.zig | 15 +++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/lang.zig b/src/lang.zig index b8f5a85..305eb4a 100644 --- a/src/lang.zig +++ b/src/lang.zig @@ -159,7 +159,7 @@ pub const Command = struct { pub const Load = struct { pub const base_tag = Tag.load; base: Command, - path: []const u8, + path: []u8, }; pub const Quicksave = struct { @@ -566,6 +566,7 @@ pub const Lang = struct { usize => try std.fmt.parseInt(usize, arg, 10), i32 => try std.fmt.parseInt(i32, arg, 10), f32 => try std.fmt.parseFloat(f32, arg), + []u8 => try self.allocator.dupe(u8, arg), []const u8 => try self.allocator.dupe(u8, arg), else => @compileError("Invalid parameter type (" ++ @typeName(cmd_field.field_type) ++ ") left on command struct " ++ @typeName(command_struct) ++ "."), }; diff --git a/src/main.zig b/src/main.zig index 9971f24..1553aff 100644 --- a/src/main.zig +++ b/src/main.zig @@ -57,13 +57,16 @@ pub fn doRepl(allocator: *std.mem.Allocator, args_it: var) !void { } else { // if there isn't any commands on the file, we load our default // 'load :0' command - var loadargs = langs.ArgList.init(allocator); - try loadargs.append(":0"); - try cmds.append(langs.Command{ - .command = .Load, - .args = loadargs, - }); + // TODO: deliberate memleak here. we only allocate this + // command once, for the start of the file, so. + var load_cmd = try allocator.create(langs.Command.Load); + std.mem.copy(u8, load_cmd.path, ":0"); + load_cmd.base.tag = langs.Command.Tag.load; + + // taking address is fine, because load_cmd lives in the lifetime + // of the allocator. + try cmds.append(&load_cmd.base); } if (file_read_opt) |file_read| {