From 15dafd16e65a8cd8ea434f0b4783f08875254cd4 Mon Sep 17 00:00:00 2001 From: kcbanner Date: Thu, 27 Apr 2023 01:11:41 -0400 Subject: 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. --- src/Sema.zig | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src/Sema.zig') 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(); -- cgit v1.2.3