mirror of
https://github.com/roc-lang/roc.git
synced 2025-12-23 08:48:03 +00:00
Introduce CompactWriter.deinit()
This commit is contained in:
parent
c1af137336
commit
6dd4d5d28d
5 changed files with 45 additions and 41 deletions
|
|
@ -370,7 +370,7 @@ test "Ident.Store empty CompactWriter roundtrip" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
_ = try original.serialize(gpa, &writer);
|
||||
|
||||
|
|
@ -432,7 +432,7 @@ test "Ident.Store basic CompactWriter roundtrip" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
_ = try original.serialize(gpa, &writer);
|
||||
|
||||
|
|
@ -500,7 +500,7 @@ test "Ident.Store with genUnique CompactWriter roundtrip" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
_ = try original.serialize(gpa, &writer);
|
||||
|
||||
|
|
@ -560,7 +560,7 @@ test "Ident.Store frozen state CompactWriter roundtrip" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
_ = try original.serialize(gpa, &writer);
|
||||
|
||||
|
|
@ -637,7 +637,7 @@ test "Ident.Store comprehensive CompactWriter roundtrip" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
_ = try original.serialize(gpa, &writer);
|
||||
|
||||
|
|
@ -710,7 +710,7 @@ test "Ident.Store multiple stores CompactWriter roundtrip" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
_ = try store1.serialize(gpa, &writer);
|
||||
const offset1 = writer.total_bytes - @sizeOf(Store);
|
||||
|
|
|
|||
|
|
@ -115,9 +115,9 @@ pub fn serialize(
|
|||
allocator: std.mem.Allocator,
|
||||
writer: *collections.CompactWriter,
|
||||
) std.mem.Allocator.Error!*const Self {
|
||||
// First, write the struct with an empty hash map
|
||||
// First, write the struct
|
||||
const offset_self = try writer.appendAlloc(allocator, Self);
|
||||
|
||||
|
||||
// Then serialize the bytes SafeList and update the struct
|
||||
offset_self.* = .{
|
||||
.bytes = (try self.bytes.serialize(allocator, writer)).*,
|
||||
|
|
@ -131,7 +131,6 @@ pub fn serialize(
|
|||
|
||||
/// Add the given offset to the memory addresses of all pointers in `self`.
|
||||
pub fn relocate(self: *Self, offset: isize) void {
|
||||
// Relocate the bytes SafeList
|
||||
self.bytes.relocate(offset);
|
||||
|
||||
// The strings hash map is always empty after deserialization,
|
||||
|
|
@ -158,7 +157,7 @@ test "SmallStringInterner empty CompactWriter roundtrip" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
_ = try original.serialize(gpa, &writer);
|
||||
|
||||
|
|
@ -227,7 +226,7 @@ test "SmallStringInterner basic CompactWriter roundtrip" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
_ = try original.serialize(gpa, &writer);
|
||||
|
||||
|
|
@ -300,7 +299,7 @@ test "SmallStringInterner with populated hashmap CompactWriter roundtrip" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
_ = try original.serialize(gpa, &writer);
|
||||
|
||||
|
|
@ -369,7 +368,7 @@ test "SmallStringInterner frozen state CompactWriter roundtrip" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
_ = try original.serialize(gpa, &writer);
|
||||
|
||||
|
|
@ -439,7 +438,7 @@ test "SmallStringInterner edge cases CompactWriter roundtrip" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
_ = try original.serialize(gpa, &writer);
|
||||
|
||||
|
|
@ -505,7 +504,7 @@ test "SmallStringInterner multiple interners CompactWriter roundtrip" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
_ = try interner1.serialize(gpa, &writer);
|
||||
const offset1 = writer.total_bytes - @sizeOf(Self);
|
||||
|
|
|
|||
|
|
@ -1369,7 +1369,7 @@ test "SafeList(u32) CompactWriter roundtrip with file" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
_ = try original.serialize(gpa, &writer);
|
||||
|
||||
|
|
@ -1428,7 +1428,7 @@ test "SafeList(struct) CompactWriter roundtrip with file" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
_ = try original.serialize(gpa, &writer);
|
||||
|
||||
|
|
@ -1476,7 +1476,7 @@ test "SafeList empty list CompactWriter roundtrip" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
_ = try original.serialize(gpa, &writer);
|
||||
|
||||
|
|
@ -1539,7 +1539,7 @@ test "SafeList empty lists CompactWriter roundtrip multiple types" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
_ = try list1.serialize(gpa, &writer);
|
||||
const offset1 = writer.total_bytes - @sizeOf(SafeList(T));
|
||||
|
|
@ -1598,7 +1598,7 @@ test "SafeList CompactWriter verify offset calculation" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
const serialized_ptr = try list.serialize(gpa, &writer);
|
||||
|
||||
|
|
@ -1631,7 +1631,7 @@ test "SafeList CompactWriter complete roundtrip example" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
// Step 3: Serialize - this writes data first, then the SafeList struct
|
||||
const serialized_ptr = try original.serialize(gpa, &writer);
|
||||
|
|
@ -1719,7 +1719,7 @@ test "SafeList CompactWriter multiple lists with different alignments" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
// Serialize all lists and track their positions
|
||||
const ptr_u8 = try list_u8.serialize(gpa, &writer);
|
||||
|
|
@ -1815,7 +1815,7 @@ test "SafeList CompactWriter interleaved pattern with alignment tracking" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
// Track offsets as we go
|
||||
var offsets = std.ArrayList(usize).init(gpa);
|
||||
|
|
@ -1964,7 +1964,7 @@ test "SafeList CompactWriter brute-force alignment verification" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
// Serialize in pattern: list1, u8 list, list2
|
||||
// This tests alignment padding between different types
|
||||
|
|
@ -2055,7 +2055,7 @@ test "SafeMultiList CompactWriter roundtrip with file" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
_ = try original.serialize(gpa, &writer);
|
||||
|
||||
|
|
@ -2122,7 +2122,7 @@ test "SafeMultiList empty list CompactWriter roundtrip" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
_ = try original.serialize(gpa, &writer);
|
||||
|
||||
|
|
@ -2192,7 +2192,7 @@ test "SafeMultiList CompactWriter multiple lists different alignments" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
// Serialize all lists
|
||||
_ = try list1.serialize(gpa, &writer);
|
||||
|
|
@ -2272,7 +2272,7 @@ test "SafeMultiList CompactWriter field access after deserialization" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
_ = try original.serialize(gpa, &writer);
|
||||
|
||||
|
|
@ -2369,7 +2369,7 @@ test "SafeMultiList CompactWriter brute-force alignment verification" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
_ = try list.serialize(gpa, &writer);
|
||||
const offset1 = writer.total_bytes - @sizeOf(SafeMultiList(TestType));
|
||||
|
|
@ -2467,7 +2467,7 @@ test "SafeMultiList CompactWriter various field alignments and sizes" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
_ = try list.serialize(gpa, &writer);
|
||||
try writer.writeGather(gpa, file);
|
||||
|
|
@ -2567,7 +2567,7 @@ test "SafeMultiList CompactWriter verify exact memory layout" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
_ = try original.serialize(gpa, &writer);
|
||||
try writer.writeGather(gpa, file);
|
||||
|
|
@ -2658,7 +2658,7 @@ test "SafeMultiList CompactWriter stress test many field types" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
_ = try list.serialize(gpa, &writer);
|
||||
try writer.writeGather(gpa, file);
|
||||
|
|
@ -2727,7 +2727,7 @@ test "SafeMultiList CompactWriter empty with capacity" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(gpa);
|
||||
defer writer.deinit(gpa);
|
||||
|
||||
_ = try list.serialize(gpa, &writer);
|
||||
try writer.writeGather(gpa, file);
|
||||
|
|
|
|||
|
|
@ -125,7 +125,7 @@ pub const CompactWriter = struct {
|
|||
try self.padToAlignment(allocator, alignment);
|
||||
|
||||
const offset = self.total_bytes;
|
||||
|
||||
|
||||
try self.iovecs.append(allocator, .{
|
||||
.iov_base = @ptrCast(@as([*]const u8, @ptrCast(slice.ptr))),
|
||||
.iov_len = size * len,
|
||||
|
|
@ -170,6 +170,11 @@ pub const CompactWriter = struct {
|
|||
|
||||
return buffer[0..self.total_bytes];
|
||||
}
|
||||
|
||||
/// Deinitialize the CompactWriter, freeing all allocated memory
|
||||
pub fn deinit(self: *@This(), allocator: std.mem.Allocator) void {
|
||||
self.iovecs.deinit(allocator);
|
||||
}
|
||||
};
|
||||
|
||||
const Iovec = extern struct {
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ test "CompactWriter basic functionality" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(allocator);
|
||||
defer writer.deinit(allocator);
|
||||
|
||||
// Test appendAlloc
|
||||
const test_struct = struct {
|
||||
|
|
@ -44,7 +44,7 @@ test "CompactWriter appendSlice" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(allocator);
|
||||
defer writer.deinit(allocator);
|
||||
|
||||
// Create some test data
|
||||
const data = [_]u32{ 1, 2, 3, 4, 5 };
|
||||
|
|
@ -67,7 +67,7 @@ test "CompactWriter alignment padding" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(allocator);
|
||||
defer writer.deinit(allocator);
|
||||
|
||||
// First append a u8 (1-byte aligned)
|
||||
const byte_ptr = try writer.appendAlloc(allocator, u8);
|
||||
|
|
@ -94,7 +94,7 @@ test "CompactWriter multiple allocations" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(allocator);
|
||||
defer writer.deinit(allocator);
|
||||
|
||||
// Append multiple items
|
||||
const item1 = try writer.appendAlloc(allocator, u64);
|
||||
|
|
@ -123,7 +123,7 @@ test "CompactWriter up-front padding with various alignments" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(allocator);
|
||||
defer writer.deinit(allocator);
|
||||
|
||||
// Start with u8 (1-byte aligned)
|
||||
_ = try writer.appendAlloc(allocator, u8);
|
||||
|
|
@ -162,7 +162,7 @@ test "CompactWriter slice alignment" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(allocator);
|
||||
defer writer.deinit(allocator);
|
||||
|
||||
// Start with a u8
|
||||
_ = try writer.appendAlloc(allocator, u8);
|
||||
|
|
@ -200,7 +200,7 @@ test "CompactWriter brute-force appendSlice alignment" {
|
|||
.iovecs = .{},
|
||||
.total_bytes = 0,
|
||||
};
|
||||
defer writer.iovecs.deinit(allocator);
|
||||
defer writer.deinit(allocator);
|
||||
|
||||
// Create test data
|
||||
var data: [8]T = undefined;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue