Skip to main content

ExecCtx

Struct ExecCtx 

Source
pub struct ExecCtx<R: Rt, E: UserEvent> {
    pub libstate: LibState,
    pub env: Env,
    pub cached: FxHashMap<BindId, Value>,
    pub rt: R,
    pub lambda_defs: FxHashMap<LambdaId, Value>,
    pub deferred_checks: Vec<Box<dyn FnOnce(&mut ExecCtx<R, E>) -> Result<()> + Send + Sync>>,
    pub references: GPooled<Vec<ReferenceSite>>,
    pub module_references: GPooled<Vec<ModuleRefSite>>,
    pub scope_map: GPooled<Vec<ScopeMapEntry>>,
    /* private fields */
}

Fields§

§libstate: LibState

context global library state for built-in functions

§env: Env

the language environment, typdefs, binds, lambdas, etc

§cached: FxHashMap<BindId, Value>

the last value of every bound variable

§rt: R

the runtime

§lambda_defs: FxHashMap<LambdaId, Value>

LambdaDefs indexed by LambdaId, for deferred type checking

§deferred_checks: Vec<Box<dyn FnOnce(&mut ExecCtx<R, E>) -> Result<()> + Send + Sync>>

deferred type check closures, evaluated after all primary type checking

§references: GPooled<Vec<ReferenceSite>>

Reference sites accumulated during compilation. Each is a textual occurrence of a name and the BindId it resolved to. At compile boundaries, swap with a fresh REFERENCE_SITE_POOL container via mem::replace (not mem::takeDefault routes to the unsized thread-local registry, not our named pool). Only populated when env.lsp_mode is set.

§module_references: GPooled<Vec<ModuleRefSite>>

Module reference sites — use foo; and mod foo; mentions. Same scoping rules as references.

§scope_map: GPooled<Vec<ScopeMapEntry>>

Per-compile scope map. compile() pushes one entry every time it’s invoked, recording the scope it was called with. IDE tooling reads this to answer cursor → scope queries.

Implementations§

Source§

impl<R: Rt, E: UserEvent> ExecCtx<R, E>

Source

pub fn clear(&mut self)

Source

pub fn new(user: R) -> Result<Self>

Build a new execution context.

This is a very low level interface that you can use to build a custom runtime with deep integration to your code. It is very difficult to use, and if you don’t implement everything correctly the semantics of the language can be wrong.

Most likely you want to use the rt module instead.

Source

pub fn register_builtin<T: BuiltIn<R, E>>(&mut self) -> Result<()>

Source

pub fn wrap_lambda(&mut self, def: LambdaDef<R, E>) -> Value

Wrap a LambdaDef into a Value that can be returned from a builtin as a first-class function value. The runtime handles the resulting Value as a callable lambda — call sites resolve against the LambdaDef’s init to construct an Apply impl. Also registers the LambdaDef in lambda_defs so deferred typechecking can find it.

Source

pub fn set_var(&mut self, id: BindId, v: Value)

Built in functions should call this when variables are set unless they are sure the variable does not need to be cached. This will also call the user ctx set_var.

Source

pub fn with_restored<T, F: FnOnce(&mut Self) -> T>( &mut self, env: Env, f: F, ) -> T

Restore the lexical environment to the snapshot env for the duration of f restoring it to it’s original value afterwords. by_id and lambdas defined by the closure will be retained.

Source

pub fn with_restored_mut<T, F: FnOnce(&mut Self) -> T>( &mut self, env: &mut Env, f: F, ) -> T

Restore the lexical environment to the snapshot env for the duration of f restoring it to it’s original value afterwords. by_id and lambdas defined by the closure will be retained. env will be mutated instead of requiring a clone, this allows maintaining continuity in two different envs across multiple invocations

Auto Trait Implementations§

§

impl<R, E> Freeze for ExecCtx<R, E>
where R: Freeze,

§

impl<R, E> !RefUnwindSafe for ExecCtx<R, E>

§

impl<R, E> Send for ExecCtx<R, E>
where R: Send,

§

impl<R, E> Sync for ExecCtx<R, E>
where R: Sync,

§

impl<R, E> Unpin for ExecCtx<R, E>
where R: Unpin,

§

impl<R, E> UnsafeUnpin for ExecCtx<R, E>
where R: UnsafeUnpin,

§

impl<R, E> !UnwindSafe for ExecCtx<R, E>

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<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

Source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

Source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

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