in src/windows/pdb.rs [182:227]
fn check_func_len(
func_new: &[std::result::Result<BreakpadFuncRecord<'_>, BreakpadError>],
func_old: &[std::result::Result<BreakpadFuncRecord<'_>, BreakpadError>],
) {
if func_new.len() != func_old.len() {
// Try to find the diff in the addresses
let mut old_addresses = FxHashMap::default();
let mut old_keys = FxHashSet::default();
for addr in func_old.iter().map(|f| f.as_ref().unwrap().address) {
*old_addresses.entry(addr).or_insert(0) += 1;
old_keys.insert(addr);
}
let mut new_addresses = FxHashMap::default();
let mut new_keys = FxHashSet::default();
for addr in func_new.iter().map(|f| f.as_ref().unwrap().address) {
*new_addresses.entry(addr).or_insert(0) += 1;
new_keys.insert(addr);
}
let diff: Vec<_> = old_keys.symmetric_difference(&new_keys).collect();
for addr in diff.iter() {
old_addresses.remove(addr);
new_addresses.remove(addr);
}
let mut diff_value = Vec::new();
for (addr, value) in old_addresses.iter() {
let new_value = new_addresses.get(addr).unwrap();
if new_value != value {
diff_value.push((addr, new_value, value));
}
}
let diff: Vec<_> = diff.iter().map(|x| format!("0x{x:x}")).collect();
let values: Vec<_> = diff_value
.iter()
.map(|(a, n, o)| format!("At 0x{a:x}: new {n}, old: {o}"))
.collect();
panic!(
"Not the same number of FUNC (new: {}, old: {}):\n - Diff keys: {:?}\n - Diff values: {:?}",
func_new.len(),
func_old.len(),
diff,
values,
);
}
}