fn check_func_len()

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,
            );
        }
    }