diff options
| author | Mark Rousskov <mark.simulacrum@gmail.com> | 2019-12-25 13:38:57 -0500 |
|---|---|---|
| committer | Mark Rousskov <mark.simulacrum@gmail.com> | 2019-12-25 14:10:46 -0500 |
| commit | b98633b94c5354fbcb02bd0111f2aba5155c3190 (patch) | |
| tree | ebfb6e277e20318795617fbd27f514aa708bc84e /src/libsyntax_pos | |
| parent | ed33453a37d602f34cc40c205f9b9b8a8aff88b5 (diff) | |
| download | rust-b98633b94c5354fbcb02bd0111f2aba5155c3190.tar.gz rust-b98633b94c5354fbcb02bd0111f2aba5155c3190.zip | |
Store callbacks in global statics
The callbacks have precisely two states: the default, and the one present throughout almost all of the rustc run (the filled in value which has access to TyCtxt). We used to store this as a thread local, and reset it on each thread to the non-default value. But this is somewhat wasteful, since there is no reason to set it globally -- while the callbacks themselves access TLS, they do not do so in a manner that fails in when we do not have TLS to work with.
Diffstat (limited to 'src/libsyntax_pos')
| -rw-r--r-- | src/libsyntax_pos/lib.rs | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/libsyntax_pos/lib.rs b/src/libsyntax_pos/lib.rs index 4af552c6561..a58c12f2350 100644 --- a/src/libsyntax_pos/lib.rs +++ b/src/libsyntax_pos/lib.rs @@ -13,6 +13,7 @@ #![feature(specialization)] #![feature(step_trait)] +use rustc_data_structures::AtomicRef; use rustc_macros::HashStable_Generic; use rustc_serialize::{Decodable, Decoder, Encodable, Encoder}; @@ -41,7 +42,7 @@ use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; use rustc_data_structures::sync::{Lock, Lrc}; use std::borrow::Cow; -use std::cell::{Cell, RefCell}; +use std::cell::RefCell; use std::cmp::{self, Ordering}; use std::fmt; use std::hash::{Hash, Hasher}; @@ -665,13 +666,13 @@ pub fn default_span_debug(span: Span, f: &mut fmt::Formatter<'_>) -> fmt::Result impl fmt::Debug for Span { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - SPAN_DEBUG.with(|span_debug| span_debug.get()(*self, f)) + (*SPAN_DEBUG)(*self, f) } } impl fmt::Debug for SpanData { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - SPAN_DEBUG.with(|span_debug| span_debug.get()(Span::new(self.lo, self.hi, self.ctxt), f)) + (*SPAN_DEBUG)(Span::new(self.lo, self.hi, self.ctxt), f) } } @@ -1503,8 +1504,8 @@ pub struct FileLines { pub lines: Vec<LineInfo>, } -thread_local!(pub static SPAN_DEBUG: Cell<fn(Span, &mut fmt::Formatter<'_>) -> fmt::Result> = - Cell::new(default_span_debug)); +pub static SPAN_DEBUG: AtomicRef<fn(Span, &mut fmt::Formatter<'_>) -> fmt::Result> = + AtomicRef::new(&(default_span_debug as fn(_, &mut fmt::Formatter<'_>) -> _)); #[derive(Debug)] pub struct MacroBacktrace { |
