Skip to main content

BasicInstructionFetcher

Struct BasicInstructionFetcher 

Source
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,

Source

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,

Source§

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)

Performs copy-assignment from source. Read more
Source§

impl<I> Copy for BasicInstructionFetcher<I>
where I: Instruction + Copy,

Source§

impl<I> Debug for BasicInstructionFetcher<I>
where I: Instruction + Debug,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<I, Memory> InstructionFetcher<I, Memory> for BasicInstructionFetcher<I>
where I: Instruction, Memory: VirtualMemory,

Source§

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)

Move the program counter past an instruction of instruction_size bytes that Self::peek_instruction() has just returned. Read more
Source§

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,

Source§

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

Move offset bytes from the instruction being executed for targets this can resolve. Read more
Source§

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 more
Source§

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
where Address: From<u8> + Sub<Output = Address>,

Get the previous value of the program counter before executing an instruction. Read more
Source§

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 more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.