use super::Command;
use super::Segment;
use crate::common::{FromFFI, into_optional};
use crate::{declare_iterator, to_slice};
use lief_ffi as ffi;
use std::marker::PhantomData;
pub struct FunctionVariantFixups<'a> {
ptr: cxx::UniquePtr<ffi::MachO_FunctionVariantFixups>,
_owner: PhantomData<&'a ffi::MachO_Binary>,
}
impl FunctionVariantFixups<'_> {
pub fn data_offset(&self) -> u32 {
self.ptr.data_offset()
}
pub fn data_size(&self) -> u32 {
self.ptr.data_size()
}
pub fn content(&self) -> &[u8] {
to_slice!(self.ptr.content());
}
pub fn fixups(&self) -> Fixups<'_> {
Fixups::new(self.ptr.fixups())
}
}
impl std::fmt::Debug for FunctionVariantFixups<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let base = self as &dyn Command;
f.debug_struct("FunctionVariantFixups")
.field("base", &base)
.field("data_offset", &self.data_offset())
.field("data_size", &self.data_size())
.finish()
}
}
impl FromFFI<ffi::MachO_FunctionVariantFixups> for FunctionVariantFixups<'_> {
fn from_ffi(cmd: cxx::UniquePtr<ffi::MachO_FunctionVariantFixups>) -> Self {
Self {
ptr: cmd,
_owner: PhantomData,
}
}
}
impl Command for FunctionVariantFixups<'_> {
fn get_base(&self) -> &ffi::MachO_Command {
self.ptr.as_ref().unwrap().as_ref()
}
}
pub struct Fixup<'a> {
ptr: cxx::UniquePtr<ffi::MachO_FunctionVariantFixups_Fixup>,
_owner: PhantomData<&'a ffi::MachO_FunctionVariantFixups>,
}
impl FromFFI<ffi::MachO_FunctionVariantFixups_Fixup> for Fixup<'_> {
fn from_ffi(cmd: cxx::UniquePtr<ffi::MachO_FunctionVariantFixups_Fixup>) -> Self {
Self {
ptr: cmd,
_owner: PhantomData,
}
}
}
impl Fixup<'_> {
pub fn seg_offset(&self) -> u32 {
self.ptr.seg_offset()
}
pub fn seg_index(&self) -> u32 {
self.ptr.seg_index()
}
pub fn variant_index(&self) -> u32 {
self.ptr.variant_index()
}
pub fn pac_auth(&self) -> bool {
self.ptr.pac_auth()
}
pub fn pac_address(&self) -> bool {
self.ptr.pac_address()
}
pub fn pac_key(&self) -> u8 {
self.ptr.pac_key()
}
pub fn pac_diversity(&self) -> u16 {
self.ptr.pac_diversity()
}
pub fn segment(&self) -> Option<Segment<'_>> {
into_optional(self.ptr.segment())
}
}
impl std::fmt::Debug for Fixup<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Fixup")
.field("seg_offset", &self.seg_offset())
.field("seg_index", &self.seg_index())
.field("variant_index", &self.variant_index())
.field("pac_auth", &self.pac_auth())
.field("pac_address", &self.pac_address())
.field("pac_key", &self.pac_key())
.field("pac_diversity", &self.pac_diversity())
.finish()
}
}
impl std::fmt::Display for Fixup<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{}", self.ptr.to_string())
}
}
declare_iterator!(
Fixups,
Fixup<'a>,
ffi::MachO_FunctionVariantFixups_Fixup,
ffi::MachO_FunctionVariantFixups,
ffi::MachO_FunctionVariantFixups_it_fixups
);