pub struct Interner { /* private fields */ }Expand description
An append-only set of strings, each mapped to a Symbol.
Strings are never removed, which is what makes a Symbol valid for the lifetime of the
compilation and what lets the storage be a plain growing buffer.
Implementations§
Source§impl Interner
impl Interner
Sourcepub fn with_capacity(cap: usize) -> Self
pub fn with_capacity(cap: usize) -> Self
An interner with room for cap strings, to avoid regrowing on a large header set.
Sourcepub fn intern(&mut self, s: &str) -> Symbol
pub fn intern(&mut self, s: &str) -> Symbol
Interns s, returning the existing symbol if it has been seen.
§Panics
Panics if more than Idx::MAX distinct strings are interned.
Sourcepub fn join(&mut self, prefix: &'static str, name: &'static str) -> Symbol
pub fn join(&mut self, prefix: &'static str, name: &'static str) -> Symbol
Interns prefix followed by name, returning the existing symbol if it has been seen.
The same answer as interning the two written together, without writing them together after the first time. The back end asks this for each machine opcode it puts in each function, which is the target’s prefix in front of a name out of one of its tables, and both halves are the same few hundred static strings every time.
Sourcepub fn intern_bytes(&mut self, bytes: &[u8]) -> Symbol
pub fn intern_bytes(&mut self, bytes: &[u8]) -> Symbol
Interns a spelling that may not be text, returning the existing symbol if it has been seen.
A spelling that is UTF-8 is interned as itself, so nothing changes for the common case and
a byte spelling equal to a name is the same symbol as that name. One that is not gets a
symbol of its own whose text is the lossy reading, which is what Interner::resolve
hands back, and whose bytes are kept beside it for Interner::resolve_bytes.
§Panics
Panics if more than Idx::MAX distinct spellings are interned.
Sourcepub fn find(&self, s: &str) -> Option<Symbol>
pub fn find(&self, s: &str) -> Option<Symbol>
The symbol s was interned as, and None when nothing has interned it.
For a name the compiler knows and a program may or may not write: one it did not write was never interned, and asking this is how a table of such names is matched against the source without adding any of them to it.
Sourcepub fn resolve(&self, sym: Symbol) -> &str
pub fn resolve(&self, sym: Symbol) -> &str
The text behind a symbol.
§Panics
Panics if the symbol came from a different interner. There is one interner per compilation, so this is a bug rather than a condition to handle.
Sourcepub fn resolve_bytes(&self, sym: Symbol) -> &[u8] ⓘ
pub fn resolve_bytes(&self, sym: Symbol) -> &[u8] ⓘ
The bytes behind a symbol, which is the spelling exactly as it was written.
The same as resolve(sym).as_bytes() for every symbol that came from text, which is all
of them but the ones Interner::intern_bytes made from bytes that are not UTF-8.
§Panics
Panics if the symbol came from a different interner, as Interner::resolve does.