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
impl CPU
Sourcepub fn load_instructions(
&mut self,
instructions: &Vec<Instruction>,
symbol: &Symbol,
)
pub fn load_instructions( &mut self, instructions: &Vec<Instruction>, symbol: &Symbol, )
Load instructions into memory at a given symbol.
Sourcepub fn init_execution(&mut self, entrypoint: &Symbol)
pub fn init_execution(&mut self, entrypoint: &Symbol)
Get the CPU ready to start executing code. Clears the stack and jumps to the entrypoint.
Sourcepub fn cycle(&mut self) -> Result<bool, String>
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.
Sourcepub fn get_memory(&self) -> Memory
pub fn get_memory(&self) -> Memory
Get a clone of the memory for debugging.
Sourcepub fn get_stack(&self) -> ExecutionStack
pub fn get_stack(&self) -> ExecutionStack
Get a clone of the stack for debugging.
Trait Implementations§
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> 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
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
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>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
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)
fn as_any(&self) -> &(dyn Any + 'static)
&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)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.