From b3bb56279a9dbd72592ee974d128ae440c0cbb8c Mon Sep 17 00:00:00 2001 From: Luna Date: Tue, 3 Sep 2019 12:45:17 -0300 Subject: [PATCH] remove usage of command pointers for most things this serves as a workaround for the compiler bugs found on zig trunk - use std.StringHashMap --- src/lang.zig | 51 +++++++++++++++++++++++--------------------------- src/plugin.zig | 2 +- src/runner.zig | 9 ++++++--- 3 files changed, 30 insertions(+), 32 deletions(-) diff --git a/src/lang.zig b/src/lang.zig index 7c66fa4..3af632c 100644 --- a/src/lang.zig +++ b/src/lang.zig @@ -41,11 +41,11 @@ pub const Command = struct { args: ArgList, cur_idx: usize = 0, - pub fn print(self: *const Command) void { + pub fn print(self: Command) void { std.debug.warn("cmd:{}\n", self.command); } - pub fn argAt(self: *const Command, idx: usize) ![]const u8 { + pub fn argAt(self: Command, idx: usize) ![]const u8 { const args = self.args.toSliceConst(); if (idx > (args.len - 1)) { @@ -56,7 +56,7 @@ pub const Command = struct { return args[idx]; } - pub fn usizeArgAt(self: *const Command, idx: usize) !usize { + pub fn usizeArgAt(self: Command, idx: usize) !usize { var arg = try self.argAt(idx); return try std.fmt.parseInt(usize, arg, 10); } @@ -69,18 +69,18 @@ pub const Command = struct { }; } - pub fn intArgAt(self: *const Command, idx: usize) !i32 { + pub fn intArgAt(self: Command, idx: usize) !i32 { var arg = try self.argAt(idx); return try std.fmt.parseInt(i32, arg, 10); } - pub fn floatArgAt(self: *const Command, idx: usize) !f32 { + pub fn floatArgAt(self: Command, idx: usize) !f32 { var arg = try self.argAt(idx); return try std.fmt.parseFloat(f32, arg); } pub fn floatArgMany( - self: *const Command, + self: Command, allocator: *std.mem.Allocator, start_index: usize, elements: usize, @@ -124,25 +124,23 @@ pub const Command = struct { self.cur_idx += 1; _ = try map.put(symbol, val); } + + pub fn copy(self: Command, allocator: *std.mem.Allocator) !*Command { + var cmd = try allocator.create(Command); + cmd.* = Command{ + .command = self.command, + .args = self.args, + .cur_idx = self.cur_idx, + }; + + return cmd; + } }; -pub const CommandList = std.ArrayList(*Command); +pub const CommandList = std.ArrayList(Command); pub const ArgList = std.ArrayList([]const u8); -fn eqlu8(a: []const u8, b: []const u8) bool { - return std.mem.eql(u8, a, b); -} - -fn hashu8(key: []const u8) u32 { - var hasher = std.hash.Wyhash.init(0); - for (key) |value| { - std.hash.autoHash(&hasher, value); - } - - return @truncate(u32, hasher.final()); -} - -pub const KeywordMap = std.HashMap([]const u8, CommandType, hashu8, eqlu8); +pub const KeywordMap = std.StringHashMap(CommandType); pub const Lang = struct { allocator: *std.mem.Allocator, @@ -290,7 +288,7 @@ pub const Lang = struct { } } - fn validateCommand(self: *Lang, cmd: *Command) !void { + fn validateCommand(self: *Lang, cmd: Command) !void { switch (cmd.command) { .Quicksave, .Noop => {}, .Load, .RunQS => try self.expectSingle(cmd.args), @@ -359,16 +357,13 @@ pub const Lang = struct { } // construct final Command based on command - var cmd_ptr = try self.allocator.create(Command); - errdefer self.allocator.destroy(cmd_ptr); - - cmd_ptr.* = Command{ .command = ctype, .args = args }; - self.validateCommand(cmd_ptr) catch |err| { + var cmd = Command{ .command = ctype, .args = args }; + self.validateCommand(cmd) catch |err| { self.doError("Unknown command '{}' (length {})", command, command.len); continue; }; - try cmds.append(cmd_ptr); + try cmds.append(cmd); } if (self.has_error) return ParseError.ParseFail; diff --git a/src/plugin.zig b/src/plugin.zig index daf8023..03b72cc 100644 --- a/src/plugin.zig +++ b/src/plugin.zig @@ -16,7 +16,7 @@ pub const Param = struct { /// List of parameters to be set to control ports. pub const ParamList = std.ArrayList(Param); -pub const ParamMap = std.AutoHashMap([]const u8, f32); +pub const ParamMap = std.StringHashMap(f32); /// Represents an absolute position in the image. pub const SeekPos = struct { diff --git a/src/runner.zig b/src/runner.zig index 625c1f1..a348f22 100644 --- a/src/runner.zig +++ b/src/runner.zig @@ -464,10 +464,13 @@ pub const Runner = struct { cmds: lang.CommandList, debug_flag: bool, ) !void { - var it = cmds.iterator(); + for (cmds.toSlice()) |const_cmd| { + if (debug_flag) const_cmd.print(); + + // copy the command so we own its memory + var cmd = try const_cmd.copy(self.allocator); + defer self.allocator.destroy(cmd); - while (it.next()) |cmd| { - if (debug_flag) cmd.print(); try self.runCommand(cmd); } }