aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorkcbanner <kcbanner@gmail.com>2023-04-27 01:11:41 -0400
committerkcbanner <kcbanner@gmail.com>2023-04-27 01:11:57 -0400
commit15dafd16e65a8cd8ea434f0b4783f08875254cd4 (patch)
tree3d375de60cb43e1a353994cc101f4efb3bfc023e /src/Sema.zig
parent2b592d7e3cf328deb1b8ffa7ea88389d785837ff (diff)
downloadzig-15dafd16e65a8cd8ea434f0b4783f08875254cd4.tar.gz
zig-15dafd16e65a8cd8ea434f0b4783f08875254cd4.zip
sema: add `prev` to ValueArena to allow freeing previous arenas when new ones are created during re-analysis
In semaDecl, it was possible for a new ArenaAllocators state to replace an existing one that hadn't been freed yet. Instead of the ref_count (which was made redundant by adding the allocator parameter to `release`), I now store a pointer to the previous arena, if one exists. This allows a recursive deinit to happen when the last arena created is destroyed.
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig12
1 files changed, 6 insertions, 6 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index e836f1610a..8b47f1877b 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -2858,7 +2858,7 @@ fn zirEnumDecl(
var decl_arena: std.heap.ArenaAllocator = undefined;
const decl_arena_allocator = new_decl.value_arena.?.acquire(gpa, &decl_arena);
- defer new_decl.value_arena.?.release();
+ defer new_decl.value_arena.?.release(&decl_arena);
extra_index = try mod.scanNamespace(&enum_obj.namespace, extra_index, decls_len, new_decl);
@@ -27004,7 +27004,7 @@ const ComptimePtrMutationKit = struct {
fn finishArena(self: *ComptimePtrMutationKit, mod: *Module) void {
const decl = mod.declPtr(self.decl_ref_mut.decl_index);
- decl.value_arena.?.release();
+ decl.value_arena.?.release(&self.decl_arena);
self.decl_arena = undefined;
}
};
@@ -30655,7 +30655,7 @@ fn resolveStructLayout(sema: *Sema, ty: Type) CompileError!void {
const decl = sema.mod.declPtr(struct_obj.owner_decl);
var decl_arena: std.heap.ArenaAllocator = undefined;
const decl_arena_allocator = decl.value_arena.?.acquire(sema.mod.gpa, &decl_arena);
- defer decl.value_arena.?.release();
+ defer decl.value_arena.?.release(&decl_arena);
break :blk try decl_arena_allocator.alloc(u32, struct_obj.fields.count());
};
@@ -30701,7 +30701,7 @@ fn semaBackingIntType(mod: *Module, struct_obj: *Module.Struct) CompileError!voi
const decl = mod.declPtr(decl_index);
var decl_arena: std.heap.ArenaAllocator = undefined;
const decl_arena_allocator = decl.value_arena.?.acquire(gpa, &decl_arena);
- defer decl.value_arena.?.release();
+ defer decl.value_arena.?.release(&decl_arena);
const zir = struct_obj.namespace.file_scope.zir;
const extended = zir.instructions.items(.data)[struct_obj.zir_index].extended;
@@ -31395,7 +31395,7 @@ fn semaStructFields(mod: *Module, struct_obj: *Module.Struct) CompileError!void
const decl = mod.declPtr(decl_index);
var decl_arena: std.heap.ArenaAllocator = undefined;
const decl_arena_allocator = decl.value_arena.?.acquire(gpa, &decl_arena);
- defer decl.value_arena.?.release();
+ defer decl.value_arena.?.release(&decl_arena);
var analysis_arena = std.heap.ArenaAllocator.init(gpa);
defer analysis_arena.deinit();
@@ -31735,7 +31735,7 @@ fn semaUnionFields(mod: *Module, union_obj: *Module.Union) CompileError!void {
const decl = mod.declPtr(decl_index);
var decl_arena: std.heap.ArenaAllocator = undefined;
const decl_arena_allocator = decl.value_arena.?.acquire(gpa, &decl_arena);
- defer decl.value_arena.?.release();
+ defer decl.value_arena.?.release(&decl_arena);
var analysis_arena = std.heap.ArenaAllocator.init(gpa);
defer analysis_arena.deinit();