in src/reader.rs [473:517]
fn read_edges<E: Endian, T: GcovReader<E> + Sized>(
fun: &mut GcovFunction,
count: u32,
reader: &mut T,
) -> Result<(), GcovReaderError> {
let edges = &mut fun.edges;
let blocks = &mut fun.blocks;
let count = ((count - 1) / 2) as usize;
let block_no = reader.read_u32()? as usize;
if block_no <= blocks.len() {
blocks[block_no].destination.reserve(count);
for _ in 0..count {
let dst_block_no = reader.read_u32()? as usize;
let flags = reader.read_u32()?;
let edges_count = edges.len();
edges.push(GcovEdge {
source: block_no,
destination: dst_block_no,
flags,
counter: 0,
cycles: 0,
});
let i = match blocks[block_no]
.destination
.binary_search_by(|x| edges[*x].destination.cmp(&dst_block_no))
{
Ok(i) => i,
Err(i) => i,
};
blocks[block_no].destination.insert(i, edges_count);
blocks[dst_block_no].source.push(edges_count);
if (flags & GCOV_ARC_ON_TREE) == 0 {
fun.real_edge_count += 1;
}
}
} else {
return Err(GcovReaderError::Str(format!(
"Unexpected block number: {} (in {}) in {}",
block_no,
fun.name,
reader.get_stem()
)));
}
Ok(())
}