@@ -477,17 +477,20 @@ pub type IdentInterner = Interner;
477477// if an interner exists in TLS, return it. Otherwise, prepare a
478478// fresh one.
479479// FIXME(eddyb) #8726 This should probably use a thread-local reference.
480- pub fn get_ident_interner ( ) -> Rc < IdentInterner > {
481- thread_local ! ( static KEY : Rc < :: parse :: token :: IdentInterner > = {
482- Rc :: new ( mk_fresh_ident_interner( ) )
480+ pub fn with_ident_interner < T , F : FnOnce ( & IdentInterner ) -> T > ( f : F ) -> T {
481+ thread_local ! ( static KEY : IdentInterner = {
482+ mk_fresh_ident_interner( )
483483 } ) ;
484- KEY . with ( |k| k . clone ( ) )
484+ KEY . with ( f )
485485}
486486
487487/// Reset the ident interner to its initial state.
488488pub fn reset_ident_interner ( ) {
489- let interner = get_ident_interner ( ) ;
490- interner. reset ( mk_fresh_ident_interner ( ) ) ;
489+ with_ident_interner ( |interner| interner. reset ( mk_fresh_ident_interner ( ) ) ) ;
490+ }
491+
492+ pub fn clear_ident_interner ( ) {
493+ with_ident_interner ( |interner| interner. clear ( ) ) ;
491494}
492495
493496/// Represents a string stored in the thread-local interner. Because the
@@ -521,8 +524,7 @@ impl InternedString {
521524
522525 #[ inline]
523526 pub fn new_from_name ( name : ast:: Name ) -> InternedString {
524- let interner = get_ident_interner ( ) ;
525- InternedString :: new_from_rc_str ( interner. get ( name) )
527+ with_ident_interner ( |interner| InternedString :: new_from_rc_str ( interner. get ( name) ) )
526528 }
527529}
528530
@@ -610,13 +612,13 @@ pub fn intern_and_get_ident(s: &str) -> InternedString {
610612/// Maps a string to its interned representation.
611613#[ inline]
612614pub fn intern ( s : & str ) -> ast:: Name {
613- get_ident_interner ( ) . intern ( s)
615+ with_ident_interner ( |interner| interner . intern ( s) )
614616}
615617
616618/// gensym's a new usize, using the current interner.
617619#[ inline]
618620pub fn gensym ( s : & str ) -> ast:: Name {
619- get_ident_interner ( ) . gensym ( s)
621+ with_ident_interner ( |interner| interner . gensym ( s) )
620622}
621623
622624/// Maps a string to an identifier with an empty syntax context.
@@ -635,8 +637,7 @@ pub fn gensym_ident(s: &str) -> ast::Ident {
635637// note that this guarantees that str_ptr_eq(ident_to_string(src),interner_get(fresh_name(src)));
636638// that is, that the new name and the old one are connected to ptr_eq strings.
637639pub fn fresh_name ( src : ast:: Ident ) -> ast:: Name {
638- let interner = get_ident_interner ( ) ;
639- interner. gensym_copy ( src. name )
640+ with_ident_interner ( |interner| interner. gensym_copy ( src. name ) )
640641 // following: debug version. Could work in final except that it's incompatible with
641642 // good error messages and uses of struct names in ambiguous could-be-binding
642643 // locations. Also definitely destroys the guarantee given above about ptr_eq.
0 commit comments