mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
Remove a lock in favor of an AppendOnlyVec
This commit is contained in:
parent
daee746771
commit
4699632637
@ -2,6 +2,7 @@ use std::marker::PhantomData;
|
|||||||
|
|
||||||
use rustc_index::vec::Idx;
|
use rustc_index::vec::Idx;
|
||||||
|
|
||||||
|
#[derive(Default)]
|
||||||
pub struct AppendOnlyIndexVec<I: Idx, T: Copy> {
|
pub struct AppendOnlyIndexVec<I: Idx, T: Copy> {
|
||||||
#[cfg(not(parallel_compiler))]
|
#[cfg(not(parallel_compiler))]
|
||||||
vec: elsa::vec::FrozenVec<T>,
|
vec: elsa::vec::FrozenVec<T>,
|
||||||
@ -40,6 +41,7 @@ impl<I: Idx, T: Copy> AppendOnlyIndexVec<I, T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Default)]
|
||||||
pub struct AppendOnlyVec<T: Copy> {
|
pub struct AppendOnlyVec<T: Copy> {
|
||||||
#[cfg(not(parallel_compiler))]
|
#[cfg(not(parallel_compiler))]
|
||||||
vec: elsa::vec::FrozenVec<T>,
|
vec: elsa::vec::FrozenVec<T>,
|
||||||
@ -57,11 +59,14 @@ impl<T: Copy> AppendOnlyVec<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn push(&self, val: T) {
|
pub fn push(&self, val: T) -> usize {
|
||||||
|
#[cfg(not(parallel_compiler))]
|
||||||
|
let i = self.vec.len();
|
||||||
#[cfg(not(parallel_compiler))]
|
#[cfg(not(parallel_compiler))]
|
||||||
self.vec.push(val);
|
self.vec.push(val);
|
||||||
#[cfg(parallel_compiler)]
|
#[cfg(parallel_compiler)]
|
||||||
self.vec.push(val)
|
let i = self.vec.push(val);
|
||||||
|
i
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get(&self, i: usize) -> Option<T> {
|
pub fn get(&self, i: usize) -> Option<T> {
|
||||||
|
@ -1712,8 +1712,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||||||
let stability = tcx.lookup_stability(CRATE_DEF_ID);
|
let stability = tcx.lookup_stability(CRATE_DEF_ID);
|
||||||
let macros =
|
let macros =
|
||||||
self.lazy_array(tcx.resolutions(()).proc_macros.iter().map(|p| p.local_def_index));
|
self.lazy_array(tcx.resolutions(()).proc_macros.iter().map(|p| p.local_def_index));
|
||||||
let spans = self.tcx.sess.parse_sess.proc_macro_quoted_spans();
|
for (i, span) in self.tcx.sess.parse_sess.proc_macro_quoted_spans() {
|
||||||
for (i, span) in spans.into_iter().enumerate() {
|
|
||||||
let span = self.lazy(span);
|
let span = self.lazy(span);
|
||||||
self.tables.proc_macro_quoted_spans.set_some(i, span);
|
self.tables.proc_macro_quoted_spans.set_some(i, span);
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@ use crate::lint::{
|
|||||||
};
|
};
|
||||||
use rustc_ast::node_id::NodeId;
|
use rustc_ast::node_id::NodeId;
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexSet};
|
use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexSet};
|
||||||
use rustc_data_structures::sync::{AtomicBool, Lock, Lrc};
|
use rustc_data_structures::sync::{AppendOnlyVec, AtomicBool, Lock, Lrc};
|
||||||
use rustc_errors::{emitter::SilentEmitter, ColorConfig, Handler};
|
use rustc_errors::{emitter::SilentEmitter, ColorConfig, Handler};
|
||||||
use rustc_errors::{
|
use rustc_errors::{
|
||||||
fallback_fluent_bundle, Diagnostic, DiagnosticBuilder, DiagnosticId, DiagnosticMessage,
|
fallback_fluent_bundle, Diagnostic, DiagnosticBuilder, DiagnosticId, DiagnosticMessage,
|
||||||
@ -219,7 +219,7 @@ pub struct ParseSess {
|
|||||||
pub assume_incomplete_release: bool,
|
pub assume_incomplete_release: bool,
|
||||||
/// Spans passed to `proc_macro::quote_span`. Each span has a numerical
|
/// Spans passed to `proc_macro::quote_span`. Each span has a numerical
|
||||||
/// identifier represented by its position in the vector.
|
/// identifier represented by its position in the vector.
|
||||||
pub proc_macro_quoted_spans: Lock<Vec<Span>>,
|
pub proc_macro_quoted_spans: AppendOnlyVec<Span>,
|
||||||
/// Used to generate new `AttrId`s. Every `AttrId` is unique.
|
/// Used to generate new `AttrId`s. Every `AttrId` is unique.
|
||||||
pub attr_id_generator: AttrIdGenerator,
|
pub attr_id_generator: AttrIdGenerator,
|
||||||
}
|
}
|
||||||
@ -324,13 +324,16 @@ impl ParseSess {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn save_proc_macro_span(&self, span: Span) -> usize {
|
pub fn save_proc_macro_span(&self, span: Span) -> usize {
|
||||||
let mut spans = self.proc_macro_quoted_spans.lock();
|
self.proc_macro_quoted_spans.push(span)
|
||||||
spans.push(span);
|
|
||||||
return spans.len() - 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn proc_macro_quoted_spans(&self) -> Vec<Span> {
|
pub fn proc_macro_quoted_spans(&self) -> impl Iterator<Item = (usize, Span)> + '_ {
|
||||||
self.proc_macro_quoted_spans.lock().clone()
|
// This is equivalent to `.iter().copied().enumerate()`, but that isn't possible for
|
||||||
|
// AppendOnlyVec, so we resort to this scheme.
|
||||||
|
(0..)
|
||||||
|
.map(|i| (i, self.proc_macro_quoted_spans.get(i)))
|
||||||
|
.take_while(|(_, o)| o.is_some())
|
||||||
|
.filter_map(|(i, o)| Some((i, o?)))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
|
Loading…
Reference in New Issue
Block a user