diff options
| author | Nicholas Nethercote <nnethercote@mozilla.com> | 2019-05-14 15:13:42 +1000 |
|---|---|---|
| committer | Nicholas Nethercote <nnethercote@mozilla.com> | 2019-05-20 09:17:02 +1000 |
| commit | c06cdbeac55ec87181d015d2ef759349521773ea (patch) | |
| tree | 7aca56810dc84cec24f397aac620b77a25cc55f7 /src/libsyntax_pos | |
| parent | 257eaf523f7faabfc9845a238ec3776fc45fcd81 (diff) | |
| download | rust-c06cdbeac55ec87181d015d2ef759349521773ea.tar.gz rust-c06cdbeac55ec87181d015d2ef759349521773ea.zip | |
Introduce `LocalInternedString::intern`.
`LocalInternedString::intern(x)` is preferable to `Symbol::intern(x).as_str()`, because the former involves one call to `with_interner` while the latter involves two.
Diffstat (limited to 'src/libsyntax_pos')
| -rw-r--r-- | src/libsyntax_pos/symbol.rs | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/libsyntax_pos/symbol.rs b/src/libsyntax_pos/symbol.rs index e0425220c3f..04323878934 100644 --- a/src/libsyntax_pos/symbol.rs +++ b/src/libsyntax_pos/symbol.rs @@ -1029,6 +1029,17 @@ pub struct LocalInternedString { } impl LocalInternedString { + /// Maps a string to its interned representation. + pub fn intern(string: &str) -> Self { + let string = with_interner(|interner| { + let symbol = interner.intern(string); + interner.strings[symbol.0.as_usize()] + }); + LocalInternedString { + string: unsafe { std::mem::transmute::<&str, &str>(string) } + } + } + pub fn as_interned_str(self) -> InternedString { InternedString { symbol: Symbol::intern(self.string) @@ -1105,7 +1116,7 @@ impl fmt::Display for LocalInternedString { impl Decodable for LocalInternedString { fn decode<D: Decoder>(d: &mut D) -> Result<LocalInternedString, D::Error> { - Ok(Symbol::intern(&d.read_str()?).as_str()) + Ok(LocalInternedString::intern(&d.read_str()?)) } } |
