| ... | @@ -361,9 +361,9 @@ const ReadError = error{ | ... | @@ -361,9 +361,9 @@ const ReadError = error{ |
| 361 | }; | 361 | }; |
| 362 | | 362 | |
| 363 | /// Parse the trie from a byte stream. | 363 | /// Parse the trie from a byte stream. |
| 364 | pub fn read(self: *Trie, reader: anytype) ReadError!usize { | 364 | pub fn read(self: *Trie, allocator: *Allocator, reader: anytype) ReadError!usize { |
| 365 | try self.createRoot(); | 365 | try self.createRoot(allocator); |
| 366 | return self.root.?.read(self.allocator, reader); | 366 | return self.root.?.read(allocator, reader); |
| 367 | } | 367 | } |
| 368 | | 368 | |
| 369 | /// Write the trie to a byte stream. | 369 | /// Write the trie to a byte stream. |
| ... | @@ -396,13 +396,13 @@ fn createRoot(self: *Trie, allocator: *Allocator) !void { | ... | @@ -396,13 +396,13 @@ fn createRoot(self: *Trie, allocator: *Allocator) !void { |
| 396 | | 396 | |
| 397 | test "Trie node count" { | 397 | test "Trie node count" { |
| 398 | var gpa = testing.allocator; | 398 | var gpa = testing.allocator; |
| 399 | var trie = Trie.init(gpa); | 399 | var trie: Trie = .{}; |
| 400 | defer trie.deinit(); | 400 | defer trie.deinit(gpa); |
| 401 | | 401 | |
| 402 | try testing.expectEqual(trie.node_count, 0); | 402 | try testing.expectEqual(trie.node_count, 0); |
| 403 | try testing.expect(trie.root == null); | 403 | try testing.expect(trie.root == null); |
| 404 | | 404 | |
| 405 | try trie.put(.{ | 405 | try trie.put(gpa, .{ |
| 406 | .name = "_main", | 406 | .name = "_main", |
| 407 | .vmaddr_offset = 0, | 407 | .vmaddr_offset = 0, |
| 408 | .export_flags = 0, | 408 | .export_flags = 0, |
| ... | @@ -410,14 +410,14 @@ test "Trie node count" { | ... | @@ -410,14 +410,14 @@ test "Trie node count" { |
| 410 | try testing.expectEqual(trie.node_count, 2); | 410 | try testing.expectEqual(trie.node_count, 2); |
| 411 | | 411 | |
| 412 | // Inserting the same node shouldn't update the trie. | 412 | // Inserting the same node shouldn't update the trie. |
| 413 | try trie.put(.{ | 413 | try trie.put(gpa, .{ |
| 414 | .name = "_main", | 414 | .name = "_main", |
| 415 | .vmaddr_offset = 0, | 415 | .vmaddr_offset = 0, |
| 416 | .export_flags = 0, | 416 | .export_flags = 0, |
| 417 | }); | 417 | }); |
| 418 | try testing.expectEqual(trie.node_count, 2); | 418 | try testing.expectEqual(trie.node_count, 2); |
| 419 | | 419 | |
| 420 | try trie.put(.{ | 420 | try trie.put(gpa, .{ |
| 421 | .name = "__mh_execute_header", | 421 | .name = "__mh_execute_header", |
| 422 | .vmaddr_offset = 0x1000, | 422 | .vmaddr_offset = 0x1000, |
| 423 | .export_flags = 0, | 423 | .export_flags = 0, |
| ... | @@ -425,13 +425,13 @@ test "Trie node count" { | ... | @@ -425,13 +425,13 @@ test "Trie node count" { |
| 425 | try testing.expectEqual(trie.node_count, 4); | 425 | try testing.expectEqual(trie.node_count, 4); |
| 426 | | 426 | |
| 427 | // Inserting the same node shouldn't update the trie. | 427 | // Inserting the same node shouldn't update the trie. |
| 428 | try trie.put(.{ | 428 | try trie.put(gpa, .{ |
| 429 | .name = "__mh_execute_header", | 429 | .name = "__mh_execute_header", |
| 430 | .vmaddr_offset = 0x1000, | 430 | .vmaddr_offset = 0x1000, |
| 431 | .export_flags = 0, | 431 | .export_flags = 0, |
| 432 | }); | 432 | }); |
| 433 | try testing.expectEqual(trie.node_count, 4); | 433 | try testing.expectEqual(trie.node_count, 4); |
| 434 | try trie.put(.{ | 434 | try trie.put(gpa, .{ |
| 435 | .name = "_main", | 435 | .name = "_main", |
| 436 | .vmaddr_offset = 0, | 436 | .vmaddr_offset = 0, |
| 437 | .export_flags = 0, | 437 | .export_flags = 0, |
| ... | @@ -441,11 +441,11 @@ test "Trie node count" { | ... | @@ -441,11 +441,11 @@ test "Trie node count" { |
| 441 | | 441 | |
| 442 | test "Trie basic" { | 442 | test "Trie basic" { |
| 443 | var gpa = testing.allocator; | 443 | var gpa = testing.allocator; |
| 444 | var trie = Trie.init(gpa); | 444 | var trie: Trie = .{}; |
| 445 | defer trie.deinit(); | 445 | defer trie.deinit(gpa); |
| 446 | | 446 | |
| 447 | // root --- _st ---> node | 447 | // root --- _st ---> node |
| 448 | try trie.put(.{ | 448 | try trie.put(gpa, .{ |
| 449 | .name = "_st", | 449 | .name = "_st", |
| 450 | .vmaddr_offset = 0, | 450 | .vmaddr_offset = 0, |
| 451 | .export_flags = 0, | 451 | .export_flags = 0, |
| ... | @@ -455,7 +455,7 @@ test "Trie basic" { | ... | @@ -455,7 +455,7 @@ test "Trie basic" { |
| 455 | | 455 | |
| 456 | { | 456 | { |
| 457 | // root --- _st ---> node --- art ---> node | 457 | // root --- _st ---> node --- art ---> node |
| 458 | try trie.put(.{ | 458 | try trie.put(gpa, .{ |
| 459 | .name = "_start", | 459 | .name = "_start", |
| 460 | .vmaddr_offset = 0, | 460 | .vmaddr_offset = 0, |
| 461 | .export_flags = 0, | 461 | .export_flags = 0, |
| ... | @@ -471,7 +471,7 @@ test "Trie basic" { | ... | @@ -471,7 +471,7 @@ test "Trie basic" { |
| 471 | // root --- _ ---> node --- st ---> node --- art ---> node | 471 | // root --- _ ---> node --- st ---> node --- art ---> node |
| 472 | // | | 472 | // | |
| 473 | // | --- main ---> node | 473 | // | --- main ---> node |
| 474 | try trie.put(.{ | 474 | try trie.put(gpa, .{ |
| 475 | .name = "_main", | 475 | .name = "_main", |
| 476 | .vmaddr_offset = 0, | 476 | .vmaddr_offset = 0, |
| 477 | .export_flags = 0, | 477 | .export_flags = 0, |
| ... | @@ -491,22 +491,22 @@ test "Trie basic" { | ... | @@ -491,22 +491,22 @@ test "Trie basic" { |
| 491 | | 491 | |
| 492 | test "write Trie to a byte stream" { | 492 | test "write Trie to a byte stream" { |
| 493 | var gpa = testing.allocator; | 493 | var gpa = testing.allocator; |
| 494 | var trie = Trie.init(gpa); | 494 | var trie: Trie = .{}; |
| 495 | defer trie.deinit(); | 495 | defer trie.deinit(gpa); |
| 496 | | 496 | |
| 497 | try trie.put(.{ | 497 | try trie.put(gpa, .{ |
| 498 | .name = "__mh_execute_header", | 498 | .name = "__mh_execute_header", |
| 499 | .vmaddr_offset = 0, | 499 | .vmaddr_offset = 0, |
| 500 | .export_flags = 0, | 500 | .export_flags = 0, |
| 501 | }); | 501 | }); |
| 502 | try trie.put(.{ | 502 | try trie.put(gpa, .{ |
| 503 | .name = "_main", | 503 | .name = "_main", |
| 504 | .vmaddr_offset = 0x1000, | 504 | .vmaddr_offset = 0x1000, |
| 505 | .export_flags = 0, | 505 | .export_flags = 0, |
| 506 | }); | 506 | }); |
| 507 | | 507 | |
| 508 | try trie.finalize(); | 508 | try trie.finalize(gpa); |
| 509 | try trie.finalize(); // Finalizing mulitple times is a nop subsequently unless we add new nodes. | 509 | try trie.finalize(gpa); // Finalizing mulitple times is a nop subsequently unless we add new nodes. |
| 510 | | 510 | |
| 511 | const exp_buffer = [_]u8{ | 511 | const exp_buffer = [_]u8{ |
| 512 | 0x0, 0x1, // node root | 512 | 0x0, 0x1, // node root |
| ... | @@ -551,13 +551,13 @@ test "parse Trie from byte stream" { | ... | @@ -551,13 +551,13 @@ test "parse Trie from byte stream" { |
| 551 | }; | 551 | }; |
| 552 | | 552 | |
| 553 | var in_stream = std.io.fixedBufferStream(&in_buffer); | 553 | var in_stream = std.io.fixedBufferStream(&in_buffer); |
| 554 | var trie = Trie.init(gpa); | 554 | var trie: Trie = .{}; |
| 555 | defer trie.deinit(); | 555 | defer trie.deinit(gpa); |
| 556 | const nread = try trie.read(in_stream.reader()); | 556 | const nread = try trie.read(gpa, in_stream.reader()); |
| 557 | | 557 | |
| 558 | try testing.expect(nread == in_buffer.len); | 558 | try testing.expect(nread == in_buffer.len); |
| 559 | | 559 | |
| 560 | try trie.finalize(); | 560 | try trie.finalize(gpa); |
| 561 | | 561 | |
| 562 | var out_buffer = try gpa.alloc(u8, trie.size); | 562 | var out_buffer = try gpa.alloc(u8, trie.size); |
| 563 | defer gpa.free(out_buffer); | 563 | defer gpa.free(out_buffer); |