| ... | @@ -460,35 +460,31 @@ pub const CacheHash = struct { | ... | @@ -460,35 +460,31 @@ pub const CacheHash = struct { |
| 460 | const dep_file_contents = try dir.readFileAlloc(self.cache.gpa, dep_file_basename, manifest_file_size_max); | 460 | const dep_file_contents = try dir.readFileAlloc(self.cache.gpa, dep_file_basename, manifest_file_size_max); |
| 461 | defer self.cache.gpa.free(dep_file_contents); | 461 | defer self.cache.gpa.free(dep_file_contents); |
| 462 | | 462 | |
| 463 | const DepTokenizer = @import("DepTokenizer.zig"); | 463 | var error_buf = std.ArrayList(u8).init(self.cache.gpa); |
| 464 | var it = DepTokenizer.init(self.cache.gpa, dep_file_contents); | 464 | defer error_buf.deinit(); |
| 465 | defer it.deinit(); | 465 | |
| | 466 | var it: @import("DepTokenizer.zig") = .{ .bytes = dep_file_contents }; |
| 466 | | 467 | |
| 467 | // Skip first token: target. | 468 | // Skip first token: target. |
| 468 | { | 469 | switch (it.next() orelse return) { // Empty dep file OK. |
| 469 | const opt_result = it.next() catch |err| switch (err) { | 470 | .target, .target_must_resolve, .prereq => {}, |
| 470 | error.OutOfMemory => return error.OutOfMemory, | 471 | else => |err| { |
| 471 | error.InvalidInput => { | 472 | try err.printError(error_buf.writer()); |
| 472 | std.log.err("failed parsing {}: {}: {}", .{ dep_file_basename, @errorName(err), it.error_text }); | 473 | std.log.err("failed parsing {}: {}", .{ dep_file_basename, error_buf.items }); |
| 473 | return error.InvalidDepFile; | 474 | return error.InvalidDepFile; |
| 474 | }, | 475 | }, |
| 475 | }; | | |
| 476 | _ = opt_result orelse return; // Empty dep file OK. | | |
| 477 | } | 476 | } |
| 478 | // Process 0+ preqreqs. | 477 | // Process 0+ preqreqs. |
| 479 | // Clang is invoked in single-source mode so we never get more targets. | 478 | // Clang is invoked in single-source mode so we never get more targets. |
| 480 | while (true) { | 479 | while (true) { |
| 481 | const opt_result = it.next() catch |err| switch (err) { | 480 | switch (it.next() orelse return) { |
| 482 | error.OutOfMemory => return error.OutOfMemory, | 481 | .target, .target_must_resolve => return, |
| 483 | error.InvalidInput => { | 482 | .prereq => |bytes| try self.addFilePost(bytes), |
| 484 | std.log.err("failed parsing {}: {}: {}", .{ dep_file_basename, @errorName(err), it.error_text }); | 483 | else => |err| { |
| | 484 | try err.printError(error_buf.writer()); |
| | 485 | std.log.err("failed parsing {}: {}", .{ dep_file_basename, error_buf.items }); |
| 485 | return error.InvalidDepFile; | 486 | return error.InvalidDepFile; |
| 486 | }, | 487 | }, |
| 487 | }; | | |
| 488 | const result = opt_result orelse return; | | |
| 489 | switch (result.id) { | | |
| 490 | .target => return, | | |
| 491 | .prereq => try self.addFilePost(result.bytes), | | |
| 492 | } | 488 | } |
| 493 | } | 489 | } |
| 494 | } | 490 | } |