| ... | ... | @@ -664,11 +664,16 @@ fn addEntryPoint(ws: *WebServer, coverage_id: u64, addr: u64) error{ AlreadyRepo |
| 664 | 664 | const coverage_map = ws.coverage_files.getPtr(coverage_id).?; |
| 665 | 665 | const header: *const abi.SeenPcsHeader = @ptrCast(coverage_map.mapped_memory[0..@sizeOf(abi.SeenPcsHeader)]); |
| 666 | 666 | const pcs = header.pcAddrs(); |
| 667 | | const index = std.sort.upperBound(usize, pcs, addr, struct { |
| 668 | | fn order(context: usize, item: usize) std.math.Order { |
| 669 | | return std.math.order(item, context); |
| 667 | // Since this pcs list is unsorted, we must linear scan for the best index. |
| 668 | const index = i: { |
| 669 | var best: usize = 0; |
| 670 | for (pcs[1..], 1..) |elem_addr, i| { |
| 671 | if (elem_addr == addr) break :i i; |
| 672 | if (elem_addr > addr) continue; |
| 673 | if (elem_addr > pcs[best]) best = i; |
| 670 | 674 | } |
| 671 | | }.order); |
| 675 | break :i best; |
| 676 | }; |
| 672 | 677 | if (index >= pcs.len) { |
| 673 | 678 | log.err("unable to find unit test entry address 0x{x} in source locations (range: 0x{x} to 0x{x})", .{ |
| 674 | 679 | addr, pcs[0], pcs[pcs.len - 1], |
| ... | ... | @@ -678,8 +683,8 @@ fn addEntryPoint(ws: *WebServer, coverage_id: u64, addr: u64) error{ AlreadyRepo |
| 678 | 683 | if (false) { |
| 679 | 684 | const sl = coverage_map.source_locations[index]; |
| 680 | 685 | const file_name = coverage_map.coverage.stringAt(coverage_map.coverage.fileAt(sl.file).basename); |
| 681 | | log.debug("server found entry point for 0x{x} at {s}:{d}:{d}", .{ |
| 682 | | addr, file_name, sl.line, sl.column, |
| 686 | log.debug("server found entry point for 0x{x} at {s}:{d}:{d} - index {d} between {x} and {x}", .{ |
| 687 | addr, file_name, sl.line, sl.column, index, pcs[index - 1], pcs[index + 1], |
| 683 | 688 | }); |
| 684 | 689 | } |
| 685 | 690 | const gpa = ws.gpa; |