Struct VM

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

The Lox virtual machine.

§Example

let mut vm = VM::default();
vm.interpret("3 + 3 == 6"); // true

Implementations§

Source§

impl VM

Source

pub fn add_std_globals(&mut self)

Source

pub fn add_arguments_instance(&mut self)

Source§

impl VM

Source

pub fn alloc<T: Any>(&mut self, obj: T) -> Gc<T>

Allocate a garbage-collected value on the heap.

This method is how to obtain a Gc pointer (not exported from this crate and has no public constructor). Values allocated with this method will be owned (and eventually freed) by the VM. If the value lives until the VM goes out of scope, it will be freed in the VM’s Drop implementation.

For a usage example, see NativeFun.

Source§

impl VM

Source

pub fn buffer_output(&mut self, should_buffer: bool)

Print directly to stdout, or buffer output internally.

Pass true to this method to buffer print output internally. This output can then be accessed through this struct’s Read implementation.

Pass false (the default mode) to sink all program output directly to Stdout.

§Example
use std::io::Read;

let mut vm = lox_lang::VM::default();
vm.buffer_output(true);

vm.interpret("print nil == true;");

let mut buffer = String::new();
vm.read_to_string(&mut buffer).unwrap();
assert_eq!(buffer, "false\n");

vm.interpret("for (var a = 3; a < 12; a = a + 3) print a;");

buffer.clear();
vm.read_to_string(&mut buffer).unwrap();
assert_eq!(buffer, "3\n6\n9\n");
Source§

impl<'source> VM

Source

pub fn interpret<T: AsRef<str> + 'source>( &mut self, source: T, ) -> Result<(), Vec<Error>>

Compile and run Lox code from a source string.

§Errors

Errors are returned in a Vec. This is because compilation (not runtime) is able to continue after error(s) are encountered.

Source

pub fn define_global<T: ?Sized + ToString>(&mut self, name: &T, value: Value)

Define a global variable inside the runtime.

Since globals are late bound in Lox, functions that reference the provided name will see the provided value, even if they were declared in the runtime before calling this method.

§Example
use std::io::Read;

let mut vm = lox_lang::VM::default();
vm.buffer_output(true);

vm.interpret("fun hello() { print world; }");
vm.define_global("world", "greetings, Earthling.".into());
vm.interpret("hello();");

let mut buffer = String::new();
vm.read_to_string(&mut buffer).unwrap();
assert_eq!(buffer, "greetings, Earthling.\n");

Trait Implementations§

Source§

impl Default for VM

Source§

fn default() -> Self

The VM constructor.

Program output defaults to Stdout. To customize this behavior, see the buffer_output method.

Source§

impl Drop for VM

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl Read for VM

Source§

fn read(&mut self, buf: &mut [u8]) -> Result<usize>

Pull some bytes from this source into the specified buffer, returning how many bytes were read. Read more
Source§

fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize>

Reads all bytes until EOF in this source, placing them into buf. Read more
1.36.0 · Source§

fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>

Like read, except that it reads into a slice of buffers. Read more
Source§

fn is_read_vectored(&self) -> bool

🔬This is a nightly-only experimental API. (can_vector)
Determines if this Reader has an efficient read_vectored implementation. Read more
1.0.0 · Source§

fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>

Reads all bytes until EOF in this source, appending them to buf. Read more
1.6.0 · Source§

fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>

Reads the exact number of bytes required to fill buf. Read more
Source§

fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Pull some bytes from this source into the specified buffer. Read more
Source§

fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Reads the exact number of bytes required to fill cursor. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where Self: Sized,

Creates a “by reference” adaptor for this instance of Read. Read more
1.0.0 · Source§

fn bytes(self) -> Bytes<Self>
where Self: Sized,

Transforms this Read instance to an Iterator over its bytes. Read more
1.0.0 · Source§

fn chain<R>(self, next: R) -> Chain<Self, R>
where R: Read, Self: Sized,

Creates an adapter which will chain this stream with another. Read more
1.0.0 · Source§

fn take(self, limit: u64) -> Take<Self>
where Self: Sized,

Creates an adapter which will read at most limit bytes from it. Read more

Auto Trait Implementations§

§

impl Freeze for VM

§

impl !RefUnwindSafe for VM

§

impl !Send for VM

§

impl !Sync for VM

§

impl Unpin for VM

§

impl !UnwindSafe for VM

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> 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.