Audit usages of toOwnedSlice (#32001)

Followup to #30769

I grepped for `try .*toOwnedSlice` and checked all of them by hand.

Fixes a bunch of memory leaks removes usages or `errdefer` and `vars` in some places. I also switched array_list.Managed to ArrayList where it was convenient.

Reviewed-on: https://codeberg.org/ziglang/zig/pulls/32001
Reviewed-by: Andrew Kelley <andrew@ziglang.org>
This commit is contained in:
andrew.kraevskii
2026-04-22 19:35:46 +02:00
committed by Andrew Kelley
parent 03955476ad
commit bbab366b78
20 changed files with 198 additions and 182 deletions
+17 -16
View File
@@ -170,26 +170,27 @@ pub fn generate(
const prologue = isel.instructions.items.len;
const epilogue = try isel.layout(param_it, is_sysv_var_args, saved_gra_len, saved_vra_len, mod);
const instructions = try isel.instructions.toOwnedSlice(gpa);
var mir: Mir = .{
try isel.instructions.shrinkToLen(gpa);
try isel.literals.shrinkToLen(gpa);
try isel.nav_relocs.shrinkToLen(gpa);
try isel.uav_relocs.shrinkToLen(gpa);
try isel.lazy_relocs.shrinkToLen(gpa);
try isel.global_relocs.shrinkToLen(gpa);
try isel.literal_relocs.shrinkToLen(gpa);
const instructions = isel.instructions.toOwnedSliceAssert();
return .{
.prologue = instructions[prologue..epilogue],
.body = instructions[0..prologue],
.epilogue = instructions[epilogue..],
.literals = &.{},
.nav_relocs = &.{},
.uav_relocs = &.{},
.lazy_relocs = &.{},
.global_relocs = &.{},
.literal_relocs = &.{},
.literals = isel.literals.toOwnedSliceAssert(),
.nav_relocs = isel.nav_relocs.toOwnedSliceAssert(),
.uav_relocs = isel.uav_relocs.toOwnedSliceAssert(),
.lazy_relocs = isel.lazy_relocs.toOwnedSliceAssert(),
.global_relocs = isel.global_relocs.toOwnedSliceAssert(),
.literal_relocs = isel.literal_relocs.toOwnedSliceAssert(),
};
errdefer mir.deinit(gpa);
mir.literals = try isel.literals.toOwnedSlice(gpa);
mir.nav_relocs = try isel.nav_relocs.toOwnedSlice(gpa);
mir.uav_relocs = try isel.uav_relocs.toOwnedSlice(gpa);
mir.lazy_relocs = try isel.lazy_relocs.toOwnedSlice(gpa);
mir.global_relocs = try isel.global_relocs.toOwnedSlice(gpa);
mir.literal_relocs = try isel.literal_relocs.toOwnedSlice(gpa);
return mir;
}
test {
+4 -5
View File
@@ -324,13 +324,12 @@ pub fn generate(
else => |e| return e,
};
var mir: Mir = .{
try function.mir_extra.shrinkToLen(gpa);
return .{
.instructions = function.mir_instructions.toOwnedSlice(),
.extra = &.{}, // fallible, so populated after errdefer
.extra = function.mir_extra.toOwnedSliceAssert(),
};
errdefer mir.deinit(gpa);
mir.extra = try function.mir_extra.toOwnedSlice(gpa);
return mir;
}
fn gen(self: *Self) !void {
+6 -7
View File
@@ -852,10 +852,13 @@ fn generateInner(cg: *CodeGen, any_returns: bool) InnerError!Mir {
try cg.addTag(.end);
try cg.addTag(.dbg_epilogue_begin);
var mir: Mir = .{
try cg.mir_extra.shrinkToLen(cg.gpa);
try cg.mir_locals.shrinkToLen(cg.gpa);
return .{
.instructions = cg.mir_instructions.toOwnedSlice(),
.extra = &.{}, // fallible so assigned after errdefer
.locals = &.{}, // fallible so assigned after errdefer
.extra = cg.mir_extra.toOwnedSliceAssert(),
.locals = cg.mir_locals.toOwnedSliceAssert(),
.prologue = if (cg.initial_stack_value == .none) .none else .{
.sp_local = cg.initial_stack_value.local.value,
.flags = .{ .stack_alignment = cg.stack_alignment },
@@ -867,10 +870,6 @@ fn generateInner(cg: *CodeGen, any_returns: bool) InnerError!Mir {
.func_tys = cg.mir_func_tys.move(),
.error_name_table_ref_count = cg.error_name_table_ref_count,
};
errdefer mir.deinit(cg.gpa);
mir.extra = try cg.mir_extra.toOwnedSlice(cg.gpa);
mir.locals = try cg.mir_locals.toOwnedSlice(cg.gpa);
return mir;
}
const CallWValues = struct {
+12 -15
View File
@@ -998,22 +998,19 @@ pub fn generate(
} },
});
var mir: Mir = .{
.instructions = .empty,
.extra = &.{},
.string_bytes = &.{},
.locals = &.{},
.table = &.{},
.frame_locs = .empty,
try function.mir_extra.shrinkToLen(gpa);
try function.mir_string_bytes.shrinkToLen(gpa);
try function.mir_locals.shrinkToLen(gpa);
try function.mir_table.shrinkToLen(gpa);
return .{
.instructions = function.mir_instructions.toOwnedSlice(),
.extra = function.mir_extra.toOwnedSliceAssert(),
.string_bytes = function.mir_string_bytes.toOwnedSliceAssert(),
.locals = function.mir_locals.toOwnedSliceAssert(),
.table = function.mir_table.toOwnedSliceAssert(),
.frame_locs = function.frame_locs.toOwnedSlice(),
};
errdefer mir.deinit(gpa);
mir.instructions = function.mir_instructions.toOwnedSlice();
mir.extra = try function.mir_extra.toOwnedSlice(gpa);
mir.string_bytes = try function.mir_string_bytes.toOwnedSlice(gpa);
mir.locals = try function.mir_locals.toOwnedSlice(gpa);
mir.table = try function.mir_table.toOwnedSlice(gpa);
mir.frame_locs = function.frame_locs.toOwnedSlice();
return mir;
}
pub fn getTmpMir(cg: *CodeGen) Mir {