| ... | @@ -910,6 +910,8 @@ fn analyzeRoot(self: *Module, root_scope: *Scope.ZIRModule) !void { | ... | @@ -910,6 +910,8 @@ fn analyzeRoot(self: *Module, root_scope: *Scope.ZIRModule) !void { |
| 910 | } | 910 | } |
| 911 | | 911 | |
| 912 | fn deleteDecl(self: *Module, decl: *Decl) !void { | 912 | fn deleteDecl(self: *Module, decl: *Decl) !void { |
| | 913 | try self.deletion_set.ensureCapacity(self.allocator, self.deletion_set.items.len + decl.dependencies.items.len); |
| | 914 | |
| 913 | //std.debug.warn("deleting decl '{}'\n", .{decl.name}); | 915 | //std.debug.warn("deleting decl '{}'\n", .{decl.name}); |
| 914 | const name_hash = decl.fullyQualifiedNameHash(); | 916 | const name_hash = decl.fullyQualifiedNameHash(); |
| 915 | self.decl_table.removeAssertDiscard(name_hash); | 917 | self.decl_table.removeAssertDiscard(name_hash); |
| ... | @@ -921,16 +923,20 @@ fn deleteDecl(self: *Module, decl: *Decl) !void { | ... | @@ -921,16 +923,20 @@ fn deleteDecl(self: *Module, decl: *Decl) !void { |
| 921 | // another reference to it may turn up. | 923 | // another reference to it may turn up. |
| 922 | assert(!dep.deletion_flag); | 924 | assert(!dep.deletion_flag); |
| 923 | dep.deletion_flag = true; | 925 | dep.deletion_flag = true; |
| 924 | try self.deletion_set.append(self.allocator, dep); | 926 | self.deletion_set.appendAssumeCapacity(dep); |
| 925 | } | 927 | } |
| 926 | } | 928 | } |
| 927 | // Anything that depends on this deleted decl certainly needs to be re-analyzed. | 929 | // Anything that depends on this deleted decl certainly needs to be re-analyzed. |
| 928 | for (decl.dependants.items) |dep| { | 930 | for (decl.dependants.items) |dep| { |
| 929 | dep.removeDependency(decl); | 931 | dep.removeDependency(decl); |
| 930 | if (dep.analysis != .outdated) { | 932 | if (dep.analysis != .outdated) { |
| | 933 | // TODO Move this failure possibility to the top of the function. |
| 931 | try self.markOutdatedDecl(dep); | 934 | try self.markOutdatedDecl(dep); |
| 932 | } | 935 | } |
| 933 | } | 936 | } |
| | 937 | if (self.failed_decls.remove(decl)) |entry| { |
| | 938 | self.allocator.destroy(entry.value); |
| | 939 | } |
| 934 | self.deleteDeclExports(decl); | 940 | self.deleteDeclExports(decl); |
| 935 | self.bin_file.freeDecl(decl); | 941 | self.bin_file.freeDecl(decl); |
| 936 | decl.destroy(self.allocator); | 942 | decl.destroy(self.allocator); |