| ... | ... | @@ -334,6 +334,7 @@ pub const Node = extern struct { |
| 334 | 334 | } |
| 335 | 335 | |
| 336 | 336 | pub fn resize(ni: Node.Index, mf: *MappedFile, gpa: std.mem.Allocator, size: u64) Error!void { |
| 337 | defer if (std.debug.runtime_safety) mf.verify(); |
| 337 | 338 | mf.resizeNode(gpa, ni, size) catch |err| switch (err) { |
| 338 | 339 | error.OutOfMemory, |
| 339 | 340 | error.Canceled, |
| ... | ... | @@ -900,6 +901,7 @@ fn resizeNode(mf: *MappedFile, gpa: std.mem.Allocator, ni: Node.Index, requested |
| 900 | 901 | var last_fixed_ni = ni; |
| 901 | 902 | var first_floating_ni = node.next; |
| 902 | 903 | var shift = new_size - old_size; |
| 904 | var max_shift_align: std.mem.Alignment = .@"1"; |
| 903 | 905 | var direction: enum { forward, reverse } = .forward; |
| 904 | 906 | while (true) { |
| 905 | 907 | assert(last_fixed_ni != .none); |
| ... | ... | @@ -916,9 +918,9 @@ fn resizeNode(mf: *MappedFile, gpa: std.mem.Allocator, ni: Node.Index, requested |
| 916 | 918 | if (new_last_fixed_offset + last_fixed_size <= old_first_floating_offset) |
| 917 | 919 | break :make_space; |
| 918 | 920 | assert(direction == .forward); |
| 919 | | const shift_alignment = first_floating.flags.alignment.max(last_fixed.flags.alignment); |
| 921 | max_shift_align = max_shift_align.max(first_floating.flags.alignment.max(last_fixed.flags.alignment)); |
| 920 | 922 | if (first_floating.flags.fixed) { |
| 921 | | shift = shift_alignment.forward(@intCast( |
| 923 | shift = max_shift_align.forward(@intCast( |
| 922 | 924 | @max(shift, first_floating_size), |
| 923 | 925 | )); |
| 924 | 926 | |
| ... | ... | @@ -930,7 +932,7 @@ fn resizeNode(mf: *MappedFile, gpa: std.mem.Allocator, ni: Node.Index, requested |
| 930 | 932 | // Move the found floating node to make space for preceding fixed nodes |
| 931 | 933 | const last = parent.last.get(mf); |
| 932 | 934 | const last_offset, const last_size = last.location().resolve(mf); |
| 933 | | const new_first_floating_offset = shift_alignment.forward( |
| 935 | const new_first_floating_offset = max_shift_align.forward( |
| 934 | 936 | @intCast(@max(new_last_fixed_offset + last_fixed_size, last_offset + last_size)), |
| 935 | 937 | ); |
| 936 | 938 | const new_parent_size = new_first_floating_offset + first_floating_size; |
| ... | ... | @@ -991,7 +993,7 @@ fn resizeNode(mf: *MappedFile, gpa: std.mem.Allocator, ni: Node.Index, requested |
| 991 | 993 | last_fixed_ni.setLocationAssumeCapacity( |
| 992 | 994 | mf, |
| 993 | 995 | old_last_fixed_offset, |
| 994 | | last_fixed_size + shift, |
| 996 | new_size, |
| 995 | 997 | ); |
| 996 | 998 | return; |
| 997 | 999 | } |