1
Fork 0

Switch syntax attribute tracking to BitVector

This commit is contained in:
Mark Rousskov 2018-07-30 08:39:03 -06:00
parent 8c069ceba8
commit 1d64b241cd
3 changed files with 23 additions and 33 deletions

View file

@ -23,6 +23,7 @@ use ext::hygiene::{Mark, SyntaxContext};
use print::pprust; use print::pprust;
use ptr::P; use ptr::P;
use rustc_data_structures::indexed_vec; use rustc_data_structures::indexed_vec;
use rustc_data_structures::indexed_vec::Idx;
use symbol::{Symbol, keywords}; use symbol::{Symbol, keywords};
use tokenstream::{ThinTokenStream, TokenStream}; use tokenstream::{ThinTokenStream, TokenStream};
@ -1910,9 +1911,18 @@ pub enum AttrStyle {
Inner, Inner,
} }
#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug, Copy)] #[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug, PartialOrd, Ord, Copy)]
pub struct AttrId(pub usize); pub struct AttrId(pub usize);
impl Idx for AttrId {
fn new(idx: usize) -> Self {
AttrId(idx)
}
fn index(self) -> usize {
self.0
}
}
/// Meta-data associated with an item /// Meta-data associated with an item
/// Doc-comments are promoted to attributes that have is_sugared_doc = true /// Doc-comments are promoted to attributes that have is_sugared_doc = true
#[derive(Clone, RustcEncodable, RustcDecodable, Debug)] #[derive(Clone, RustcEncodable, RustcDecodable, Debug)]

View file

@ -41,51 +41,27 @@ use std::iter;
pub fn mark_used(attr: &Attribute) { pub fn mark_used(attr: &Attribute) {
debug!("Marking {:?} as used.", attr); debug!("Marking {:?} as used.", attr);
let AttrId(id) = attr.id;
GLOBALS.with(|globals| { GLOBALS.with(|globals| {
let mut slot = globals.used_attrs.lock(); globals.used_attrs.lock().insert(attr.id);
let idx = (id / 64) as usize;
let shift = id % 64;
if slot.len() <= idx {
slot.resize(idx + 1, 0);
}
slot[idx] |= 1 << shift;
}); });
} }
pub fn is_used(attr: &Attribute) -> bool { pub fn is_used(attr: &Attribute) -> bool {
let AttrId(id) = attr.id;
GLOBALS.with(|globals| { GLOBALS.with(|globals| {
let slot = globals.used_attrs.lock(); globals.used_attrs.lock().contains(attr.id)
let idx = (id / 64) as usize;
let shift = id % 64;
slot.get(idx).map(|bits| bits & (1 << shift) != 0)
.unwrap_or(false)
}) })
} }
pub fn mark_known(attr: &Attribute) { pub fn mark_known(attr: &Attribute) {
debug!("Marking {:?} as known.", attr); debug!("Marking {:?} as known.", attr);
let AttrId(id) = attr.id;
GLOBALS.with(|globals| { GLOBALS.with(|globals| {
let mut slot = globals.known_attrs.lock(); globals.known_attrs.lock().insert(attr.id);
let idx = (id / 64) as usize;
let shift = id % 64;
if slot.len() <= idx {
slot.resize(idx + 1, 0);
}
slot[idx] |= 1 << shift;
}); });
} }
pub fn is_known(attr: &Attribute) -> bool { pub fn is_known(attr: &Attribute) -> bool {
let AttrId(id) = attr.id;
GLOBALS.with(|globals| { GLOBALS.with(|globals| {
let slot = globals.known_attrs.lock(); globals.known_attrs.lock().contains(attr.id)
let idx = (id / 64) as usize;
let shift = id % 64;
slot.get(idx).map(|bits| bits & (1 << shift) != 0)
.unwrap_or(false)
}) })
} }

View file

@ -43,6 +43,8 @@ extern crate rustc_target;
extern crate serialize as rustc_serialize; // used by deriving extern crate serialize as rustc_serialize; // used by deriving
use rustc_data_structures::sync::Lock; use rustc_data_structures::sync::Lock;
use rustc_data_structures::bitvec::BitVector;
use ast::AttrId;
// A variant of 'try!' that panics on an Err. This is used as a crutch on the // A variant of 'try!' that panics on an Err. This is used as a crutch on the
// way towards a non-panic!-prone parser. It should be used for fatal parsing // way towards a non-panic!-prone parser. It should be used for fatal parsing
@ -75,16 +77,18 @@ macro_rules! unwrap_or {
} }
pub struct Globals { pub struct Globals {
used_attrs: Lock<Vec<u64>>, used_attrs: Lock<BitVector<AttrId>>,
known_attrs: Lock<Vec<u64>>, known_attrs: Lock<BitVector<AttrId>>,
syntax_pos_globals: syntax_pos::Globals, syntax_pos_globals: syntax_pos::Globals,
} }
impl Globals { impl Globals {
fn new() -> Globals { fn new() -> Globals {
Globals { Globals {
used_attrs: Lock::new(Vec::new()), // We have no idea how many attributes their will be, so just
known_attrs: Lock::new(Vec::new()), // initiate the vectors with 0 bits. We'll grow them as necessary.
used_attrs: Lock::new(BitVector::new(0)),
known_attrs: Lock::new(BitVector::new(0)),
syntax_pos_globals: syntax_pos::Globals::new(), syntax_pos_globals: syntax_pos::Globals::new(),
} }
} }