CPU

Struct CPU 

Source
pub struct CPU { /* private fields */ }
Expand description

The CPU is where instruction reading and execution is handled.

Contains Memory, as well as an ExecutionStack. These are used to read and execute instructions.

Implementations§

Source§

impl CPU

Source

pub fn new() -> CPU

Create a new CPU. Initializes both the memory and stack to be empty.

Source

pub fn load_instructions( &mut self, instructions: &Vec<Instruction>, symbol: &Symbol, )

Load instructions into memory at a given symbol.

Source

pub fn init_execution(&mut self, entrypoint: &Symbol)

Get the CPU ready to start executing code. Clears the stack and jumps to the entrypoint.

Source

pub fn cycle(&mut self) -> Result<bool, String>

Complete one CPU cycle. Returns false iff the stack is empty. Returns an error if something goes wrong during execution. Returns true otherwise.

Each CPU cycle does the following:

  • Checks if the stack is empty. If it is, return false. If not, continue.
  • Reads the instructions that the ExecutionPointer at the top of the stack points to.
  • If we’re done execution there, return from that block, and return true.
  • Otherwise, read the instruction at the given index and execute it.
  • If the instruction errors, return the error. Otherwise, return true.

One CPU cycle does not necessarily map to one instruction, as a CPU cycle is used every time we pop an execution pointer off of the stack when we are done executing those instructions. This is technically equivalent to every instruction vector having a return instruction tacked on at the end, but isn’t handled the same way.

Source

pub fn get_memory(&self) -> Memory

Get a clone of the memory for debugging.

Source

pub fn get_stack(&self) -> ExecutionStack

Get a clone of the stack for debugging.

Trait Implementations§

Source§

impl Default for CPU

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl Freeze for CPU

§

impl !RefUnwindSafe for CPU

§

impl !Send for CPU

§

impl !Sync for CPU

§

impl Unpin for CPU

§

impl !UnwindSafe for CPU

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> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
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, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

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.