commit 16d54c70eb35b58e871c538bf172991aa81191fe (tree)
parent 5de9aac7491958806164f46c356fce983b1c8624
Author: Andrew Kelley <andrew@ziglang.org>
Date: Mon, 24 Aug 2020 15:41:59 -0700
stage2: getErrorValue takes advantage of HashMap getOrPut API
Diffstat:
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/src-self-hosted/Module.zig b/src-self-hosted/Module.zig
@@ -2082,14 +2082,14 @@ fn createNewDecl(
/// Get error value for error tag `name`.
pub fn getErrorValue(self: *Module, name: []const u8) !std.StringHashMapUnmanaged(u16).Entry {
- const new_val = @intCast(u16, self.global_error_set.items().len);
- if (self.global_error_set.getEntry(name)) |some| return some.*;
-
- const duped = try self.gpa.dupe(u8, name);
- errdefer self.gpa.free(duped);
-
- try self.global_error_set.put(self.gpa, duped, new_val);
- return self.global_error_set.getEntry(duped).?.*;
+ const gop = try self.global_error_set.getOrPut(self.gpa, name);
+ if (gop.found_existing)
+ return gop.entry.*;
+ errdefer self.global_error_set.removeAssertDiscard(name);
+
+ gop.entry.key = try self.gpa.dupe(u8, name);
+ gop.entry.value = @intCast(u16, self.global_error_set.items().len - 1);
+ return gop.entry.*;
}
/// TODO split this into `requireRuntimeBlock` and `requireFunctionBlock` and audit callsites.