Skip to main content

Vm

Struct Vm 

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

The Harn bytecode virtual machine.

Implementations§

Source§

impl Vm

Source

pub fn format_runtime_error(&self, error: &VmError) -> String

Source§

impl Vm

Source

pub fn new() -> Self

Source

pub fn set_bridge(&mut self, bridge: Rc<HostBridge>)

Set the bridge for delegating unknown builtins in bridge mode.

Source

pub fn set_denied_builtins(&mut self, denied: HashSet<String>)

Set builtins that are denied in sandbox mode. When called, the given builtin names will produce a permission error.

Source

pub fn set_source_info(&mut self, file: &str, text: &str)

Set source info for error reporting (file path and source text).

Source

pub fn set_breakpoints_for_file(&mut self, file: &str, lines: Vec<usize>)

Replace breakpoints for a single source file. Pass an empty string (or call set_breakpoints for the wildcard equivalent) to install breakpoints that match every file — useful for ad-hoc CLI runs where the embedder doesn’t track per-file source paths.

Source

pub fn set_breakpoints(&mut self, lines: Vec<usize>)

Backwards-compatible wildcard form. Stores all lines under the empty-string key, which matches any source file at the check site. Existing embedders that don’t track file scoping still work.

Source

pub fn set_function_breakpoints(&mut self, names: Vec<String>)

Replace the function-breakpoint set. Every subsequent closure call whose name matches one of the provided strings will pause on entry. Empty vec clears the set.

Source

pub fn function_breakpoint_names(&self) -> Vec<String>

Returns the current function-breakpoint name set. Used by the DAP adapter to build the setFunctionBreakpoints response with verified=true per registered name.

Source

pub fn take_pending_function_bp(&mut self) -> Option<String>

Drain any pending function-breakpoint name latched by the most recent closure entry. Returns Some(name) exactly once per hit so the caller can emit a single stopped event.

Source

pub fn set_step_mode(&mut self, step: bool)

Enable step mode (stop at the next source line regardless of frame depth — i.e. step-in semantics, descending into calls).

Source

pub fn set_step_over(&mut self)

Enable step-over mode (stop at the next source line in the current frame or a shallower one, skipping past any nested calls).

Source

pub fn set_debug_hook<F>(&mut self, hook: F)
where F: FnMut(&DebugState) -> DebugAction + 'static,

Register a debug hook invoked whenever execution advances to a new source line.

Source

pub fn clear_debug_hook(&mut self)

Clear the current debug hook.

Source

pub fn set_step_out(&mut self)

Enable step-out mode (stop at the next source line after the current frame has returned — strictly shallower than where the user requested the step-out).

Source

pub fn is_stopped(&self) -> bool

Check if the VM is stopped at a debug point.

Source

pub fn debug_state(&self) -> DebugState

Get the current debug state (variables, line, etc.).

Source

pub fn call_sites_on_line(&self, line: u32) -> Vec<(u32, String)>

Call sites (name + ip) on line within the current frame’s chunk — drives DAP stepInTargets (#112). Walks the chunk’s parallel lines array, surfaces every Call / MethodCall / CallSpread and pairs it with the name of the constant or identifier preceding the call when we can derive it cheaply.

Source

pub fn install_cancel_token(&mut self, token: Arc<AtomicBool>)

Install (or replace) the cooperative cancellation token on this VM. Callers (DAP adapter, embedded host) flip the wrapped AtomicBool to request graceful shutdown; the step loop checks is_cancel_requested() at every instruction and exits with VmError::Cancelled when set.

Source

pub fn signal_cancel(&mut self) -> Arc<AtomicBool>

Signal cooperative cancellation on this VM — the step loop unwinds on its next instruction check. Lazily allocates a fresh token when none is installed so hosts don’t need to pre-plumb it on every launch. Returns the Arc so the caller can hold onto it and re-signal later if needed.

Source

pub fn is_cancel_requested(&self) -> bool

True when cooperative cancellation has been requested.

Source

pub fn identifiers_in_scope(&self, _frame_id: usize) -> Vec<String>

Identifiers visible at the given frame’s scope — locals plus every registered builtin + async builtin. Drives DAP completions (#109) so the REPL autocomplete surfaces everything the unified evaluator can reach.

Source

pub fn debug_stack_frames(&self) -> Vec<(String, usize)>

Get all stack frames for the debugger.

Source

pub async fn step_execute(&mut self) -> Result<Option<(VmValue, bool)>, VmError>

Execute one instruction, returning whether to stop (breakpoint/step). Returns Ok(None) to continue, Ok(Some(val)) on program end, Err on error.

Line-change detection reads the line of the instruction we’re about to execute (lines[ip]) rather than the byte before ip. After a jump, ip-1 still points into the skipped region, which previously reported phantom stops on the tail of a not-taken branch (e.g. host_metadata_save() highlighted even though any_stale was false). Using lines[ip] — combined with cleanup ops emitted at line 0 after branch/loop exits — keeps the debugger aligned with what’s actually going to run.

Source

pub fn frame_count(&self) -> usize

Number of live call frames. Used by the DAP adapter to translate stackTrace ids (1-based, innermost first) back to the VM’s 0-based outermost-first index when processing restartFrame.

Source

pub fn restart_frame(&mut self, frame_id: usize) -> Result<(), VmError>

Rewind the given frame to its entry state so stepping resumes from the first instruction of the function with the original arguments re-bound. Higher frames above frame_id are dropped. Returns an error if the frame has no captured initial_env (scratch / evaluator frames don’t) or if the id is out of range.

Side effects already performed by the restarted frame (tool calls, file writes, host_call round-trips) are not rolled back — DAP leaves that to the adapter’s discretion. The IDE should warn on frames whose source text contains obvious side-effectful calls before invoking restartFrame.

Source

pub async fn set_variable_in_frame( &mut self, name: &str, value_expr: &str, frame_id: usize, ) -> Result<VmValue, VmError>

Assign a new value to a named binding in the paused VM’s env. Returns the value that was actually stored (after coercion, if the VM performed any) so the caller can echo it back to the DAP client. Fails if the name does not resolve to a mutable binding in any live scope.

The provided value_expr goes through the unified evaluator so callers can type expressions like plan.tasks.len() + 1 in the Locals inline-edit field, not just literals.

Source

pub async fn evaluate_in_frame( &mut self, expr: &str, _frame_id: usize, ) -> Result<VmValue, VmError>

Evaluate a Harn expression against the currently paused frame’s scope and return its value. This is the single evaluation path used by hover tips, watch expressions, conditional breakpoints, logpoint interpolation, and setVariable / setExpression before we had a unified evaluator there were four separate mini-parsers, each with its own rough edges (see burin-code #85).

The expression is wrapped as let __r = (<expr>) so arbitrary infix chains, ternaries, and access paths parse uniformly. A scratch CallFrame runs the wrapped bytecode with saved_env pointing at the caller’s env, so the compiled expression sees every local in scope. When the scratch frame pops, the caller’s env is automatically restored.

A fixed instruction budget guards against runaway expressions (infinite loops, accidental recursion) wedging the debugger. Side effects — including llm_call, host_*, and file mutators — are not blocked here; callers that invoke this for read-only surfaces (hover, watch) should reject obviously-side-effectful expressions before calling.

Source

pub fn start(&mut self, chunk: &Chunk)

Initialize execution (push the initial frame).

Source

pub fn register_builtin<F>(&mut self, name: &str, f: F)
where F: Fn(&[VmValue], &mut String) -> Result<VmValue, VmError> + 'static,

Register a sync builtin function.

Source

pub fn unregister_builtin(&mut self, name: &str)

Remove a sync builtin (so an async version can take precedence).

Source

pub fn register_async_builtin<F, Fut>(&mut self, name: &str, f: F)
where F: Fn(Vec<VmValue>) -> Fut + 'static, Fut: Future<Output = Result<VmValue, VmError>> + 'static,

Register an async builtin function.

Source

pub fn set_source_dir(&mut self, dir: &Path)

Set the source directory for import resolution and introspection. Also auto-detects the project root if not already set.

Source

pub fn set_project_root(&mut self, root: &Path)

Explicitly set the project root directory. Used by ACP/CLI to override auto-detection.

Source

pub fn project_root(&self) -> Option<&Path>

Get the project root directory, falling back to source_dir.

Source

pub fn builtin_names(&self) -> Vec<String>

Return all registered builtin names (sync + async).

Source

pub fn set_global(&mut self, name: &str, value: VmValue)

Set a global constant (e.g. pi, e). Stored separately from the environment so user-defined variables can shadow them.

Source

pub fn output(&self) -> &str

Get the captured output.

Source

pub async fn execute(&mut self, chunk: &Chunk) -> Result<VmValue, VmError>

Execute a compiled chunk.

Source

pub async fn call_closure_pub( &mut self, closure: &VmClosure, args: &[VmValue], functions: &[CompiledFunction], ) -> Result<VmValue, VmError>

Public wrapper for call_closure, used by the MCP server to invoke tool handler closures from outside the VM execution loop.

Trait Implementations§

Source§

impl Default for Vm

Source§

fn default() -> Self

Returns the “default value” for a type. 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 UnsafeUnpin 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> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> Paint for T
where T: ?Sized,

Source§

fn fg(&self, value: Color) -> Painted<&T>

Returns a styled value derived from self with the foreground set to value.

This method should be used rarely. Instead, prefer to use color-specific builder methods like red() and green(), which have the same functionality but are pithier.

§Example

Set foreground color to white using fg():

use yansi::{Paint, Color};

painted.fg(Color::White);

Set foreground color to white using white().

use yansi::Paint;

painted.white();
Source§

fn primary(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Primary].

§Example
println!("{}", value.primary());
Source§

fn fixed(&self, color: u8) -> Painted<&T>

Returns self with the fg() set to [Color :: Fixed].

§Example
println!("{}", value.fixed(color));
Source§

fn rgb(&self, r: u8, g: u8, b: u8) -> Painted<&T>

Returns self with the fg() set to [Color :: Rgb].

§Example
println!("{}", value.rgb(r, g, b));
Source§

fn black(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Black].

§Example
println!("{}", value.black());
Source§

fn red(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Red].

§Example
println!("{}", value.red());
Source§

fn green(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Green].

§Example
println!("{}", value.green());
Source§

fn yellow(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Yellow].

§Example
println!("{}", value.yellow());
Source§

fn blue(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Blue].

§Example
println!("{}", value.blue());
Source§

fn magenta(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Magenta].

§Example
println!("{}", value.magenta());
Source§

fn cyan(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Cyan].

§Example
println!("{}", value.cyan());
Source§

fn white(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: White].

§Example
println!("{}", value.white());
Source§

fn bright_black(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightBlack].

§Example
println!("{}", value.bright_black());
Source§

fn bright_red(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightRed].

§Example
println!("{}", value.bright_red());
Source§

fn bright_green(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightGreen].

§Example
println!("{}", value.bright_green());
Source§

fn bright_yellow(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightYellow].

§Example
println!("{}", value.bright_yellow());
Source§

fn bright_blue(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightBlue].

§Example
println!("{}", value.bright_blue());
Source§

fn bright_magenta(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightMagenta].

§Example
println!("{}", value.bright_magenta());
Source§

fn bright_cyan(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightCyan].

§Example
println!("{}", value.bright_cyan());
Source§

fn bright_white(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightWhite].

§Example
println!("{}", value.bright_white());
Source§

fn bg(&self, value: Color) -> Painted<&T>

Returns a styled value derived from self with the background set to value.

This method should be used rarely. Instead, prefer to use color-specific builder methods like on_red() and on_green(), which have the same functionality but are pithier.

§Example

Set background color to red using fg():

use yansi::{Paint, Color};

painted.bg(Color::Red);

Set background color to red using on_red().

use yansi::Paint;

painted.on_red();
Source§

fn on_primary(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Primary].

§Example
println!("{}", value.on_primary());
Source§

fn on_fixed(&self, color: u8) -> Painted<&T>

Returns self with the bg() set to [Color :: Fixed].

§Example
println!("{}", value.on_fixed(color));
Source§

fn on_rgb(&self, r: u8, g: u8, b: u8) -> Painted<&T>

Returns self with the bg() set to [Color :: Rgb].

§Example
println!("{}", value.on_rgb(r, g, b));
Source§

fn on_black(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Black].

§Example
println!("{}", value.on_black());
Source§

fn on_red(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Red].

§Example
println!("{}", value.on_red());
Source§

fn on_green(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Green].

§Example
println!("{}", value.on_green());
Source§

fn on_yellow(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Yellow].

§Example
println!("{}", value.on_yellow());
Source§

fn on_blue(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Blue].

§Example
println!("{}", value.on_blue());
Source§

fn on_magenta(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Magenta].

§Example
println!("{}", value.on_magenta());
Source§

fn on_cyan(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Cyan].

§Example
println!("{}", value.on_cyan());
Source§

fn on_white(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: White].

§Example
println!("{}", value.on_white());
Source§

fn on_bright_black(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightBlack].

§Example
println!("{}", value.on_bright_black());
Source§

fn on_bright_red(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightRed].

§Example
println!("{}", value.on_bright_red());
Source§

fn on_bright_green(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightGreen].

§Example
println!("{}", value.on_bright_green());
Source§

fn on_bright_yellow(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightYellow].

§Example
println!("{}", value.on_bright_yellow());
Source§

fn on_bright_blue(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightBlue].

§Example
println!("{}", value.on_bright_blue());
Source§

fn on_bright_magenta(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightMagenta].

§Example
println!("{}", value.on_bright_magenta());
Source§

fn on_bright_cyan(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightCyan].

§Example
println!("{}", value.on_bright_cyan());
Source§

fn on_bright_white(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightWhite].

§Example
println!("{}", value.on_bright_white());
Source§

fn attr(&self, value: Attribute) -> Painted<&T>

Enables the styling Attribute value.

This method should be used rarely. Instead, prefer to use attribute-specific builder methods like bold() and underline(), which have the same functionality but are pithier.

§Example

Make text bold using attr():

use yansi::{Paint, Attribute};

painted.attr(Attribute::Bold);

Make text bold using using bold().

use yansi::Paint;

painted.bold();
Source§

fn bold(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Bold].

§Example
println!("{}", value.bold());
Source§

fn dim(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Dim].

§Example
println!("{}", value.dim());
Source§

fn italic(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Italic].

§Example
println!("{}", value.italic());
Source§

fn underline(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Underline].

§Example
println!("{}", value.underline());

Returns self with the attr() set to [Attribute :: Blink].

§Example
println!("{}", value.blink());

Returns self with the attr() set to [Attribute :: RapidBlink].

§Example
println!("{}", value.rapid_blink());
Source§

fn invert(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Invert].

§Example
println!("{}", value.invert());
Source§

fn conceal(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Conceal].

§Example
println!("{}", value.conceal());
Source§

fn strike(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Strike].

§Example
println!("{}", value.strike());
Source§

fn quirk(&self, value: Quirk) -> Painted<&T>

Enables the yansi Quirk value.

This method should be used rarely. Instead, prefer to use quirk-specific builder methods like mask() and wrap(), which have the same functionality but are pithier.

§Example

Enable wrapping using .quirk():

use yansi::{Paint, Quirk};

painted.quirk(Quirk::Wrap);

Enable wrapping using wrap().

use yansi::Paint;

painted.wrap();
Source§

fn mask(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Mask].

§Example
println!("{}", value.mask());
Source§

fn wrap(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Wrap].

§Example
println!("{}", value.wrap());
Source§

fn linger(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Linger].

§Example
println!("{}", value.linger());
Source§

fn clear(&self) -> Painted<&T>

👎Deprecated since 1.0.1:

renamed to resetting() due to conflicts with Vec::clear(). The clear() method will be removed in a future release.

Returns self with the quirk() set to [Quirk :: Clear].

§Example
println!("{}", value.clear());
Source§

fn resetting(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Resetting].

§Example
println!("{}", value.resetting());
Source§

fn bright(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Bright].

§Example
println!("{}", value.bright());
Source§

fn on_bright(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: OnBright].

§Example
println!("{}", value.on_bright());
Source§

fn whenever(&self, value: Condition) -> Painted<&T>

Conditionally enable styling based on whether the Condition value applies. Replaces any previous condition.

See the crate level docs for more details.

§Example

Enable styling painted only when both stdout and stderr are TTYs:

use yansi::{Paint, Condition};

painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);
Source§

fn new(self) -> Painted<Self>
where Self: Sized,

Create a new Painted with a default Style. Read more
Source§

fn paint<S>(&self, style: S) -> Painted<&Self>
where S: Into<Style>,

Apply a style wholesale to self. Any previous style is replaced. Read more
Source§

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

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more