binaryninja/low_level_il/
block.rsuse std::fmt::Debug;
use std::ops::Range;
use crate::architecture::Architecture;
use crate::basic_block::{BasicBlock, BlockContext};
use super::*;
#[derive(Copy)]
pub struct LowLevelILBlock<'func, A, M, F>
where
A: 'func + Architecture,
M: FunctionMutability,
F: FunctionForm,
{
pub(crate) function: &'func LowLevelILFunction<A, M, F>,
}
impl<'func, A, M, F> BlockContext for LowLevelILBlock<'func, A, M, F>
where
A: 'func + Architecture,
M: FunctionMutability,
F: FunctionForm,
{
type Instruction = LowLevelILInstruction<'func, A, M, F>;
type InstructionIndex = LowLevelInstructionIndex;
type Iter = LowLevelILBlockIter<'func, A, M, F>;
fn start(&self, block: &BasicBlock<Self>) -> LowLevelILInstruction<'func, A, M, F> {
self.function
.instruction_from_index(block.start_index())
.unwrap()
}
fn iter(&self, block: &BasicBlock<Self>) -> LowLevelILBlockIter<'func, A, M, F> {
LowLevelILBlockIter {
function: self.function,
range: (block.start_index().0)..(block.end_index().0),
}
}
}
impl<'func, A, M, F> Debug for LowLevelILBlock<'func, A, M, F>
where
A: 'func + Architecture + Debug,
M: FunctionMutability,
F: FunctionForm,
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("LowLevelILBlock")
.field("function", &self.function)
.finish()
}
}
impl<'func, A, M, F> Clone for LowLevelILBlock<'func, A, M, F>
where
A: 'func + Architecture,
M: FunctionMutability,
F: FunctionForm,
{
fn clone(&self) -> Self {
LowLevelILBlock {
function: self.function,
}
}
}
pub struct LowLevelILBlockIter<'func, A, M, F>
where
A: 'func + Architecture,
M: FunctionMutability,
F: FunctionForm,
{
function: &'func LowLevelILFunction<A, M, F>,
range: Range<usize>,
}
impl<'func, A, M, F> Iterator for LowLevelILBlockIter<'func, A, M, F>
where
A: 'func + Architecture,
M: FunctionMutability,
F: FunctionForm,
{
type Item = LowLevelILInstruction<'func, A, M, F>;
fn next(&mut self) -> Option<Self::Item> {
self.range
.next()
.map(LowLevelInstructionIndex)
.and_then(|idx| self.function.instruction_from_index(idx))
}
}