pub struct Vm { /* private fields */ }Expand description
The Harn bytecode virtual machine.
Implementations§
Source§impl Vm
impl Vm
Sourcepub fn set_breakpoints_for_file(&mut self, file: &str, lines: Vec<usize>)
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.
Sourcepub fn set_breakpoints(&mut self, lines: Vec<usize>)
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.
Sourcepub fn set_function_breakpoints(&mut self, names: Vec<String>)
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.
Sourcepub fn function_breakpoint_names(&self) -> Vec<String>
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.
Sourcepub fn take_pending_function_bp(&mut self) -> Option<String>
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.
Sourcepub fn set_step_mode(&mut self, step: bool)
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).
Sourcepub fn set_step_over(&mut self)
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).
Sourcepub fn set_debug_hook<F>(&mut self, hook: F)
pub fn set_debug_hook<F>(&mut self, hook: F)
Register a debug hook invoked whenever execution advances to a new source line.
Sourcepub fn clear_debug_hook(&mut self)
pub fn clear_debug_hook(&mut self)
Clear the current debug hook.
Sourcepub fn set_step_out(&mut self)
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).
Sourcepub fn is_stopped(&self) -> bool
pub fn is_stopped(&self) -> bool
Check if the VM is stopped at a debug point.
Sourcepub fn debug_state(&self) -> DebugState
pub fn debug_state(&self) -> DebugState
Get the current debug state (variables, line, etc.).
Sourcepub fn call_sites_on_line(&self, line: u32) -> Vec<(u32, String)>
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.
Sourcepub fn install_cancel_token(&mut self, token: Arc<AtomicBool>)
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.
Sourcepub fn signal_cancel(&mut self) -> Arc<AtomicBool> ⓘ
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.
Sourcepub fn is_cancel_requested(&self) -> bool
pub fn is_cancel_requested(&self) -> bool
True when cooperative cancellation has been requested.
Sourcepub fn identifiers_in_scope(&self, _frame_id: usize) -> Vec<String>
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.
Sourcepub fn debug_stack_frames(&self) -> Vec<(String, usize)>
pub fn debug_stack_frames(&self) -> Vec<(String, usize)>
Get all stack frames for the debugger.
Sourcepub fn debug_stack_frames_with_sources(
&self,
) -> Vec<(String, usize, Option<String>)>
pub fn debug_stack_frames_with_sources( &self, ) -> Vec<(String, usize, Option<String>)>
Get all stack frames plus their source keys for debugger clients that
can retrieve synthetic sources through DAP source.
Sourcepub fn debug_source_for_path(&self, path: &str) -> Option<String>
pub fn debug_source_for_path(&self, path: &str) -> Option<String>
Return cached source text by debugger source key. This covers entry programs, real imports that have already been read, and synthetic sources such as stdlib modules or generated in-memory modules.
Sourcepub async fn step_execute(&mut self) -> Result<Option<(VmValue, bool)>, VmError>
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.
Sourcepub fn frame_count(&self) -> usize
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.
Sourcepub fn restart_frame(&mut self, frame_id: usize) -> Result<(), VmError>
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.
Sourcepub async fn set_variable_in_frame(
&mut self,
name: &str,
value_expr: &str,
frame_id: usize,
) -> Result<VmValue, VmError>
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.
Sourcepub async fn evaluate_in_frame(
&mut self,
expr: &str,
_frame_id: usize,
) -> Result<VmValue, VmError>
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§impl Vm
impl Vm
Sourcepub fn register_builtin<F>(&mut self, name: &str, f: F)
pub fn register_builtin<F>(&mut self, name: &str, f: F)
Register a sync builtin function.
Sourcepub fn register_builtin_with_metadata<F>(
&mut self,
metadata: VmBuiltinMetadata,
f: F,
)
pub fn register_builtin_with_metadata<F>( &mut self, metadata: VmBuiltinMetadata, f: F, )
Register a sync builtin function with discoverable metadata.
Sourcepub fn unregister_builtin(&mut self, name: &str)
pub fn unregister_builtin(&mut self, name: &str)
Remove a sync builtin (so an async version can take precedence).
Sourcepub fn register_async_builtin<F, Fut>(&mut self, name: &str, f: F)
pub fn register_async_builtin<F, Fut>(&mut self, name: &str, f: F)
Register an async builtin function.
Sourcepub fn register_async_builtin_with_metadata<F, Fut>(
&mut self,
metadata: VmBuiltinMetadata,
f: F,
)
pub fn register_async_builtin_with_metadata<F, Fut>( &mut self, metadata: VmBuiltinMetadata, f: F, )
Register an async builtin function with discoverable metadata.
Source§impl Vm
impl Vm
Sourcepub async fn load_module_exports(
&mut self,
path: &Path,
) -> Result<BTreeMap<String, Rc<VmClosure>>, VmError>
pub async fn load_module_exports( &mut self, path: &Path, ) -> Result<BTreeMap<String, Rc<VmClosure>>, VmError>
Load a module file and return the exported function closures that would be visible to a wildcard import.
Source§impl Vm
impl Vm
pub fn new() -> Self
Sourcepub fn set_bridge(&mut self, bridge: Rc<HostBridge>)
pub fn set_bridge(&mut self, bridge: Rc<HostBridge>)
Set the bridge for delegating unknown builtins in bridge mode.
Sourcepub fn set_denied_builtins(&mut self, denied: HashSet<String>)
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.
Sourcepub fn set_source_info(&mut self, file: &str, text: &str)
pub fn set_source_info(&mut self, file: &str, text: &str)
Set source info for error reporting (file path and source text).
Sourcepub fn set_source_dir(&mut self, dir: &Path)
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.
Sourcepub fn set_project_root(&mut self, root: &Path)
pub fn set_project_root(&mut self, root: &Path)
Explicitly set the project root directory. Used by ACP/CLI to override auto-detection.
Sourcepub fn project_root(&self) -> Option<&Path>
pub fn project_root(&self) -> Option<&Path>
Get the project root directory, falling back to source_dir.
Sourcepub fn builtin_names(&self) -> Vec<String>
pub fn builtin_names(&self) -> Vec<String>
Return all registered builtin names (sync + async).
Sourcepub fn builtin_metadata(&self) -> Vec<VmBuiltinMetadata>
pub fn builtin_metadata(&self) -> Vec<VmBuiltinMetadata>
Return discoverable metadata for registered builtins.
Sourcepub fn builtin_metadata_for(&self, name: &str) -> Option<&VmBuiltinMetadata>
pub fn builtin_metadata_for(&self, name: &str) -> Option<&VmBuiltinMetadata>
Return discoverable metadata for a registered builtin name.
Sourcepub fn set_global(&mut self, name: &str, value: VmValue)
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.
Sourcepub fn take_output(&mut self) -> String
pub fn take_output(&mut self) -> String
Drain and return the captured output, leaving the buffer empty. Used by the async-builtin dispatch path to forward closure output from a child VM back to its parent.
Sourcepub fn append_output(&mut self, text: &str)
pub fn append_output(&mut self, text: &str)
Append text to this VM’s captured output. Used to forward output
from child VMs (e.g. closures invoked via call_closure_pub)
back into the parent stream.
Trait Implementations§
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<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
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> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
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 bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
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>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
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 rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
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 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.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
Source§fn whenever(&self, value: Condition) -> Painted<&T>
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);