pub struct BasicInstructionFetcher<I>where
I: Instruction,{ /* private fields */ }Expand description
Basic instruction fetcher implementation.
This implementation is intentionally basic and correct, but not the most performant. It is possible to have a more efficient implementation that skips certain checks by placing additional constraints on the constructor.
Note that it loads instructions from anywhere in memory. This works, but it is likely that you want to restrict this to a specific executable region of memory.
Implementations§
Source§impl<I> BasicInstructionFetcher<I>where
I: Instruction,
impl<I> BasicInstructionFetcher<I>where
I: Instruction,
Sourcepub const fn new(
return_trap_address: <<I as Instruction>::Reg as Register>::Type,
pc: <<I as Instruction>::Reg as Register>::Type,
) -> Self
pub const fn new( return_trap_address: <<I as Instruction>::Reg as Register>::Type, pc: <<I as Instruction>::Reg as Register>::Type, ) -> Self
Create a new instance.
return_trap_address is the address at which the interpreter will stop execution
(gracefully).
Trait Implementations§
Source§impl<I> Clone for BasicInstructionFetcher<I>where
I: Instruction + Clone,
impl<I> Clone for BasicInstructionFetcher<I>where
I: Instruction + Clone,
Source§fn clone(&self) -> BasicInstructionFetcher<I>
fn clone(&self) -> BasicInstructionFetcher<I>
Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreimpl<I> Copy for BasicInstructionFetcher<I>where
I: Instruction + Copy,
Source§impl<I> Debug for BasicInstructionFetcher<I>where
I: Instruction + Debug,
impl<I> Debug for BasicInstructionFetcher<I>where
I: Instruction + Debug,
Source§impl<I, Memory> InstructionFetcher<I, Memory> for BasicInstructionFetcher<I>where
I: Instruction,
Memory: VirtualMemory,
impl<I, Memory> InstructionFetcher<I, Memory> for BasicInstructionFetcher<I>where
I: Instruction,
Memory: VirtualMemory,
Source§fn peek_instruction(&mut self, memory: &Memory) -> FetchInstructionResult<I>
fn peek_instruction(&mut self, memory: &Memory) -> FetchInstructionResult<I>
Read the instruction at the current position, leaving the program counter on it. Read more
Source§unsafe fn advance(&mut self, instruction_size: u8)
unsafe fn advance(&mut self, instruction_size: u8)
Move the program counter past an instruction of
instruction_size bytes that
Self::peek_instruction() has just returned. Read moreSource§fn fetch_instruction(&mut self, memory: &Memory) -> FetchInstructionResult<I>
fn fetch_instruction(&mut self, memory: &Memory) -> FetchInstructionResult<I>
Fetch a single instruction at a specified address and advance the program counter on
successful fetch. Read more
Source§impl<I, Memory> ProgramCounter<<<I as Instruction>::Reg as Register>::Type, Memory> for BasicInstructionFetcher<I>where
I: Instruction,
Memory: VirtualMemory,
impl<I, Memory> ProgramCounter<<<I as Instruction>::Reg as Register>::Type, Memory> for BasicInstructionFetcher<I>where
I: Instruction,
Memory: VirtualMemory,
Source§fn get_pc(&self) -> <<I as Instruction>::Reg as Register>::Type
fn get_pc(&self) -> <<I as Instruction>::Reg as Register>::Type
Get the current value of the program counter
Source§unsafe fn try_set_pc_relative(
&mut self,
instruction_size: u8,
offset: i32,
) -> bool
unsafe fn try_set_pc_relative( &mut self, instruction_size: u8, offset: i32, ) -> bool
Move
offset bytes from the instruction being executed for targets this can resolve. Read moreSource§unsafe fn failed_branch(
&mut self,
memory: &Memory,
) -> Result<ControlFlow<()>, ExecutionError<<<I as Instruction>::Reg as Register>::Type>>
unsafe fn failed_branch( &mut self, memory: &Memory, ) -> Result<ControlFlow<()>, ExecutionError<<<I as Instruction>::Reg as Register>::Type>>
Say what is wrong with the target
Self::try_set_pc_relative() refused. Read moreSource§fn set_pc(
&mut self,
_memory: &Memory,
pc: <<I as Instruction>::Reg as Register>::Type,
) -> Result<ControlFlow<()>, ExecutionError<<<I as Instruction>::Reg as Register>::Type>>
fn set_pc( &mut self, _memory: &Memory, pc: <<I as Instruction>::Reg as Register>::Type, ) -> Result<ControlFlow<()>, ExecutionError<<<I as Instruction>::Reg as Register>::Type>>
Set the current value of the program counter
Source§fn old_pc(&self, instruction_size: u8) -> Address
fn old_pc(&self, instruction_size: u8) -> Address
Get the previous value of the program counter before executing an
instruction. Read moreSource§fn set_pc_relative(
&mut self,
memory: &Memory,
instruction_size: u8,
offset: i32,
) -> Result<ControlFlow<()>, ExecutionError<Address>>where
Self: ProgramCounter<Address, Memory>,
fn set_pc_relative(
&mut self,
memory: &Memory,
instruction_size: u8,
offset: i32,
) -> Result<ControlFlow<()>, ExecutionError<Address>>where
Self: ProgramCounter<Address, Memory>,
Apply
ExecutionResult::Branch, continuing offset bytes from the instruction being
executed. Read moreAuto Trait Implementations§
impl<I> Freeze for BasicInstructionFetcher<I>
impl<I> RefUnwindSafe for BasicInstructionFetcher<I>
impl<I> Send for BasicInstructionFetcher<I>
impl<I> Sync for BasicInstructionFetcher<I>
impl<I> Unpin for BasicInstructionFetcher<I>
impl<I> UnsafeUnpin for BasicInstructionFetcher<I>
impl<I> UnwindSafe for BasicInstructionFetcher<I>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more