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 20:00:07 +0000
committerJeffrey Seyfried <jeffrey.seyfried@gmail.com>2016-07-11 22:25:08 +0000
commit060b5c5ef273a6b74ccbd10c1d4a1debfa27d9de (patch)
tree63c0862d64c7c01fe52a02099e816f644e11aa02 /src/libsyntax/parse
parent752d4419a060e007548cf56f85ff864a13589567 (diff)
downloadrust-060b5c5ef273a6b74ccbd10c1d4a1debfa27d9de.tar.gz
rust-060b5c5ef273a6b74ccbd10c1d4a1debfa27d9de.zip
Factor the `RefCell` out of the `Interner`.
Diffstat (limited to 'src/libsyntax/parse')
-rw-r--r--src/libsyntax/parse/token.rs13
1 files changed, 7 insertions, 6 deletions
diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs
index c3908118284..ab7ed223bb3 100644
--- a/src/libsyntax/parse/token.rs
+++ b/src/libsyntax/parse/token.rs
@@ -21,6 +21,7 @@ use util::interner::Interner;
 use tokenstream;
 
 use serialize::{Decodable, Decoder, Encodable, Encoder};
+use std::cell::RefCell;
 use std::fmt;
 use std::ops::Deref;
 use std::rc::Rc;
@@ -477,20 +478,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 with_ident_interner<T, F: FnOnce(&IdentInterner) -> T>(f: F) -> T {
-    thread_local!(static KEY: IdentInterner = {
-        mk_fresh_ident_interner()
+pub fn with_ident_interner<T, F: FnOnce(&mut IdentInterner) -> T>(f: F) -> T {
+    thread_local!(static KEY: RefCell<IdentInterner> = {
+        RefCell::new(mk_fresh_ident_interner())
     });
-    KEY.with(f)
+    KEY.with(|interner| f(&mut *interner.borrow_mut()))
 }
 
 /// Reset the ident interner to its initial state.
 pub fn reset_ident_interner() {
-    with_ident_interner(|interner| interner.reset(mk_fresh_ident_interner()));
+    with_ident_interner(|interner| *interner = mk_fresh_ident_interner());
 }
 
 pub fn clear_ident_interner() {
-    with_ident_interner(|interner| interner.clear());
+    with_ident_interner(|interner| *interner = IdentInterner::new());
 }
 
 /// Represents a string stored in the thread-local interner. Because the