diff options
| author | bors <bors@rust-lang.org> | 2016-07-13 10:26:18 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-07-13 10:26:18 -0700 |
| commit | 0b7fb80e1c05bee176ea68d21e19a352a106c968 (patch) | |
| tree | 0db4006f136b461d7cbdc2cd8de302e69dc1cc17 /src/libsyntax/parse | |
| parent | 4a12a70a5c516d4aa5e86de52a62f41b67ab8bc0 (diff) | |
| parent | 060b5c5ef273a6b74ccbd10c1d4a1debfa27d9de (diff) | |
| download | rust-0b7fb80e1c05bee176ea68d21e19a352a106c968.tar.gz rust-0b7fb80e1c05bee176ea68d21e19a352a106c968.zip | |
Auto merge of #34772 - jseyfried:cleanup_interner, r=eddyb
Start cleaning up the string interner r? @eddyb
Diffstat (limited to 'src/libsyntax/parse')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/parse/token.rs | 39 |
2 files changed, 20 insertions, 21 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index c6374e59c1b..4656ba03e21 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -259,7 +259,6 @@ pub struct Parser<'a> { pub restrictions: Restrictions, pub quote_depth: usize, // not (yet) related to the quasiquoter pub reader: Box<Reader+'a>, - pub interner: Rc<token::IdentInterner>, /// The set of seen errors about obsolete syntax. Used to suppress /// extra detail when the same error is seen twice pub obsolete_set: HashSet<ObsoleteSyntax>, @@ -356,7 +355,6 @@ impl<'a> Parser<'a> { Parser { reader: rdr, - interner: token::get_ident_interner(), sess: sess, cfg: cfg, token: tok0.tok, diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs index 8376d28164d..ab7ed223bb3 100644 --- a/src/libsyntax/parse/token.rs +++ b/src/libsyntax/parse/token.rs @@ -17,11 +17,11 @@ pub use self::Token::*; use ast::{self, BinOpKind}; use ext::mtwt; use ptr::P; -use util::interner::{RcStr, StrInterner}; -use util::interner; +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; @@ -397,7 +397,7 @@ macro_rules! declare_keywords {( } fn mk_fresh_ident_interner() -> IdentInterner { - interner::StrInterner::prefill(&[$($string,)*]) + Interner::prefill(&[$($string,)*]) } }} @@ -473,22 +473,25 @@ declare_keywords! { } // looks like we can get rid of this completely... -pub type IdentInterner = StrInterner; +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(&mut IdentInterner) -> T>(f: F) -> T { + thread_local!(static KEY: RefCell<IdentInterner> = { + RefCell::new(mk_fresh_ident_interner()) }); - KEY.with(|k| k.clone()) + KEY.with(|interner| f(&mut *interner.borrow_mut())) } /// 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 = mk_fresh_ident_interner()); +} + +pub fn clear_ident_interner() { + with_ident_interner(|interner| *interner = IdentInterner::new()); } /// Represents a string stored in the thread-local interner. Because the @@ -502,19 +505,19 @@ pub fn reset_ident_interner() { /// somehow. #[derive(Clone, PartialEq, Hash, PartialOrd, Eq, Ord)] pub struct InternedString { - string: RcStr, + string: Rc<String>, } impl InternedString { #[inline] pub fn new(string: &'static str) -> InternedString { InternedString { - string: RcStr::new(string), + string: Rc::new(string.to_owned()), } } #[inline] - fn new_from_rc_str(string: RcStr) -> InternedString { + fn new_from_rc_str(string: Rc<String>) -> InternedString { InternedString { string: string, } @@ -522,8 +525,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))) } } @@ -611,13 +613,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. @@ -636,8 +638,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. |
