diff --git a/aya-obj/src/btf/types.rs b/aya-obj/src/btf/types.rs index 84497ec8..37f547ca 100644 --- a/aya-obj/src/btf/types.rs +++ b/aya-obj/src/btf/types.rs @@ -342,12 +342,19 @@ pub struct Int { impl Int { pub(crate) fn to_bytes(&self) -> Vec { - let mut buf = vec![]; - buf.extend(bytes_of::(&self.name_offset)); - buf.extend(bytes_of::(&self.info)); - buf.extend(bytes_of::(&self.size)); - buf.extend(bytes_of::(&self.data)); - buf + let Self { + name_offset, + info, + size, + data, + } = self; + [ + bytes_of::(name_offset), + bytes_of::(info), + bytes_of::(size), + bytes_of::(data), + ] + .concat() } pub(crate) fn kind(&self) -> BtfKind { @@ -404,15 +411,24 @@ pub struct Enum { impl Enum { pub(crate) fn to_bytes(&self) -> Vec { - let mut buf = vec![]; - buf.extend(bytes_of::(&self.name_offset)); - buf.extend(bytes_of::(&self.info)); - buf.extend(bytes_of::(&self.size)); - for v in &self.variants { - buf.extend(bytes_of::(&v.name_offset)); - buf.extend(bytes_of::(&v.value)); - } - buf + let Self { + name_offset, + info, + size, + variants, + } = self; + [ + bytes_of::(name_offset), + bytes_of::(info), + bytes_of::(size), + ] + .into_iter() + .chain(variants.iter().flat_map(|BtfEnum { name_offset, value }| { + [bytes_of::(name_offset), bytes_of::(value)] + })) + .flatten() + .copied() + .collect() } pub(crate) fn kind(&self) -> BtfKind { @@ -458,16 +474,34 @@ pub struct Enum64 { impl Enum64 { pub(crate) fn to_bytes(&self) -> Vec { - let mut buf = vec![]; - buf.extend(bytes_of::(&self.name_offset)); - buf.extend(bytes_of::(&self.info)); - buf.extend(bytes_of::(&self.size)); - for v in &self.variants { - buf.extend(bytes_of::(&v.name_offset)); - buf.extend(bytes_of::(&v.value_high)); - buf.extend(bytes_of::(&v.value_low)); - } - buf + let Self { + name_offset, + info, + size, + variants, + } = self; + [ + bytes_of::(name_offset), + bytes_of::(info), + bytes_of::(size), + ] + .into_iter() + .chain(variants.iter().flat_map( + |BtfEnum64 { + name_offset, + value_low, + value_high, + }| { + [ + bytes_of::(name_offset), + bytes_of::(value_low), + bytes_of::(value_high), + ] + }, + )) + .flatten() + .copied() + .collect() } pub(crate) fn kind(&self) -> BtfKind { @@ -502,16 +536,34 @@ pub struct Struct { impl Struct { pub(crate) fn to_bytes(&self) -> Vec { - let mut buf = vec![]; - buf.extend(bytes_of::(&self.name_offset)); - buf.extend(bytes_of::(&self.info)); - buf.extend(bytes_of::(&self.size)); - for v in &self.members { - buf.extend(bytes_of::(&v.name_offset)); - buf.extend(bytes_of::(&v.btf_type)); - buf.extend(bytes_of::(&v.offset)); - } - buf + let Self { + name_offset, + info, + size, + members, + } = self; + [ + bytes_of::(name_offset), + bytes_of::(info), + bytes_of::(size), + ] + .into_iter() + .chain(members.iter().flat_map( + |BtfMember { + name_offset, + btf_type, + offset, + }| { + [ + bytes_of::(name_offset), + bytes_of::(btf_type), + bytes_of::(offset), + ] + }, + )) + .flatten() + .copied() + .collect() } pub(crate) fn kind(&self) -> BtfKind { @@ -563,16 +615,34 @@ pub struct Union { impl Union { pub(crate) fn to_bytes(&self) -> Vec { - let mut buf = vec![]; - buf.extend(bytes_of::(&self.name_offset)); - buf.extend(bytes_of::(&self.info)); - buf.extend(bytes_of::(&self.size)); - for v in &self.members { - buf.extend(bytes_of::(&v.name_offset)); - buf.extend(bytes_of::(&v.btf_type)); - buf.extend(bytes_of::(&v.offset)); - } - buf + let Self { + name_offset, + info, + size, + members, + } = self; + [ + bytes_of::(name_offset), + bytes_of::(info), + bytes_of::(size), + ] + .into_iter() + .chain(members.iter().flat_map( + |BtfMember { + name_offset, + btf_type, + offset, + }| { + [ + bytes_of::(name_offset), + bytes_of::(btf_type), + bytes_of::(offset), + ] + }, + )) + .flatten() + .copied() + .collect() } pub(crate) fn kind(&self) -> BtfKind { @@ -609,6 +679,7 @@ pub(crate) struct BtfArray { pub(crate) index_type: u32, pub(crate) len: u32, } + #[repr(C)] #[derive(Clone, Debug)] pub struct Array { @@ -620,12 +691,19 @@ pub struct Array { impl Array { pub(crate) fn to_bytes(&self) -> Vec { - let mut buf = vec![]; - buf.extend(bytes_of::(&self.name_offset)); - buf.extend(bytes_of::(&self.info)); - buf.extend(bytes_of::(&self._unused)); - buf.extend(bytes_of::(&self.array)); - buf + let Self { + name_offset, + info, + _unused, + array, + } = self; + [ + bytes_of::(name_offset), + bytes_of::(info), + bytes_of::(_unused), + bytes_of::(array), + ] + .concat() } pub(crate) fn kind(&self) -> BtfKind { @@ -670,15 +748,27 @@ pub struct FuncProto { impl FuncProto { pub(crate) fn to_bytes(&self) -> Vec { - let mut buf = vec![]; - buf.extend(bytes_of::(&self.name_offset)); - buf.extend(bytes_of::(&self.info)); - buf.extend(bytes_of::(&self.return_type)); - for p in &self.params { - buf.extend(bytes_of::(&p.name_offset)); - buf.extend(bytes_of::(&p.btf_type)); - } - buf + let Self { + name_offset, + info, + return_type, + params, + } = self; + [ + bytes_of::(name_offset), + bytes_of::(info), + bytes_of::(return_type), + ] + .into_iter() + .chain(params.iter().flat_map( + |BtfParam { + name_offset, + btf_type, + }| { [bytes_of::(name_offset), bytes_of::(btf_type)] }, + )) + .flatten() + .copied() + .collect() } pub(crate) fn kind(&self) -> BtfKind { @@ -732,12 +822,19 @@ pub struct Var { impl Var { pub(crate) fn to_bytes(&self) -> Vec { - let mut buf = vec![]; - buf.extend(bytes_of::(&self.name_offset)); - buf.extend(bytes_of::(&self.info)); - buf.extend(bytes_of::(&self.btf_type)); - buf.extend(bytes_of::(&self.linkage)); - buf + let Self { + name_offset, + info, + btf_type, + linkage, + } = self; + [ + bytes_of::(name_offset), + bytes_of::(info), + bytes_of::(btf_type), + bytes_of::(linkage), + ] + .concat() } pub(crate) fn kind(&self) -> BtfKind { @@ -778,16 +875,34 @@ pub struct DataSec { impl DataSec { pub(crate) fn to_bytes(&self) -> Vec { - let mut buf = vec![]; - buf.extend(bytes_of::(&self.name_offset)); - buf.extend(bytes_of::(&self.info)); - buf.extend(bytes_of::(&self.size)); - for e in &self.entries { - buf.extend(bytes_of::(&e.btf_type)); - buf.extend(bytes_of::(&e.offset)); - buf.extend(bytes_of::(&e.size)); - } - buf + let Self { + name_offset, + info, + size, + entries, + } = self; + [ + bytes_of::(name_offset), + bytes_of::(info), + bytes_of::(size), + ] + .into_iter() + .chain(entries.iter().flat_map( + |DataSecEntry { + btf_type, + offset, + size, + }| { + [ + bytes_of::(btf_type), + bytes_of::(offset), + bytes_of::(size), + ] + }, + )) + .flatten() + .copied() + .collect() } pub(crate) fn kind(&self) -> BtfKind { @@ -821,12 +936,19 @@ pub struct DeclTag { impl DeclTag { pub(crate) fn to_bytes(&self) -> Vec { - let mut buf = vec![]; - buf.extend(bytes_of::(&self.name_offset)); - buf.extend(bytes_of::(&self.info)); - buf.extend(bytes_of::(&self.btf_type)); - buf.extend(bytes_of::(&self.component_index)); - buf + let Self { + name_offset, + info, + btf_type, + component_index, + } = self; + [ + bytes_of::(name_offset), + bytes_of::(info), + bytes_of::(btf_type), + bytes_of::(component_index), + ] + .concat() } pub(crate) fn kind(&self) -> BtfKind {