diff options
| author | Jeffrey Seyfried <jeffrey.seyfried@gmail.com> | 2016-07-11 19:33:40 +0000 |
|---|---|---|
| committer | Jeffrey Seyfried <jeffrey.seyfried@gmail.com> | 2016-07-11 22:25:04 +0000 |
| commit | 752d4419a060e007548cf56f85ff864a13589567 (patch) | |
| tree | ea4dc19e713a1e4ec99ed0992462c908f56bf064 /src/libsyntax/parse | |
| parent | 70e2845230ffeb013814c9bab08c7fe033410f03 (diff) | |
| download | rust-752d4419a060e007548cf56f85ff864a13589567.tar.gz rust-752d4419a060e007548cf56f85ff864a13589567.zip | |
Refactor `get_ident_interner` -> `with_ident_interner`.
Diffstat (limited to 'src/libsyntax/parse')
| -rw-r--r-- | src/libsyntax/parse/token.rs | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs index 222cf65b78e..c3908118284 100644 --- a/src/libsyntax/parse/token.rs +++ b/src/libsyntax/parse/token.rs @@ -477,17 +477,20 @@ pub type IdentInterner = Interner; // if an interner exists in TLS, return it. Otherwise, prepare a // fresh one. // FIXME(eddyb) #8726 This should probably use a thread-local reference. -pub fn get_ident_interner() -> Rc<IdentInterner> { - thread_local!(static KEY: Rc<::parse::token::IdentInterner> = { - Rc::new(mk_fresh_ident_interner()) +pub fn with_ident_interner<T, F: FnOnce(&IdentInterner) -> T>(f: F) -> T { + thread_local!(static KEY: IdentInterner = { + mk_fresh_ident_interner() }); - KEY.with(|k| k.clone()) + KEY.with(f) } /// Reset the ident interner to its initial state. pub fn reset_ident_interner() { - let interner = get_ident_interner(); - interner.reset(mk_fresh_ident_interner()); + with_ident_interner(|interner| interner.reset(mk_fresh_ident_interner())); +} + +pub fn clear_ident_interner() { + with_ident_interner(|interner| interner.clear()); } /// Represents a string stored in the thread-local interner. Because the @@ -521,8 +524,7 @@ impl InternedString { #[inline] pub fn new_from_name(name: ast::Name) -> InternedString { - let interner = get_ident_interner(); - InternedString::new_from_rc_str(interner.get(name)) + with_ident_interner(|interner| InternedString::new_from_rc_str(interner.get(name))) } } @@ -610,13 +612,13 @@ pub fn intern_and_get_ident(s: &str) -> InternedString { /// Maps a string to its interned representation. #[inline] pub fn intern(s: &str) -> ast::Name { - get_ident_interner().intern(s) + with_ident_interner(|interner| interner.intern(s)) } /// gensym's a new usize, using the current interner. #[inline] pub fn gensym(s: &str) -> ast::Name { - get_ident_interner().gensym(s) + with_ident_interner(|interner| interner.gensym(s)) } /// Maps a string to an identifier with an empty syntax context. @@ -635,8 +637,7 @@ pub fn gensym_ident(s: &str) -> ast::Ident { // note that this guarantees that str_ptr_eq(ident_to_string(src),interner_get(fresh_name(src))); // that is, that the new name and the old one are connected to ptr_eq strings. pub fn fresh_name(src: ast::Ident) -> ast::Name { - let interner = get_ident_interner(); - interner.gensym_copy(src.name) + with_ident_interner(|interner| interner.gensym_copy(src.name)) // following: debug version. Could work in final except that it's incompatible with // good error messages and uses of struct names in ambiguous could-be-binding // locations. Also definitely destroys the guarantee given above about ptr_eq. |
