@@ -25,9 +25,8 @@ use syntax_pos::{self, Span, FileName};
25
25
use tokenstream:: { TokenStream , TokenTree } ;
26
26
use tokenstream;
27
27
28
- use std:: cell:: Cell ;
29
28
use std:: { cmp, fmt} ;
30
- use rustc_data_structures:: sync:: Lrc ;
29
+ use rustc_data_structures:: sync:: { Lrc , Lock } ;
31
30
32
31
#[ derive( Clone , RustcEncodable , RustcDecodable , PartialEq , Eq , Hash , Debug , Copy ) ]
33
32
pub enum BinOpToken {
@@ -614,15 +613,8 @@ pub fn is_op(tok: &Token) -> bool {
614
613
}
615
614
}
616
615
617
- pub struct LazyTokenStream ( Cell < Option < TokenStream > > ) ;
618
-
619
- impl Clone for LazyTokenStream {
620
- fn clone ( & self ) -> Self {
621
- let opt_stream = self . 0 . take ( ) ;
622
- self . 0 . set ( opt_stream. clone ( ) ) ;
623
- LazyTokenStream ( Cell :: new ( opt_stream) )
624
- }
625
- }
616
+ #[ derive( Clone ) ]
617
+ pub struct LazyTokenStream ( Lock < Option < TokenStream > > ) ;
626
618
627
619
impl cmp:: Eq for LazyTokenStream { }
628
620
impl PartialEq for LazyTokenStream {
@@ -639,15 +631,14 @@ impl fmt::Debug for LazyTokenStream {
639
631
640
632
impl LazyTokenStream {
641
633
pub fn new ( ) -> Self {
642
- LazyTokenStream ( Cell :: new ( None ) )
634
+ LazyTokenStream ( Lock :: new ( None ) )
643
635
}
644
636
645
637
pub fn force < F : FnOnce ( ) -> TokenStream > ( & self , f : F ) -> TokenStream {
646
- let mut opt_stream = self . 0 . take ( ) ;
638
+ let mut opt_stream = self . 0 . lock ( ) ;
647
639
if opt_stream. is_none ( ) {
648
- opt_stream = Some ( f ( ) ) ;
640
+ * opt_stream = Some ( f ( ) ) ;
649
641
}
650
- self . 0 . set ( opt_stream. clone ( ) ) ;
651
642
opt_stream. clone ( ) . unwrap ( )
652
643
}
653
644
}
0 commit comments