cljrs-env
Environments for running programs in.
versioned module (non-WASM)
Shared versioned-symbol/namespace resolution service used by every
execution tier (tree-walker, IR interpreter, JIT/AOT rt_load_global*
bridges). Resolving ns/name@commit ensures the immutable versioned
namespace "ns@commit" is loaded — from an embedded builtin source first,
falling back to fetching the file from git history — then performs a plain
lookup_in_ns("ns@commit", name). Native (Rust-backed) symbols with no
Clojure source fall back to the HEAD implementation. Public API:
resolve_versioned_value(globals, defining_ns, ns_part, name, commit) -> EvalResult<Value>— full resolution: alias handling, lazy namespace load, native HEAD fallbackensure_versioned_ns_loaded(globals, base_ns, commit) -> EvalResult<Arc<str>>— idempotent load of"base_ns@commit"(same cycle/cross-thread coordination as the unversioned loader); returns the versioned namespace namebase_ns_name(ns: &str) -> &str— strip a trailing@<commit>suffix
Sources fetched from git are recorded in GlobalEnv::versioned_sources
(record_versioned_source / versioned_sources_snapshot) so the AOT
compiler can embed them in produced binaries.
pin_if_available(globals, base_ns, commit) -> EvalResult<bool> is the AOT
discovery hook: force-loads a pin when its source is locatable, skips
otherwise. GlobalEnv::set_versioned_offline(true) (called by AOT harness
binaries) restricts versioned loading to embedded sources — a missing
embedding fails with a clear "was not embedded at compile time" error
instead of fetching from git.
Native (Rust-backed) packages get a verified HEAD binding: the fallback
checks the pin against GlobalEnv::native_provenance (recorded via
set_native_provenance / Registry::set_provenance; prefix-match in either
direction for abbreviated hashes). Mismatching or missing provenance warns
once per pin (provenance_warned), or errors when
set_enforce_native_versions(true) is set (--enforce-native-versions,
cljrs.edn :enforce-native-versions).
Opt-in pinned native code: GlobalEnv::set_pinned_native_loader installs a
PinnedNativeLoader callback (provided by cljrs-dylib); the resolver
consults it before the HEAD fallback, and a successful load redirects the
lookup into the freshly registered "<ns>@<commit>" namespace.
gc_roots module
The gc_roots module manages GC root registration for the interpreter's Rust call stack. Public API includes:
push_env_root(env: &Env) -> EnvRootGuard— registers anEnvpointer as a GC root; guard removes on droproot_value(val: &Value) -> ValueRootGuard— registers a singleValuepointer as a GC rootroot_values(vals: &[Value]) -> ValueRootGuard— registers a slice ofValuepointers as GC rootsroot_option_values(vals: &[Option<Value>]) -> OptionValueRootGuard— registers anOption<Value>slice (e.g. IR register file)gc_safepoint(env: &Env)— interpreter-level safepoint: parks if collection in progress, or initiates collection on memory pressureforce_collect(env: &Env)— immediately initiates a GC collection bypassing memory-pressure thresholdasync_gc_collect()— services a pending GC request from a TokioLocalSettask at a cooperative yield point; safe to call when no other tasks are polling, so thread-local root stacks are stable and fully describe all suspended-taskGcPtrsset_stw_reclaim_hook(f)— registers a stop-the-world reclaim hook; multiple hooks may be registered and each runs (in registration order) inside the STW guard at the tail of every collection (force_collect,gc_safepoint,async_gc_collect), when all mutator threads are parked. Registrants:cljrs-jitfrees superseded native code (Phase 10.2);cljrs-eval's lowering worker sweeps idle Tier-1 IR (Phase 10.7)
Root tracing covers all namespaces (including immutable ns@commit
namespaces) and the values in GlobalEnv::version_cache, so versioned
values that exist only in the cache (native HEAD fallbacks) survive
collection.
apply module
apply_value applies an evaluated callee to evaluated args (functions,
keywords, maps, sets, vars, protocol/multimethod dispatch). Protocol dispatch
helpers shared with the Phase 10.6 inline caches:
type_tag_of(val: &Value) -> Arc<str>— canonical protocol dispatch tag of a valuetype_tag_matches(val: &Value, tag: &str) -> bool— allocation-free equality against a cached tag; must agree exactly withtype_tag_of(used byrt_call_ic's hot path incljrs-compiler)dispatch_if_async(callee, args, env)— spawn^:asynccallees on the async runtime
error module
EvalError / EvalResult are the evaluator's error types. Helpers:
EvalError::to_error_value(self) -> Value— convert an error into a Clojure error value;Thrownis returned unchanged, anything else is wrapped in a freshExceptionInfovalue_error_to_eval_error(err: ValueError) -> EvalError— surface a builtin'sValueErroras a catchableEvalError::Thrown(Value::Error(..)), preserving the original variant and its plain message (noruntime error:prefix) so(catch :default e ..)/ex-message/ex-databehave the same as for a userthrow/ex-info. AValueError::Thrownre-surfaces the exact value.
callback module
Thread-local eval context for Rust→Clojure callbacks (invoke, with_eval_context). The context is pushed automatically around native builtin calls and by the Tier-1 IR executor; rt_abi bridges (rt_call, rt_load_global, the HOF bridges) dispatch through it. Public API includes:
push_eval_context(env: &Env)/pop_eval_context()— bracket a native call with the current env's globals + namespacecapture_eval_context() -> Option<(Arc<GlobalEnv>, Arc<str>)>— snapshot the innermost context (e.g. to hand to another thread)install_eval_context(globals, ns)— push a previously captured context (spawned threads)install_eval_context_guard(globals, ns) -> EvalContextGuard— likeinstall_eval_context, but pops on drop (including unwind); used by the JIT-native dispatch seamcurrent_is_async() -> bool— whether the innermost context is inside an^:asyncbodyinvoke(f: &Value, args: Vec<Value>) -> ValueResult<Value>— call a Clojure-callable value through the innermost context. Honors^:asyncdispatch (viaapply::dispatch_if_async) so a native/compiled caller of an^:asyncfn gets aValue::Future, not a synchronously-run bodywith_eval_context(f)— run a closure with a temporaryEnvbuilt from the innermost context
async_hook module
The optional async-runtime seam (AsyncRuntime trait, installed by cljrs-async). Also hosts the async-JIT compile hook: set_async_compile_hook / async_compile_hook (fn(&Value, usize, &mut Env)), installed by cljrs-jit::init and called by the async dispatcher to lower + compile + register a native poll function for a called ^:async arity (a no-op when the JIT is absent).