Improve the comments in Symbol::interner
.
This commit is contained in:
parent
207c80f105
commit
66153d76e2
1 changed files with 13 additions and 6 deletions
|
@ -1716,8 +1716,9 @@ pub(crate) struct Interner(Lock<InternerInner>);
|
||||||
// found that to regress performance up to 2% in some cases. This might be
|
// found that to regress performance up to 2% in some cases. This might be
|
||||||
// revisited after further improvements to `indexmap`.
|
// revisited after further improvements to `indexmap`.
|
||||||
//
|
//
|
||||||
// This type is private to prevent accidentally constructing more than one `Interner` on the same
|
// This type is private to prevent accidentally constructing more than one
|
||||||
// thread, which makes it easy to mixup `Symbol`s between `Interner`s.
|
// `Interner` on the same thread, which makes it easy to mixup `Symbol`s
|
||||||
|
// between `Interner`s.
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
struct InternerInner {
|
struct InternerInner {
|
||||||
arena: DroplessArena,
|
arena: DroplessArena,
|
||||||
|
@ -1743,14 +1744,20 @@ impl Interner {
|
||||||
|
|
||||||
let name = Symbol::new(inner.strings.len() as u32);
|
let name = Symbol::new(inner.strings.len() as u32);
|
||||||
|
|
||||||
// `from_utf8_unchecked` is safe since we just allocated a `&str` which is known to be
|
// SAFETY: we convert from `&str` to `&[u8]`, clone it into the arena,
|
||||||
// UTF-8.
|
// and immediately convert the clone back to `&[u8], all because there
|
||||||
|
// is no `inner.arena.alloc_str()` method. This is clearly safe.
|
||||||
let string: &str =
|
let string: &str =
|
||||||
unsafe { str::from_utf8_unchecked(inner.arena.alloc_slice(string.as_bytes())) };
|
unsafe { str::from_utf8_unchecked(inner.arena.alloc_slice(string.as_bytes())) };
|
||||||
// It is safe to extend the arena allocation to `'static` because we only access
|
|
||||||
// these while the arena is still alive.
|
// SAFETY: we can extend the arena allocation to `'static` because we
|
||||||
|
// only access these while the arena is still alive.
|
||||||
let string: &'static str = unsafe { &*(string as *const str) };
|
let string: &'static str = unsafe { &*(string as *const str) };
|
||||||
inner.strings.push(string);
|
inner.strings.push(string);
|
||||||
|
|
||||||
|
// This second hash table lookup can be avoided by using `RawEntryMut`,
|
||||||
|
// but this code path isn't hot enough for it to be worth it. See
|
||||||
|
// #91445 for details.
|
||||||
inner.names.insert(string, name);
|
inner.names.insert(string, name);
|
||||||
name
|
name
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue