authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-11-08 09:52:08-05:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-11-09 03:31:26-05:00
logd33c00cad024c15e4fae84317d24d816eaf3da3a
tree5835369c6364f687308b49a0282e19c33c0586cc
parent02a241f472bf0c5146ab73c105767178e4822a47

MappedFile: avoid allocating file space with inconsistent state


1 files changed, 12 insertions(+), 25 deletions(-)

src/link/MappedFile.zig+12-25
......@@ -486,6 +486,14 @@ fn addNode(mf: *MappedFile, gpa: std.mem.Allocator, opts: struct {
486486 break :free .{ free_ni, free_node };
487487 },
488488 };
489 switch (opts.prev) {
490 .none => opts.parent.get(mf).first = free_ni,
491 else => |prev_ni| prev_ni.get(mf).next = free_ni,
492 }
493 switch (opts.next) {
494 .none => opts.parent.get(mf).last = free_ni,
495 else => |next_ni| next_ni.get(mf).prev = free_ni,
496 }
489497 free_node.* = .{
490498 .parent = opts.parent,
491499 .prev = opts.prev,
......@@ -535,13 +543,10 @@ pub fn addOnlyChildNode(
535543 try mf.nodes.ensureUnusedCapacity(gpa, 1);
536544 const parent = parent_ni.get(mf);
537545 assert(parent.first == .none and parent.last == .none);
538 const ni = try mf.addNode(gpa, .{
546 return mf.addNode(gpa, .{
539547 .parent = parent_ni,
540548 .add_node = opts,
541549 });
542 parent.first = ni;
543 parent.last = ni;
544 return ni;
545550}
546551
547552pub fn addFirstChildNode(
......@@ -552,17 +557,11 @@ pub fn addFirstChildNode(
552557) !Node.Index {
553558 try mf.nodes.ensureUnusedCapacity(gpa, 1);
554559 const parent = parent_ni.get(mf);
555 const ni = try mf.addNode(gpa, .{
560 return mf.addNode(gpa, .{
556561 .parent = parent_ni,
557562 .next = parent.first,
558563 .add_node = opts,
559564 });
560 switch (parent.first) {
561 .none => parent.last = ni,
562 else => |first_ni| first_ni.get(mf).prev = ni,
563 }
564 parent.first = ni;
565 return ni;
566565}
567566
568567pub fn addLastChildNode(
......@@ -573,7 +572,7 @@ pub fn addLastChildNode(
573572) !Node.Index {
574573 try mf.nodes.ensureUnusedCapacity(gpa, 1);
575574 const parent = parent_ni.get(mf);
576 const ni = try mf.addNode(gpa, .{
575 return mf.addNode(gpa, .{
577576 .parent = parent_ni,
578577 .prev = parent.last,
579578 .offset = offset: switch (parent.last) {
......@@ -585,12 +584,6 @@ pub fn addLastChildNode(
585584 },
586585 .add_node = opts,
587586 });
588 switch (parent.last) {
589 .none => parent.first = ni,
590 else => |last_ni| last_ni.get(mf).next = ni,
591 }
592 parent.last = ni;
593 return ni;
594587}
595588
596589pub fn addNodeAfter(
......@@ -603,19 +596,13 @@ pub fn addNodeAfter(
603596 try mf.nodes.ensureUnusedCapacity(gpa, 1);
604597 const prev = prev_ni.get(mf);
605598 const prev_offset, const prev_size = prev.location().resolve(mf);
606 const ni = try mf.addNode(gpa, .{
599 return mf.addNode(gpa, .{
607600 .parent = prev.parent,
608601 .prev = prev_ni,
609602 .next = prev.next,
610603 .offset = prev_offset + prev_size,
611604 .add_node = opts,
612605 });
613 switch (prev.next) {
614 .none => prev.parent.get(mf).last = ni,
615 else => |next_ni| next_ni.get(mf).prev = ni,
616 }
617 prev.next = ni;
618 return ni;
619606}
620607
621608fn resizeNode(mf: *MappedFile, gpa: std.mem.Allocator, ni: Node.Index, requested_size: u64) !void {