authorgravatar for quae@daurnimator.comdaurnimator <quae@daurnimator.com> 2020-07-13 00:38:59+10:00
committergravatar for quae@daurnimator.comdaurnimator <quae@daurnimator.com> 2020-07-13 00:38:59+10:00
log91235b937195910076a87cbb9ecbc6c5214ddd3b
treec05abc8bc964f01bd0d43cd1c3c37e774708678e
parentf7e4014c823f1134040beed700c2b0fff5384da1
signaturelock-open Commit is signed but in an unrecognized format.

std: don't store allocator inside of std.http.HeaderEntry


1 files changed, 16 insertions(+), 18 deletions(-)

lib/std/http/headers.zig+16-18
......@@ -27,7 +27,6 @@ fn never_index_default(name: []const u8) bool {
2727}
2828
2929const HeaderEntry = struct {
30 allocator: *Allocator,
3130 name: []const u8,
3231 value: []u8,
3332 never_index: bool,
......@@ -36,23 +35,22 @@ const HeaderEntry = struct {
3635
3736 fn init(allocator: *Allocator, name: []const u8, value: []const u8, never_index: ?bool) !Self {
3837 return Self{
39 .allocator = allocator,
4038 .name = name, // takes reference
4139 .value = try allocator.dupe(u8, value),
4240 .never_index = never_index orelse never_index_default(name),
4341 };
4442 }
4543
46 fn deinit(self: Self) void {
47 self.allocator.free(self.value);
44 fn deinit(self: Self, allocator: *Allocator) void {
45 allocator.free(self.value);
4846 }
4947
50 pub fn modify(self: *Self, value: []const u8, never_index: ?bool) !void {
48 pub fn modify(self: *Self, allocator: *Allocator, value: []const u8, never_index: ?bool) !void {
5149 const old_len = self.value.len;
5250 if (value.len > old_len) {
53 self.value = try self.allocator.realloc(self.value, value.len);
51 self.value = try allocator.realloc(self.value, value.len);
5452 } else if (value.len < old_len) {
55 self.value = self.allocator.shrink(self.value, value.len);
53 self.value = allocator.shrink(self.value, value.len);
5654 }
5755 mem.copy(u8, self.value, value);
5856 self.never_index = never_index orelse never_index_default(self.name);
......@@ -85,16 +83,16 @@ const HeaderEntry = struct {
8583
8684test "HeaderEntry" {
8785 var e = try HeaderEntry.init(testing.allocator, "foo", "bar", null);
88 defer e.deinit();
86 defer e.deinit(testing.allocator);
8987 testing.expectEqualSlices(u8, "foo", e.name);
9088 testing.expectEqualSlices(u8, "bar", e.value);
9189 testing.expectEqual(false, e.never_index);
9290
93 try e.modify("longer value", null);
91 try e.modify(testing.allocator, "longer value", null);
9492 testing.expectEqualSlices(u8, "longer value", e.value);
9593
9694 // shorter value
97 try e.modify("x", null);
95 try e.modify(testing.allocator, "x", null);
9896 testing.expectEqualSlices(u8, "x", e.value);
9997}
10098
......@@ -129,7 +127,7 @@ pub const Headers = struct {
129127 }
130128 {
131129 for (self.data.items) |entry| {
132 entry.deinit();
130 entry.deinit(self.allocator);
133131 }
134132 self.data.deinit(self.allocator);
135133 }
......@@ -157,14 +155,14 @@ pub const Headers = struct {
157155 var entry: HeaderEntry = undefined;
158156 if (self.index.getEntry(name)) |kv| {
159157 entry = try HeaderEntry.init(self.allocator, kv.key, value, never_index);
160 errdefer entry.deinit();
158 errdefer entry.deinit(self.allocator);
161159 const dex = &kv.value;
162160 try dex.append(self.allocator, n - 1);
163161 } else {
164162 const name_dup = try self.allocator.dupe(u8, name);
165163 errdefer self.allocator.free(name_dup);
166164 entry = try HeaderEntry.init(self.allocator, name_dup, value, never_index);
167 errdefer entry.deinit();
165 errdefer entry.deinit(self.allocator);
168166 var dex = HeaderIndexList{};
169167 try dex.append(self.allocator, n - 1);
170168 errdefer dex.deinit(self.allocator);
......@@ -203,7 +201,7 @@ pub const Headers = struct {
203201 const data_index = dex.items[i];
204202 const removed = self.data.orderedRemove(data_index);
205203 assert(mem.eql(u8, removed.name, name));
206 removed.deinit();
204 removed.deinit(self.allocator);
207205 }
208206 dex.deinit(self.allocator);
209207 self.allocator.free(kv.key);
......@@ -226,13 +224,13 @@ pub const Headers = struct {
226224 if (dex.items.len == 1) {
227225 // was last item; delete the index
228226 dex.deinit(self.allocator);
229 removed.deinit();
227 removed.deinit(self.allocator);
230228 const key = kv.key;
231229 _ = self.index.remove(key); // invalidates `kv` and `dex`
232230 self.allocator.free(key);
233231 } else {
234232 dex.shrink(self.allocator, dex.items.len - 1);
235 removed.deinit();
233 removed.deinit(self.allocator);
236234 }
237235 // if it was the last item; no need to rebuild index
238236 if (i != self.data.items.len) {
......@@ -251,13 +249,13 @@ pub const Headers = struct {
251249 if (dex.items.len == 1) {
252250 // was last item; delete the index
253251 dex.deinit(self.allocator);
254 removed.deinit();
252 removed.deinit(self.allocator);
255253 const key = kv.key;
256254 _ = self.index.remove(key); // invalidates `kv` and `dex`
257255 self.allocator.free(key);
258256 } else {
259257 dex.shrink(self.allocator, dex.items.len - 1);
260 removed.deinit();
258 removed.deinit(self.allocator);
261259 }
262260 // if it was the last item; no need to rebuild index
263261 if (i != self.data.items.len) {