From 752d4419a060e007548cf56f85ff864a13589567 Mon Sep 17 00:00:00 2001 From: Jeffrey Seyfried Date: Mon, 11 Jul 2016 19:33:40 +0000 Subject: [PATCH] Refactor `get_ident_interner` -> `with_ident_interner`. --- src/librustc_driver/driver.rs | 4 ++-- src/librustc_metadata/decoder.rs | 4 ++-- src/librustc_trans/trans_item.rs | 5 ++--- src/libsyntax/parse/token.rs | 25 +++++++++++++------------ 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/librustc_driver/driver.rs b/src/librustc_driver/driver.rs index eef2b6e6f37b..ba59c2afc769 100644 --- a/src/librustc_driver/driver.rs +++ b/src/librustc_driver/driver.rs @@ -211,7 +211,7 @@ pub fn compile_input(sess: &Session, } // Discard interned strings as they are no longer required. - token::get_ident_interner().clear(); + token::clear_ident_interner(); Ok((outputs, trans)) })?? @@ -480,7 +480,7 @@ pub fn phase_1_parse_input<'a>(sess: &'a Session, input: &Input) -> PResult<'a, ast::Crate> { // These may be left in an incoherent state after a previous compile. - // `clear_tables` and `get_ident_interner().clear()` can be used to free + // `clear_tables` and `clear_ident_interner` can be used to free // memory, but they do not restore the initial state. syntax::ext::mtwt::reset_tables(); token::reset_ident_interner(); diff --git a/src/librustc_metadata/decoder.rs b/src/librustc_metadata/decoder.rs index 762f3609ac59..3f5c9a6d3bd8 100644 --- a/src/librustc_metadata/decoder.rs +++ b/src/librustc_metadata/decoder.rs @@ -442,7 +442,7 @@ pub fn get_adt_def<'a, 'tcx>(cdata: Cmd, struct_field_family_to_visibility(ff)) }).chain(reader::tagged_docs(doc, tag_item_unnamed_field).map(|f| { let ff = item_family(f); - let name = token::get_ident_interner().intern(index.to_string()); + let name = token::with_ident_interner(|interner| interner.intern(index.to_string())); index += 1; ty::FieldDefData::new(item_def_id(f, cdata), name, struct_field_family_to_visibility(ff)) @@ -1147,7 +1147,7 @@ pub fn get_struct_field_names(cdata: Cmd, id: DefIndex) -> Vec { reader::tagged_docs(item, tag_item_field).map(|an_item| { item_name(an_item) }).chain(reader::tagged_docs(item, tag_item_unnamed_field).map(|_| { - let name = token::get_ident_interner().intern(index.to_string()); + let name = token::with_ident_interner(|interner| interner.intern(index.to_string())); index += 1; name })).collect() diff --git a/src/librustc_trans/trans_item.rs b/src/librustc_trans/trans_item.rs index b7b18b2631be..4729a9adcec6 100644 --- a/src/librustc_trans/trans_item.rs +++ b/src/librustc_trans/trans_item.rs @@ -31,7 +31,6 @@ use rustc::ty::subst; use std::hash::{Hash, Hasher}; use syntax::ast::{self, NodeId}; use syntax::{attr,errors}; -use syntax::parse::token; use type_of; use glue; use abi::{Abi, FnType}; @@ -562,8 +561,8 @@ fn push_type_params<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, for projection in projections { let projection = projection.skip_binder(); - let name = token::get_ident_interner().get(projection.projection_ty.item_name); - output.push_str(&name[..]); + let name = &projection.projection_ty.item_name.as_str(); + output.push_str(name); output.push_str("="); push_unique_type_name(tcx, projection.ty, output); output.push_str(", "); diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs index 222cf65b78ee..c39081182847 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 { - thread_local!(static KEY: Rc<::parse::token::IdentInterner> = { - Rc::new(mk_fresh_ident_interner()) +pub fn with_ident_interner 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.