From 78cc7fab4b4a232473acc82d7153fa06ae77fff7 Mon Sep 17 00:00:00 2001 From: Luna Date: Sun, 4 Apr 2021 17:08:53 -0300 Subject: [PATCH 1/3] fix tests --- src/lang.zig | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/lang.zig b/src/lang.zig index b299ae0..127ff04 100644 --- a/src/lang.zig +++ b/src/lang.zig @@ -665,18 +665,18 @@ pub const Lang = struct { }; test "noop" { - var lang = Lang.init(std.heap.direct_allocator); + var lang = Lang.init(std.testing.allocator); defer lang.deinit(); var cmds = try lang.parse("noop;"); defer cmds.deinit(); - std.testing.expectEqual(cmds.len, 1); - std.testing.expectEqual(cmds.items[0].command, .Noop); + std.testing.expectEqual(cmds.list.items.len, 1); + std.testing.expectEqual(cmds.list.items[0].tag, .noop); } test "load, phaser, quicksave" { - var lang = Lang.init(std.heap.direct_allocator); + var lang = Lang.init(std.testing.allocator); defer lang.deinit(); const prog = @@ -688,8 +688,8 @@ test "load, phaser, quicksave" { var cmds = try lang.parse(prog); defer cmds.deinit(); - std.testing.expectEqual(cmds.len, 3); - std.testing.expectEqual(cmds.items[0].command, .Load); - std.testing.expectEqual(cmds.items[1].command, .Phaser); - std.testing.expectEqual(cmds.items[2].command, .Quicksave); + std.testing.expectEqual(cmds.list.items.len, 3); + std.testing.expectEqual(cmds.list.items[0].tag, .load); + std.testing.expectEqual(cmds.list.items[1].tag, .phaser); + std.testing.expectEqual(cmds.list.items[2].tag, .quicksave); } From 2a801a129b29f15bd225c7ee8ba41dc7a315c2af Mon Sep 17 00:00:00 2001 From: Luna Date: Sun, 4 Apr 2021 17:45:14 -0300 Subject: [PATCH 2/3] add note about comptime hash map --- src/lang.zig | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/lang.zig b/src/lang.zig index 127ff04..3747941 100644 --- a/src/lang.zig +++ b/src/lang.zig @@ -643,7 +643,10 @@ pub const Lang = struct { // in a variable because then that variable must be comptime. // the drawback of this approach is that our emitted code is basically linear - // because we don't use the hashmap anymore. maybe #5359 can help. + // because we don't use the hashmap anymore. + // + // Attempting to use ComptimeHashMap hits compiler bugs and I'm + // not sure if we can map strings to *types* in it. if (std.mem.eql(u8, &lowered_command_name, command_string)) { found = true; From b28f208e659b5ef50258b0ea579f27529c81eff3 Mon Sep 17 00:00:00 2001 From: Luna Date: Sun, 4 Apr 2021 17:56:59 -0300 Subject: [PATCH 3/3] add error for non-lv2 args not getting enough args --- src/lang.zig | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/lang.zig b/src/lang.zig index 3747941..e70b553 100644 --- a/src/lang.zig +++ b/src/lang.zig @@ -527,9 +527,6 @@ pub const Lang = struct { else => true, }; - // TODO: crash when no arguments are left but we still need - // arguments... - if (is_lv2_command) { const split = tok_it.next(); if (split == null) { @@ -571,7 +568,14 @@ pub const Lang = struct { continue; } } - const arg = tok_it.next().?; + + const arg_opt = tok_it.next(); + if (arg_opt == null) { + self.doError("Expected parameter for {s}, got nothing", .{cmd_field.name}); + return; + } + const arg = arg_opt.?; + const argument_value = switch (cmd_field.field_type) { usize => try std.fmt.parseInt(usize, arg, 10), i32 => try std.fmt.parseInt(i32, arg, 10),