aboutsummaryrefslogtreecommitdiff
path: root/src/Module.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2020-12-28 11:24:53 -0700
committerAndrew Kelley <andrew@ziglang.org>2020-12-28 11:24:53 -0700
commitf75d4cbe56f9f8212581f00700600a57ce545ba1 (patch)
tree9061ca185cd38119116333c4fee9f5d26a0619dc /src/Module.zig
parent7ed499ec4549fa7304b822446b23cff993b8fa6f (diff)
downloadzig-f75d4cbe56f9f8212581f00700600a57ce545ba1.tar.gz
zig-f75d4cbe56f9f8212581f00700600a57ce545ba1.zip
Revert "stage2: add compile log statement (#7191)"
The addition of `addDeclErr` introduced a memory leak at every call site, and I also would like to push back on having more than 1 compilation error per `Decl`. This reverts commit 1634d45f1d53c8d7bfefa56ab4d2fa4cc8218b6d.
Diffstat (limited to 'src/Module.zig')
-rw-r--r--src/Module.zig46
1 files changed, 17 insertions, 29 deletions
diff --git a/src/Module.zig b/src/Module.zig
index 5a4a76150c..c0b7011f43 100644
--- a/src/Module.zig
+++ b/src/Module.zig
@@ -53,7 +53,7 @@ decl_table: std.ArrayHashMapUnmanaged(Scope.NameHash, *Decl, Scope.name_hash_has
/// The ErrorMsg memory is owned by the decl, using Module's general purpose allocator.
/// Note that a Decl can succeed but the Fn it represents can fail. In this case,
/// a Decl can have a failed_decls entry but have analysis status of success.
-failed_decls: std.AutoArrayHashMapUnmanaged(*Decl, ArrayListUnmanaged(*Compilation.ErrorMsg)) = .{},
+failed_decls: std.AutoArrayHashMapUnmanaged(*Decl, *Compilation.ErrorMsg) = .{},
/// Using a map here for consistency with the other fields here.
/// The ErrorMsg memory is owned by the `Scope`, using Module's general purpose allocator.
failed_files: std.AutoArrayHashMapUnmanaged(*Scope, *Compilation.ErrorMsg) = .{},
@@ -849,11 +849,8 @@ pub fn deinit(self: *Module) void {
}
self.decl_table.deinit(gpa);
- for (self.failed_decls.items()) |*entry| {
- for (entry.value.items) |compile_err| {
- compile_err.destroy(gpa);
- }
- entry.value.deinit(gpa);
+ for (self.failed_decls.items()) |entry| {
+ entry.value.destroy(gpa);
}
self.failed_decls.deinit(gpa);
@@ -949,7 +946,8 @@ pub fn ensureDeclAnalyzed(self: *Module, decl: *Decl) InnerError!void {
error.OutOfMemory => return error.OutOfMemory,
error.AnalysisFail => return error.AnalysisFail,
else => {
- try self.addDeclErr(decl, try Compilation.ErrorMsg.create(
+ try self.failed_decls.ensureCapacity(self.gpa, self.failed_decls.items().len + 1);
+ self.failed_decls.putAssumeCapacityNoClobber(decl, try Compilation.ErrorMsg.create(
self.gpa,
decl.src(),
"unable to analyze: {}",
@@ -1556,7 +1554,7 @@ pub fn analyzeContainer(self: *Module, container_scope: *Scope.Container) !void
decl.analysis = .sema_failure;
const err_msg = try Compilation.ErrorMsg.create(self.gpa, tree.token_locs[name_tok].start, "redefinition of '{}'", .{decl.name});
errdefer err_msg.destroy(self.gpa);
- try self.addDeclErr(decl, err_msg);
+ try self.failed_decls.putNoClobber(self.gpa, decl, err_msg);
} else {
if (!srcHashEql(decl.contents_hash, contents_hash)) {
try self.markOutdatedDecl(decl);
@@ -1598,7 +1596,7 @@ pub fn analyzeContainer(self: *Module, container_scope: *Scope.Container) !void
decl.analysis = .sema_failure;
const err_msg = try Compilation.ErrorMsg.create(self.gpa, name_loc.start, "redefinition of '{}'", .{decl.name});
errdefer err_msg.destroy(self.gpa);
- try self.addDeclErr(decl, err_msg);
+ try self.failed_decls.putNoClobber(self.gpa, decl, err_msg);
} else if (!srcHashEql(decl.contents_hash, contents_hash)) {
try self.markOutdatedDecl(decl);
decl.contents_hash = contents_hash;
@@ -1724,11 +1722,8 @@ pub fn deleteDecl(self: *Module, decl: *Decl) !void {
try self.markOutdatedDecl(dep);
}
}
- if (self.failed_decls.remove(decl)) |*entry| {
- for (entry.value.items) |compile_err| {
- compile_err.destroy(self.gpa);
- }
- entry.value.deinit(self.gpa);
+ if (self.failed_decls.remove(decl)) |entry| {
+ entry.value.destroy(self.gpa);
}
self.deleteDeclExports(decl);
self.comp.bin_file.freeDecl(decl);
@@ -1807,11 +1802,8 @@ pub fn analyzeFnBody(self: *Module, decl: *Decl, func: *Fn) !void {
fn markOutdatedDecl(self: *Module, decl: *Decl) !void {
log.debug("mark {} outdated\n", .{decl.name});
try self.comp.work_queue.writeItem(.{ .analyze_decl = decl });
- if (self.failed_decls.remove(decl)) |*entry| {
- for (entry.value.items) |compile_err| {
- compile_err.destroy(self.gpa);
- }
- entry.value.deinit(self.gpa);
+ if (self.failed_decls.remove(decl)) |entry| {
+ entry.value.destroy(self.gpa);
}
decl.analysis = .outdated;
}
@@ -2956,14 +2948,10 @@ pub fn failNode(
return self.fail(scope, src, format, args);
}
-pub fn addDeclErr(self: *Module, decl: *Decl, err: *Compilation.ErrorMsg) error{OutOfMemory}!void {
- const entry = try self.failed_decls.getOrPutValue(self.gpa, decl, .{});
- try entry.value.append(self.gpa, err);
-}
-
fn failWithOwnedErrorMsg(self: *Module, scope: *Scope, src: usize, err_msg: *Compilation.ErrorMsg) InnerError {
{
errdefer err_msg.destroy(self.gpa);
+ try self.failed_decls.ensureCapacity(self.gpa, self.failed_decls.items().len + 1);
try self.failed_files.ensureCapacity(self.gpa, self.failed_files.items().len + 1);
}
switch (scope.tag) {
@@ -2971,7 +2959,7 @@ fn failWithOwnedErrorMsg(self: *Module, scope: *Scope, src: usize, err_msg: *Com
const decl = scope.cast(Scope.DeclAnalysis).?.decl;
decl.analysis = .sema_failure;
decl.generation = self.generation;
- try self.addDeclErr(decl, err_msg);
+ self.failed_decls.putAssumeCapacityNoClobber(decl, err_msg);
},
.block => {
const block = scope.cast(Scope.Block).?;
@@ -2981,25 +2969,25 @@ fn failWithOwnedErrorMsg(self: *Module, scope: *Scope, src: usize, err_msg: *Com
block.decl.analysis = .sema_failure;
block.decl.generation = self.generation;
}
- try self.addDeclErr(block.decl, err_msg);
+ self.failed_decls.putAssumeCapacityNoClobber(block.decl, err_msg);
},
.gen_zir => {
const gen_zir = scope.cast(Scope.GenZIR).?;
gen_zir.decl.analysis = .sema_failure;
gen_zir.decl.generation = self.generation;
- try self.addDeclErr(gen_zir.decl, err_msg);
+ self.failed_decls.putAssumeCapacityNoClobber(gen_zir.decl, err_msg);
},
.local_val => {
const gen_zir = scope.cast(Scope.LocalVal).?.gen_zir;
gen_zir.decl.analysis = .sema_failure;
gen_zir.decl.generation = self.generation;
- try self.addDeclErr(gen_zir.decl, err_msg);
+ self.failed_decls.putAssumeCapacityNoClobber(gen_zir.decl, err_msg);
},
.local_ptr => {
const gen_zir = scope.cast(Scope.LocalPtr).?.gen_zir;
gen_zir.decl.analysis = .sema_failure;
gen_zir.decl.generation = self.generation;
- try self.addDeclErr(gen_zir.decl, err_msg);
+ self.failed_decls.putAssumeCapacityNoClobber(gen_zir.decl, err_msg);
},
.zir_module => {
const zir_module = scope.cast(Scope.ZIRModule).?;