about summary refs log tree commit diff
path: root/src/libsyntax/parse
diff options
context:
space:
mode:
authorJeffrey Seyfried <jeffrey.seyfried@gmail.com>2016-07-11 19:33:40 +0000
committerJeffrey Seyfried <jeffrey.seyfried@gmail.com>2016-07-11 22:25:04 +0000
commit752d4419a060e007548cf56f85ff864a13589567 (patch)
treeea4dc19e713a1e4ec99ed0992462c908f56bf064 /src/libsyntax/parse
parent70e2845230ffeb013814c9bab08c7fe033410f03 (diff)
downloadrust-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.rs25
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.