mirror of
https://github.com/ziglang/zig.git
synced 2026-02-02 20:53:44 +00:00
Sema: remove leftover references to value_arena
Notably, there was a bug where the fields of reified structs and unions were allocated into an arena which was leaked. These are now in the Module.tmp_hack_arena.
This commit is contained in:
parent
7a59cd2863
commit
0f80652efb
52
src/Sema.zig
52
src/Sema.zig
@ -702,24 +702,15 @@ pub const Block = struct {
|
||||
pub fn startAnonDecl(block: *Block) !WipAnonDecl {
|
||||
return WipAnonDecl{
|
||||
.block = block,
|
||||
.new_decl_arena = std.heap.ArenaAllocator.init(block.sema.gpa),
|
||||
.finished = false,
|
||||
};
|
||||
}
|
||||
|
||||
pub const WipAnonDecl = struct {
|
||||
block: *Block,
|
||||
new_decl_arena: std.heap.ArenaAllocator,
|
||||
finished: bool,
|
||||
|
||||
pub fn arena(wad: *WipAnonDecl) Allocator {
|
||||
return wad.new_decl_arena.allocator();
|
||||
}
|
||||
|
||||
pub fn deinit(wad: *WipAnonDecl) void {
|
||||
if (!wad.finished) {
|
||||
wad.new_decl_arena.deinit();
|
||||
}
|
||||
wad.* = undefined;
|
||||
}
|
||||
|
||||
@ -2774,9 +2765,6 @@ fn zirStructDecl(
|
||||
break :blk LazySrcLoc.nodeOffset(node_offset);
|
||||
} else sema.src;
|
||||
|
||||
var new_decl_arena = std.heap.ArenaAllocator.init(gpa);
|
||||
errdefer new_decl_arena.deinit();
|
||||
|
||||
// Because these three things each reference each other, `undefined`
|
||||
// placeholders are used before being set after the struct type gains an
|
||||
// InternPool index.
|
||||
@ -3230,9 +3218,6 @@ fn zirUnionDecl(
|
||||
break :blk decls_len;
|
||||
} else 0;
|
||||
|
||||
var new_decl_arena = std.heap.ArenaAllocator.init(gpa);
|
||||
errdefer new_decl_arena.deinit();
|
||||
|
||||
// Because these three things each reference each other, `undefined`
|
||||
// placeholders are used before being set after the union type gains an
|
||||
// InternPool index.
|
||||
@ -3297,7 +3282,6 @@ fn zirOpaqueDecl(
|
||||
defer tracy.end();
|
||||
|
||||
const mod = sema.mod;
|
||||
const gpa = sema.gpa;
|
||||
const small = @bitCast(Zir.Inst.OpaqueDecl.Small, extended.small);
|
||||
var extra_index: usize = extended.operand;
|
||||
|
||||
@ -3313,9 +3297,6 @@ fn zirOpaqueDecl(
|
||||
break :blk decls_len;
|
||||
} else 0;
|
||||
|
||||
var new_decl_arena = std.heap.ArenaAllocator.init(gpa);
|
||||
errdefer new_decl_arena.deinit();
|
||||
|
||||
// Because these three things each reference each other, `undefined`
|
||||
// placeholders are used in two places before being set after the opaque
|
||||
// type gains an InternPool index.
|
||||
@ -3691,7 +3672,7 @@ fn zirMakePtrConst(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErro
|
||||
defer anon_decl.deinit();
|
||||
return sema.analyzeDeclRef(try anon_decl.finish(
|
||||
elem_ty,
|
||||
try store_val.copy(anon_decl.arena()),
|
||||
store_val,
|
||||
ptr_info.@"align",
|
||||
));
|
||||
}
|
||||
@ -3937,7 +3918,7 @@ fn zirResolveInferredAlloc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Com
|
||||
defer anon_decl.deinit();
|
||||
const new_decl_index = try anon_decl.finish(
|
||||
final_elem_ty,
|
||||
try store_val.copy(anon_decl.arena()),
|
||||
store_val,
|
||||
ia1.alignment.toByteUnits(0),
|
||||
);
|
||||
break :d new_decl_index;
|
||||
@ -5168,7 +5149,7 @@ fn storeToInferredAllocComptime(
|
||||
defer anon_decl.deinit();
|
||||
iac.decl_index = try anon_decl.finish(
|
||||
operand_ty,
|
||||
try operand_val.copy(anon_decl.arena()),
|
||||
operand_val,
|
||||
iac.alignment.toByteUnits(0),
|
||||
);
|
||||
return;
|
||||
@ -5860,7 +5841,7 @@ fn zirExportValue(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
|
||||
defer anon_decl.deinit();
|
||||
break :blk try anon_decl.finish(
|
||||
operand.ty,
|
||||
try operand.val.copy(anon_decl.arena()),
|
||||
operand.val,
|
||||
0,
|
||||
);
|
||||
};
|
||||
@ -15895,7 +15876,7 @@ fn zirBuiltinSrc(
|
||||
var anon_decl = try block.startAnonDecl();
|
||||
defer anon_decl.deinit();
|
||||
// The compiler must not call realpath anywhere.
|
||||
const name = try fn_owner_decl.getFileScope(mod).fullPathZ(anon_decl.arena());
|
||||
const name = try fn_owner_decl.getFileScope(mod).fullPathZ(sema.arena);
|
||||
const new_decl_ty = try mod.arrayType(.{
|
||||
.len = name.len,
|
||||
.child = .u8_type,
|
||||
@ -18792,7 +18773,7 @@ fn addConstantMaybeRef(
|
||||
defer anon_decl.deinit();
|
||||
const decl = try anon_decl.finish(
|
||||
ty,
|
||||
try val.copy(anon_decl.arena()),
|
||||
val,
|
||||
0, // default alignment
|
||||
);
|
||||
return sema.analyzeDeclRef(decl);
|
||||
@ -19515,9 +19496,6 @@ fn zirReify(
|
||||
return sema.fail(block, src, "reified opaque must have no decls", .{});
|
||||
}
|
||||
|
||||
var new_decl_arena = std.heap.ArenaAllocator.init(gpa);
|
||||
errdefer new_decl_arena.deinit();
|
||||
|
||||
// Because these three things each reference each other,
|
||||
// `undefined` placeholders are used in two places before being set
|
||||
// after the opaque type gains an InternPool index.
|
||||
@ -19572,10 +19550,6 @@ fn zirReify(
|
||||
}
|
||||
const layout = mod.toEnum(std.builtin.Type.ContainerLayout, layout_val);
|
||||
|
||||
var new_decl_arena = std.heap.ArenaAllocator.init(gpa);
|
||||
errdefer new_decl_arena.deinit();
|
||||
const new_decl_arena_allocator = new_decl_arena.allocator();
|
||||
|
||||
// Because these three things each reference each other, `undefined`
|
||||
// placeholders are used before being set after the union type gains an
|
||||
// InternPool index.
|
||||
@ -19645,7 +19619,7 @@ fn zirReify(
|
||||
}
|
||||
|
||||
// Fields
|
||||
try union_obj.fields.ensureTotalCapacity(new_decl_arena_allocator, fields_len);
|
||||
try union_obj.fields.ensureTotalCapacity(mod.tmp_hack_arena.allocator(), fields_len);
|
||||
|
||||
for (0..fields_len) |i| {
|
||||
const elem_val = try fields_val.elemValue(mod, i);
|
||||
@ -19873,10 +19847,6 @@ fn reifyStruct(
|
||||
const gpa = sema.gpa;
|
||||
const ip = &mod.intern_pool;
|
||||
|
||||
var new_decl_arena = std.heap.ArenaAllocator.init(gpa);
|
||||
errdefer new_decl_arena.deinit();
|
||||
const new_decl_arena_allocator = new_decl_arena.allocator();
|
||||
|
||||
// Because these three things each reference each other, `undefined`
|
||||
// placeholders are used before being set after the struct type gains an
|
||||
// InternPool index.
|
||||
@ -19921,7 +19891,7 @@ fn reifyStruct(
|
||||
|
||||
// Fields
|
||||
const fields_len = try sema.usizeCast(block, src, fields_val.sliceLen(mod));
|
||||
try struct_obj.fields.ensureTotalCapacity(new_decl_arena_allocator, fields_len);
|
||||
try struct_obj.fields.ensureTotalCapacity(mod.tmp_hack_arena.allocator(), fields_len);
|
||||
var i: usize = 0;
|
||||
while (i < fields_len) : (i += 1) {
|
||||
const elem_val = try fields_val.elemValue(mod, i);
|
||||
@ -20209,7 +20179,7 @@ fn zirTypeName(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
|
||||
var anon_decl = try block.startAnonDecl();
|
||||
defer anon_decl.deinit();
|
||||
|
||||
const bytes = try ty.nameAllocArena(anon_decl.arena(), mod);
|
||||
const bytes = try ty.nameAllocArena(sema.arena, mod);
|
||||
|
||||
const decl_ty = try mod.arrayType(.{
|
||||
.len = bytes.len,
|
||||
@ -29740,7 +29710,7 @@ fn refValue(sema: *Sema, block: *Block, ty: Type, val: Value) !Value {
|
||||
defer anon_decl.deinit();
|
||||
const decl = try anon_decl.finish(
|
||||
ty,
|
||||
try val.copy(anon_decl.arena()),
|
||||
val,
|
||||
0, // default alignment
|
||||
);
|
||||
try sema.maybeQueueFuncBodyAnalysis(decl);
|
||||
@ -29824,7 +29794,7 @@ fn analyzeRef(
|
||||
defer anon_decl.deinit();
|
||||
return sema.analyzeDeclRef(try anon_decl.finish(
|
||||
operand_ty,
|
||||
try val.copy(anon_decl.arena()),
|
||||
val,
|
||||
0, // default alignment
|
||||
));
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user