SQUASHME: use Iterator::try_fold, remove pointless `resolve_type`

reviewable/pr1340/r15
Tamir Duberstein 2 weeks ago
parent 6e70fda6a2
commit 9badc46223
No known key found for this signature in database

@ -1252,7 +1252,7 @@ fn parse_btf_map_def(btf: &Btf, info: &DataSecEntry) -> Result<(String, BtfMapDe
let map_name = btf.string_at(ty.name_offset)?; let map_name = btf.string_at(ty.name_offset)?;
let root_type = btf.resolve_type(ty.btf_type)?; let root_type = btf.resolve_type(ty.btf_type)?;
let mut s = match btf.type_by_id(root_type)? { let s = match btf.type_by_id(root_type)? {
BtfType::Struct(s) => s, BtfType::Struct(s) => s,
other => { other => {
return Err(BtfError::UnexpectedBtfType { return Err(BtfError::UnexpectedBtfType {
@ -1278,37 +1278,24 @@ fn parse_btf_map_def(btf: &Btf, info: &DataSecEntry) -> Result<(String, BtfMapDe
// Therefore, the traversal to the actual map definition looks like: // Therefore, the traversal to the actual map definition looks like:
// //
// HashMap -> __0 -> value // HashMap -> __0 -> value
match &s.members[..] { let s = ["__0", "value"].into_iter().try_fold(
[wrapper_field] if btf.string_at(wrapper_field.name_offset)?.as_ref() == "__0" => { s,
let unsafe_cell_type = btf.resolve_type(wrapper_field.btf_type)?; |crate::btf::Struct { members, .. }, field_name| match members.as_slice() {
let BtfType::Struct(unsafe_cell) = btf.type_by_id(unsafe_cell_type)? else { [
return Err(BtfError::UnexpectedBtfType { crate::btf::BtfMember {
type_id: unsafe_cell_type, name_offset,
}); btf_type,
}; offset: _,
},
match &unsafe_cell.members[..] { ] if btf.string_at(*name_offset)?.as_ref() == field_name => {
[unsafe_cell_field] => { match btf.type_by_id(*btf_type)? {
if btf.string_at(unsafe_cell_field.name_offset)?.as_ref() == "value" { BtfType::Struct(s) => Ok(s),
let map_def_type = btf.resolve_type(unsafe_cell_field.btf_type)?; _ => Err(BtfError::UnexpectedBtfType { type_id: *btf_type }),
let BtfType::Struct(map_def) =
btf.type_by_id(unsafe_cell_field.btf_type)?
else {
return Err(BtfError::UnexpectedBtfType {
type_id: map_def_type,
});
};
// Assign `map_def` to `s` and let the loop below process it.
s = map_def;
} else {
return Err(BtfError::BtfMapWrapperInvalidLayout);
}
} }
_ => return Err(BtfError::BtfMapWrapperInvalidLayout),
} }
} _ => Err(BtfError::BtfMapWrapperInvalidLayout),
_ => {} },
} )?;
for m in &s.members { for m in &s.members {
match btf.string_at(m.name_offset)?.as_ref() { match btf.string_at(m.name_offset)?.as_ref() {

Loading…
Cancel
Save