Skip to content

Commit b37eaa1

Browse files
committed
MappedFile: avoid allocating file space with inconsistent state
1 parent 438685f commit b37eaa1

File tree

1 file changed

+12
-25
lines changed

1 file changed

+12
-25
lines changed

src/link/MappedFile.zig

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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

547552
pub 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

568567
pub 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

596589
pub 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

621608
fn resizeNode(mf: *MappedFile, gpa: std.mem.Allocator, ni: Node.Index, requested_size: u64) !void {

0 commit comments

Comments
 (0)