pub struct ArithCompiler<'a> {
pub input: &'a str,
pub pos: usize,
pub builder: ChunkBuilder,
pub slots: HashMap<String, u16>,
pub next_slot: u16,
pub assigned: HashSet<String>,
}Expand description
Arithmetic expression compiler.
Takes a zsh arithmetic expression (the content inside
$((...))) and emits fusevm bytecodes that compute the result.
Tokenizer port: same lexer shape as zzlex() /
mathlex() from Src/math.c. Emit step: zshrs-original —
C zsh evaluates inline via mathevall() (Src/math.c) and has
no compile-then-run path.
Fields§
§input: &'a strinput field.
pos: usizepos field.
builder: ChunkBuilderbuilder field.
slots: HashMap<String, u16>Variable name → slot index
next_slot: u16next_slot field.
assigned: HashSet<String>Names this expression ASSIGNS to (x = …, x += …, x++, --x).
c:Src/math.c:1364-1372 — only an OP_E2/OP_E2IO operator reaches
setmathvar; a name that is merely READ never gets written back.
compile_arith_str uses this to write back exactly the names C
would, instead of every identifier the expression mentions.
Implementations§
Source§impl<'a> ArithCompiler<'a>
impl<'a> ArithCompiler<'a>
Sourcepub fn compile(self) -> Chunk
pub fn compile(self) -> Chunk
Compile the arithmetic expression to fusevm bytecodes. Returns the compiled chunk.
pub fn slot_for(&mut self, name: &str) -> u16
Sourcepub fn collect_identifiers(&self, expr: &str) -> Vec<String>
pub fn collect_identifiers(&self, expr: &str) -> Vec<String>
Walk the input string and collect all identifier names that appear.
Used by compile_arith_inline to pre-load values from
executor.variables and to know which slots to write back after.
Excludes language keywords and numeric literals.
Auto Trait Implementations§
impl<'a> Freeze for ArithCompiler<'a>
impl<'a> RefUnwindSafe for ArithCompiler<'a>
impl<'a> Send for ArithCompiler<'a>
impl<'a> Sync for ArithCompiler<'a>
impl<'a> Unpin for ArithCompiler<'a>
impl<'a> UnsafeUnpin for ArithCompiler<'a>
impl<'a> UnwindSafe for ArithCompiler<'a>
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<F, W, T, D> Deserialize<With<T, W>, D> for F
impl<F, W, T, D> Deserialize<With<T, W>, D> for F
impl<A, B, T> HttpServerConnExec<A, B> for Twhere
B: Body,
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 more