pub struct Parser<'a> { /* private fields */ }Implementations§
Source§impl<'a> Parser<'a>
impl<'a> Parser<'a>
pub fn new(toks: Vec<Token<'a>>) -> Self
Sourcepub fn parse_expression(self) -> Result<Expr<'a>, Diagnostic>
pub fn parse_expression(self) -> Result<Expr<'a>, Diagnostic>
Entry point for a single expression (#{...} interpolations, REPL).
Sourcepub fn parse_module(self) -> Result<Module<'a>, Vec<Diagnostic>>
pub fn parse_module(self) -> Result<Module<'a>, Vec<Diagnostic>>
Debug builds parse on a thread with a 64 MiB stack. MAX_PARSE_DEPTH
already caps the recursion at 256 frames, which a release build clears in
tens of kilobytes — but a debug frame is roughly ten times larger, and 256
of them can approach the ~1 MiB default stack on Windows before the guard
trips.
Release builds — and wasm, which has no threads at all — recurse on the stack they are given. This is not a weakening: the guard is what makes the parser DoS-safe, and it is unconditional. The thread only ever bought head room for fat debug frames.
It bought that head room expensively. Spawning the thread costs about
115 µs, against 7.8 µs for parsing the reference manifest — sixteen times
the work it protects, paid on every check, every eval, and every
reparse the language server does while someone types.