1
Fork 0

Use FxHash{Map,Set} instead of the default Hash{Map,Set} everywhere in rustc.

This commit is contained in:
Eduard-Mihai Burtescu 2018-08-18 13:55:43 +03:00
parent 83ddc33347
commit 93f3f5b155
34 changed files with 156 additions and 152 deletions

View file

@ -50,6 +50,7 @@ use hir::GenericArg;
use lint::builtin::{self, PARENTHESIZED_PARAMS_IN_TYPES_AND_MODULES, use lint::builtin::{self, PARENTHESIZED_PARAMS_IN_TYPES_AND_MODULES,
ELIDED_LIFETIMES_IN_PATHS}; ELIDED_LIFETIMES_IN_PATHS};
use middle::cstore::CrateStore; use middle::cstore::CrateStore;
use rustc_data_structures::fx::FxHashSet;
use rustc_data_structures::indexed_vec::IndexVec; use rustc_data_structures::indexed_vec::IndexVec;
use rustc_data_structures::small_vec::OneVector; use rustc_data_structures::small_vec::OneVector;
use rustc_data_structures::thin_vec::ThinVec; use rustc_data_structures::thin_vec::ThinVec;
@ -57,7 +58,7 @@ use session::Session;
use util::common::FN_OUTPUT_NAME; use util::common::FN_OUTPUT_NAME;
use util::nodemap::{DefIdMap, NodeMap}; use util::nodemap::{DefIdMap, NodeMap};
use std::collections::{BTreeMap, HashSet}; use std::collections::BTreeMap;
use std::fmt::Debug; use std::fmt::Debug;
use std::iter; use std::iter;
use std::mem; use std::mem;
@ -1342,7 +1343,7 @@ impl<'a> LoweringContext<'a> {
exist_ty_id: NodeId, exist_ty_id: NodeId,
collect_elided_lifetimes: bool, collect_elided_lifetimes: bool,
currently_bound_lifetimes: Vec<hir::LifetimeName>, currently_bound_lifetimes: Vec<hir::LifetimeName>,
already_defined_lifetimes: HashSet<hir::LifetimeName>, already_defined_lifetimes: FxHashSet<hir::LifetimeName>,
output_lifetimes: Vec<hir::GenericArg>, output_lifetimes: Vec<hir::GenericArg>,
output_lifetime_params: Vec<hir::GenericParam>, output_lifetime_params: Vec<hir::GenericParam>,
} }
@ -1476,7 +1477,7 @@ impl<'a> LoweringContext<'a> {
exist_ty_id, exist_ty_id,
collect_elided_lifetimes: true, collect_elided_lifetimes: true,
currently_bound_lifetimes: Vec::new(), currently_bound_lifetimes: Vec::new(),
already_defined_lifetimes: HashSet::new(), already_defined_lifetimes: FxHashSet::default(),
output_lifetimes: Vec::new(), output_lifetimes: Vec::new(),
output_lifetime_params: Vec::new(), output_lifetime_params: Vec::new(),
}; };

View file

@ -13,6 +13,7 @@
use session::config; use session::config;
use middle::lang_items; use middle::lang_items;
use rustc_data_structures::fx::FxHashSet;
use rustc_target::spec::PanicStrategy; use rustc_target::spec::PanicStrategy;
use syntax::ast; use syntax::ast;
use syntax::symbol::Symbol; use syntax::symbol::Symbol;
@ -23,8 +24,6 @@ use hir::intravisit;
use hir; use hir;
use ty::TyCtxt; use ty::TyCtxt;
use std::collections::HashSet;
macro_rules! weak_lang_items { macro_rules! weak_lang_items {
($($name:ident, $item:ident, $sym:ident;)*) => ( ($($name:ident, $item:ident, $sym:ident;)*) => (
@ -101,7 +100,7 @@ fn verify<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
return return
} }
let mut missing = HashSet::new(); let mut missing = FxHashSet::default();
for &cnum in tcx.crates().iter() { for &cnum in tcx.crates().iter() {
for &item in tcx.missing_lang_items(cnum).iter() { for &item in tcx.missing_lang_items(cnum).iter() {
missing.insert(item); missing.insert(item);

View file

@ -37,10 +37,10 @@ use std::collections::btree_map::Iter as BTreeMapIter;
use std::collections::btree_map::Keys as BTreeMapKeysIter; use std::collections::btree_map::Keys as BTreeMapKeysIter;
use std::collections::btree_map::Values as BTreeMapValuesIter; use std::collections::btree_map::Values as BTreeMapValuesIter;
use rustc_data_structures::fx::FxHashSet;
use std::{fmt, str}; use std::{fmt, str};
use std::hash::Hasher; use std::hash::Hasher;
use std::collections::hash_map::DefaultHasher; use std::collections::hash_map::DefaultHasher;
use std::collections::HashSet;
use std::iter::FromIterator; use std::iter::FromIterator;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
@ -1373,7 +1373,7 @@ pub fn default_configuration(sess: &Session) -> ast::CrateConfig {
let max_atomic_width = sess.target.target.max_atomic_width(); let max_atomic_width = sess.target.target.max_atomic_width();
let atomic_cas = sess.target.target.options.atomic_cas; let atomic_cas = sess.target.target.options.atomic_cas;
let mut ret = HashSet::new(); let mut ret = FxHashSet::default();
// Target bindings. // Target bindings.
ret.insert((Symbol::intern("target_os"), Some(Symbol::intern(os)))); ret.insert((Symbol::intern("target_os"), Some(Symbol::intern(os))));
if let Some(ref fam) = sess.target.target.options.target_family { if let Some(ref fam) = sess.target.target.options.target_family {

View file

@ -12,8 +12,8 @@
pub use self::FileMatch::*; pub use self::FileMatch::*;
use rustc_data_structures::fx::FxHashSet;
use std::borrow::Cow; use std::borrow::Cow;
use std::collections::HashSet;
use std::env; use std::env;
use std::fs; use std::fs;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
@ -40,7 +40,7 @@ impl<'a> FileSearch<'a> {
pub fn for_each_lib_search_path<F>(&self, mut f: F) where pub fn for_each_lib_search_path<F>(&self, mut f: F) where
F: FnMut(&Path, PathKind) F: FnMut(&Path, PathKind)
{ {
let mut visited_dirs = HashSet::new(); let mut visited_dirs = FxHashSet::default();
for (path, kind) in self.search_paths.iter(self.kind) { for (path, kind) in self.search_paths.iter(self.kind) {
f(path, kind); f(path, kind);

View file

@ -47,7 +47,6 @@ use jobserver::Client;
use std; use std;
use std::cell::{self, Cell, RefCell}; use std::cell::{self, Cell, RefCell};
use std::collections::HashMap;
use std::env; use std::env;
use std::fmt; use std::fmt;
use std::io::Write; use std::io::Write;
@ -122,7 +121,7 @@ pub struct Session {
/// Map from imported macro spans (which consist of /// Map from imported macro spans (which consist of
/// the localized span for the macro body) to the /// the localized span for the macro body) to the
/// macro name and definition span in the source crate. /// macro name and definition span in the source crate.
pub imported_macro_spans: OneThread<RefCell<HashMap<Span, (String, Span)>>>, pub imported_macro_spans: OneThread<RefCell<FxHashMap<Span, (String, Span)>>>,
incr_comp_session: OneThread<RefCell<IncrCompSession>>, incr_comp_session: OneThread<RefCell<IncrCompSession>>,
@ -1129,7 +1128,7 @@ pub fn build_session_(
injected_allocator: Once::new(), injected_allocator: Once::new(),
allocator_kind: Once::new(), allocator_kind: Once::new(),
injected_panic_runtime: Once::new(), injected_panic_runtime: Once::new(),
imported_macro_spans: OneThread::new(RefCell::new(HashMap::new())), imported_macro_spans: OneThread::new(RefCell::new(FxHashMap::default())),
incr_comp_session: OneThread::new(RefCell::new(IncrCompSession::NotInitialized)), incr_comp_session: OneThread::new(RefCell::new(IncrCompSession::NotInitialized)),
self_profiling: Lock::new(SelfProfiler::new()), self_profiling: Lock::new(SelfProfiler::new()),
profile_channel: Lock::new(None), profile_channel: Lock::new(None),

View file

@ -11,6 +11,7 @@
#![allow(warnings)] #![allow(warnings)]
use std::mem; use std::mem;
use rustc_data_structures::fx::FxHashSet;
use rustc_data_structures::sync::{Lock, LockGuard, Lrc, Weak}; use rustc_data_structures::sync::{Lock, LockGuard, Lrc, Weak};
use rustc_data_structures::OnDrop; use rustc_data_structures::OnDrop;
use syntax_pos::Span; use syntax_pos::Span;
@ -21,7 +22,7 @@ use ty::context::TyCtxt;
use errors::Diagnostic; use errors::Diagnostic;
use std::process; use std::process;
use std::{fmt, ptr}; use std::{fmt, ptr};
use std::collections::HashSet;
#[cfg(parallel_queries)] #[cfg(parallel_queries)]
use { use {
rayon_core, rayon_core,
@ -282,7 +283,7 @@ where
fn cycle_check<'tcx>(query: Lrc<QueryJob<'tcx>>, fn cycle_check<'tcx>(query: Lrc<QueryJob<'tcx>>,
span: Span, span: Span,
stack: &mut Vec<(Span, Lrc<QueryJob<'tcx>>)>, stack: &mut Vec<(Span, Lrc<QueryJob<'tcx>>)>,
visited: &mut HashSet<*const QueryJob<'tcx>> visited: &mut FxHashSet<*const QueryJob<'tcx>>
) -> Option<Option<Waiter<'tcx>>> { ) -> Option<Option<Waiter<'tcx>>> {
if visited.contains(&query.as_ptr()) { if visited.contains(&query.as_ptr()) {
return if let Some(p) = stack.iter().position(|q| q.1.as_ptr() == query.as_ptr()) { return if let Some(p) = stack.iter().position(|q| q.1.as_ptr() == query.as_ptr()) {
@ -321,7 +322,7 @@ fn cycle_check<'tcx>(query: Lrc<QueryJob<'tcx>>,
#[cfg(parallel_queries)] #[cfg(parallel_queries)]
fn connected_to_root<'tcx>( fn connected_to_root<'tcx>(
query: Lrc<QueryJob<'tcx>>, query: Lrc<QueryJob<'tcx>>,
visited: &mut HashSet<*const QueryJob<'tcx>> visited: &mut FxHashSet<*const QueryJob<'tcx>>
) -> bool { ) -> bool {
// We already visited this or we're deliberately ignoring it // We already visited this or we're deliberately ignoring it
if visited.contains(&query.as_ptr()) { if visited.contains(&query.as_ptr()) {
@ -357,7 +358,7 @@ fn remove_cycle<'tcx>(
wakelist: &mut Vec<Lrc<QueryWaiter<'tcx>>>, wakelist: &mut Vec<Lrc<QueryWaiter<'tcx>>>,
tcx: TyCtxt<'_, 'tcx, '_> tcx: TyCtxt<'_, 'tcx, '_>
) -> bool { ) -> bool {
let mut visited = HashSet::new(); let mut visited = FxHashSet::default();
let mut stack = Vec::new(); let mut stack = Vec::new();
// Look for a cycle starting with the last query in `jobs` // Look for a cycle starting with the last query in `jobs`
if let Some(waiter) = cycle_check(jobs.pop().unwrap(), if let Some(waiter) = cycle_check(jobs.pop().unwrap(),
@ -389,7 +390,7 @@ fn remove_cycle<'tcx>(
// connected to queries outside the cycle // connected to queries outside the cycle
let entry_points: Vec<Lrc<QueryJob<'tcx>>> = stack.iter().filter_map(|query| { let entry_points: Vec<Lrc<QueryJob<'tcx>>> = stack.iter().filter_map(|query| {
// Mark all the other queries in the cycle as already visited // Mark all the other queries in the cycle as already visited
let mut visited = HashSet::from_iter(stack.iter().filter_map(|q| { let mut visited = FxHashSet::from_iter(stack.iter().filter_map(|q| {
if q.1.as_ptr() != query.1.as_ptr() { if q.1.as_ptr() != query.1.as_ptr() {
Some(q.1.as_ptr()) Some(q.1.as_ptr())
} else { } else {

View file

@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
use std::collections::HashMap; use rustc_data_structures::fx::FxHashMap;
use std::fs::File; use std::fs::File;
use std::io::prelude::*; use std::io::prelude::*;
use std::marker::PhantomData; use std::marker::PhantomData;
@ -40,7 +40,7 @@ struct PerThread {
#[derive(Clone)] #[derive(Clone)]
pub struct TimeGraph { pub struct TimeGraph {
data: Arc<Mutex<HashMap<TimelineId, PerThread>>>, data: Arc<Mutex<FxHashMap<TimelineId, PerThread>>>,
} }
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
@ -68,7 +68,7 @@ impl Drop for RaiiToken {
impl TimeGraph { impl TimeGraph {
pub fn new() -> TimeGraph { pub fn new() -> TimeGraph {
TimeGraph { TimeGraph {
data: Arc::new(Mutex::new(HashMap::new())) data: Arc::new(Mutex::new(FxHashMap::default()))
} }
} }

View file

@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
use std::collections::HashMap; use rustc_data_structures::fx::FxHashMap;
use std::ffi::{OsStr, OsString}; use std::ffi::{OsStr, OsString};
use std::fs::{self, File}; use std::fs::{self, File};
use std::io::prelude::*; use std::io::prelude::*;
@ -30,7 +30,7 @@ use serialize::{json, Encoder};
/// For all the linkers we support, and information they might /// For all the linkers we support, and information they might
/// need out of the shared crate context before we get rid of it. /// need out of the shared crate context before we get rid of it.
pub struct LinkerInfo { pub struct LinkerInfo {
exports: HashMap<CrateType, Vec<String>>, exports: FxHashMap<CrateType, Vec<String>>,
} }
impl LinkerInfo { impl LinkerInfo {

View file

@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
use std::collections::HashSet; use rustc_data_structures::fx::FxHashSet;
use std::env; use std::env;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::fs; use std::fs;
@ -172,7 +172,7 @@ fn get_install_prefix_rpath(config: &mut RPathConfig) -> String {
} }
fn minimize_rpaths(rpaths: &[String]) -> Vec<String> { fn minimize_rpaths(rpaths: &[String]) -> Vec<String> {
let mut set = HashSet::new(); let mut set = FxHashSet::default();
let mut minimized = Vec::new(); let mut minimized = Vec::new();
for rpath in rpaths { for rpath in rpaths {
if set.insert(rpath) { if set.insert(rpath) {

View file

@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
use std::collections::HashMap; use fx::FxHashMap;
use std::cmp::max; use std::cmp::max;
use std::slice; use std::slice;
use std::iter; use std::iter;
@ -18,8 +18,8 @@ use super::*;
pub struct TestGraph { pub struct TestGraph {
num_nodes: usize, num_nodes: usize,
start_node: usize, start_node: usize,
successors: HashMap<usize, Vec<usize>>, successors: FxHashMap<usize, Vec<usize>>,
predecessors: HashMap<usize, Vec<usize>>, predecessors: FxHashMap<usize, Vec<usize>>,
} }
impl TestGraph { impl TestGraph {
@ -27,8 +27,8 @@ impl TestGraph {
let mut graph = TestGraph { let mut graph = TestGraph {
num_nodes: start_node + 1, num_nodes: start_node + 1,
start_node, start_node,
successors: HashMap::new(), successors: FxHashMap::default(),
predecessors: HashMap::new(), predecessors: FxHashMap::default(),
}; };
for &(source, target) in edges { for &(source, target) in edges {
graph.num_nodes = max(graph.num_nodes, source + 1); graph.num_nodes = max(graph.num_nodes, source + 1);

View file

@ -10,10 +10,10 @@
use super::*; use super::*;
use syntax_pos::SpanData; use syntax_pos::SpanData;
use rustc_data_structures::fx::FxHashMap;
use rustc::util::common::QueryMsg; use rustc::util::common::QueryMsg;
use std::fs::File; use std::fs::File;
use std::time::{Duration, Instant}; use std::time::{Duration, Instant};
use std::collections::hash_map::HashMap;
use rustc::dep_graph::{DepNode}; use rustc::dep_graph::{DepNode};
#[derive(Debug, Clone, Eq, PartialEq)] #[derive(Debug, Clone, Eq, PartialEq)]
@ -149,7 +149,7 @@ fn write_traces_rec(file: &mut File, traces: &[Rec], total: Duration, depth: usi
} }
} }
fn compute_counts_rec(counts: &mut HashMap<String,QueryMetric>, traces: &[Rec]) { fn compute_counts_rec(counts: &mut FxHashMap<String,QueryMetric>, traces: &[Rec]) {
for t in traces.iter() { for t in traces.iter() {
match t.effect { match t.effect {
Effect::TimeBegin(ref msg) => { Effect::TimeBegin(ref msg) => {
@ -200,7 +200,7 @@ fn compute_counts_rec(counts: &mut HashMap<String,QueryMetric>, traces: &[Rec])
} }
} }
pub fn write_counts(count_file: &mut File, counts: &mut HashMap<String,QueryMetric>) { pub fn write_counts(count_file: &mut File, counts: &mut FxHashMap<String,QueryMetric>) {
use rustc::util::common::duration_to_secs_str; use rustc::util::common::duration_to_secs_str;
use std::cmp::Reverse; use std::cmp::Reverse;
@ -219,7 +219,7 @@ pub fn write_counts(count_file: &mut File, counts: &mut HashMap<String,QueryMetr
pub fn write_traces(html_file: &mut File, counts_file: &mut File, traces: &[Rec]) { pub fn write_traces(html_file: &mut File, counts_file: &mut File, traces: &[Rec]) {
let capacity = traces.iter().fold(0, |acc, t| acc + 1 + t.extent.len()); let capacity = traces.iter().fold(0, |acc, t| acc + 1 + t.extent.len());
let mut counts : HashMap<String, QueryMetric> = HashMap::with_capacity(capacity); let mut counts = FxHashMap::with_capacity_and_hasher(capacity, Default::default());
compute_counts_rec(&mut counts, traces); compute_counts_rec(&mut counts, traces);
write_counts(counts_file, &mut counts); write_counts(counts_file, &mut counts);

View file

@ -16,12 +16,12 @@ use {Level, CodeSuggestion, DiagnosticBuilder, SubDiagnostic, SourceMapperDyn, D
use snippet::{Annotation, AnnotationType, Line, MultilineAnnotation, StyledString, Style}; use snippet::{Annotation, AnnotationType, Line, MultilineAnnotation, StyledString, Style};
use styled_buffer::StyledBuffer; use styled_buffer::StyledBuffer;
use rustc_data_structures::fx::FxHashMap;
use rustc_data_structures::sync::Lrc; use rustc_data_structures::sync::Lrc;
use atty; use atty;
use std::borrow::Cow; use std::borrow::Cow;
use std::io::prelude::*; use std::io::prelude::*;
use std::io; use std::io;
use std::collections::HashMap;
use std::cmp::{min, Reverse}; use std::cmp::{min, Reverse};
use termcolor::{StandardStream, ColorChoice, ColorSpec, BufferWriter}; use termcolor::{StandardStream, ColorChoice, ColorSpec, BufferWriter};
use termcolor::{WriteColor, Color, Buffer}; use termcolor::{WriteColor, Color, Buffer};
@ -1090,7 +1090,7 @@ impl EmitterWriter {
max_line_num_len + 1); max_line_num_len + 1);
// Contains the vertical lines' positions for active multiline annotations // Contains the vertical lines' positions for active multiline annotations
let mut multilines = HashMap::new(); let mut multilines = FxHashMap::default();
// Next, output the annotate source for this file // Next, output the annotate source for this file
for line_idx in 0..annotated_file.lines.len() { for line_idx in 0..annotated_file.lines.len() {
@ -1109,7 +1109,7 @@ impl EmitterWriter {
width_offset, width_offset,
code_offset); code_offset);
let mut to_add = HashMap::new(); let mut to_add = FxHashMap::default();
for (depth, style) in depths { for (depth, style) in depths {
if multilines.get(&depth).is_some() { if multilines.get(&depth).is_some() {

View file

@ -8,11 +8,11 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
use std::collections::HashMap; use rustc_data_structures::fx::FxHashMap;
#[derive(Clone)] #[derive(Clone)]
pub struct Registry { pub struct Registry {
descriptions: HashMap<&'static str, &'static str>, descriptions: FxHashMap<&'static str, &'static str>,
} }
impl Registry { impl Registry {

View file

@ -24,7 +24,6 @@
//! the required condition is not met. //! the required condition is not met.
//! //!
use std::collections::HashSet;
use std::iter::FromIterator; use std::iter::FromIterator;
use std::vec::Vec; use std::vec::Vec;
use rustc::dep_graph::{DepNode, label_strs}; use rustc::dep_graph::{DepNode, label_strs};
@ -193,7 +192,7 @@ const LABELS_TRAIT: &[&[&str]] = &[
// //
// TypeOfItem for these. // TypeOfItem for these.
type Labels = HashSet<String>; type Labels = FxHashSet<String>;
/// Represents the requested configuration by rustc_clean/dirty /// Represents the requested configuration by rustc_clean/dirty
struct Assertion { struct Assertion {
@ -205,13 +204,13 @@ impl Assertion {
fn from_clean_labels(labels: Labels) -> Assertion { fn from_clean_labels(labels: Labels) -> Assertion {
Assertion { Assertion {
clean: labels, clean: labels,
dirty: Labels::new(), dirty: Labels::default(),
} }
} }
fn from_dirty_labels(labels: Labels) -> Assertion { fn from_dirty_labels(labels: Labels) -> Assertion {
Assertion { Assertion {
clean: Labels::new(), clean: Labels::default(),
dirty: labels, dirty: labels,
} }
} }
@ -328,7 +327,7 @@ impl<'a, 'tcx> DirtyCleanVisitor<'a, 'tcx> {
} }
} }
// if no `label` or `except` is given, only the node's group are asserted // if no `label` or `except` is given, only the node's group are asserted
Labels::new() Labels::default()
} }
/// Return all DepNode labels that should be asserted for this item. /// Return all DepNode labels that should be asserted for this item.
@ -436,7 +435,7 @@ impl<'a, 'tcx> DirtyCleanVisitor<'a, 'tcx> {
} }
fn resolve_labels(&self, item: &NestedMetaItem, value: &str) -> Labels { fn resolve_labels(&self, item: &NestedMetaItem, value: &str) -> Labels {
let mut out: Labels = HashSet::new(); let mut out = Labels::default();
for label in value.split(',') { for label in value.split(',') {
let label = label.trim(); let label = label.trim();
if DepNode::has_label_string(label) { if DepNode::has_label_string(label) {

View file

@ -39,7 +39,6 @@ use util::nodemap::NodeSet;
use lint::{LateContext, LintContext, LintArray}; use lint::{LateContext, LintContext, LintArray};
use lint::{LintPass, LateLintPass, EarlyLintPass, EarlyContext}; use lint::{LintPass, LateLintPass, EarlyLintPass, EarlyContext};
use std::collections::HashSet;
use rustc::util::nodemap::FxHashSet; use rustc::util::nodemap::FxHashSet;
use syntax::tokenstream::{TokenTree, TokenStream}; use syntax::tokenstream::{TokenTree, TokenStream};
@ -304,14 +303,14 @@ pub struct MissingDoc {
doc_hidden_stack: Vec<bool>, doc_hidden_stack: Vec<bool>,
/// Private traits or trait items that leaked through. Don't check their methods. /// Private traits or trait items that leaked through. Don't check their methods.
private_traits: HashSet<ast::NodeId>, private_traits: FxHashSet<ast::NodeId>,
} }
impl MissingDoc { impl MissingDoc {
pub fn new() -> MissingDoc { pub fn new() -> MissingDoc {
MissingDoc { MissingDoc {
doc_hidden_stack: vec![false], doc_hidden_stack: vec![false],
private_traits: HashSet::new(), private_traits: FxHashSet::default(),
} }
} }
@ -908,7 +907,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnconditionalRecursion {
let mut work_queue = vec![cfg.entry]; let mut work_queue = vec![cfg.entry];
let mut reached_exit_without_self_call = false; let mut reached_exit_without_self_call = false;
let mut self_call_spans = vec![]; let mut self_call_spans = vec![];
let mut visited = HashSet::new(); let mut visited = FxHashSet::default();
while let Some(idx) = work_queue.pop() { while let Some(idx) = work_queue.pop() {
if idx == cfg.exit { if idx == cfg.exit {

View file

@ -226,6 +226,7 @@ use cstore::{MetadataRef, MetadataBlob};
use creader::Library; use creader::Library;
use schema::{METADATA_HEADER, rustc_version}; use schema::{METADATA_HEADER, rustc_version};
use rustc_data_structures::fx::FxHashSet;
use rustc_data_structures::svh::Svh; use rustc_data_structures::svh::Svh;
use rustc::middle::cstore::MetadataLoader; use rustc::middle::cstore::MetadataLoader;
use rustc::session::{config, Session}; use rustc::session::{config, Session};
@ -239,7 +240,6 @@ use syntax_pos::Span;
use rustc_target::spec::{Target, TargetTriple}; use rustc_target::spec::{Target, TargetTriple};
use std::cmp; use std::cmp;
use std::collections::HashSet;
use std::fmt; use std::fmt;
use std::fs; use std::fs;
use std::io::{self, Read}; use std::io::{self, Read};
@ -308,7 +308,7 @@ impl CratePaths {
impl<'a> Context<'a> { impl<'a> Context<'a> {
pub fn maybe_load_library_crate(&mut self) -> Option<Library> { pub fn maybe_load_library_crate(&mut self) -> Option<Library> {
let mut seen_paths = HashSet::new(); let mut seen_paths = FxHashSet::default();
match self.extra_filename { match self.extra_filename {
Some(s) => self.find_library_crate(s, &mut seen_paths) Some(s) => self.find_library_crate(s, &mut seen_paths)
.or_else(|| self.find_library_crate("", &mut seen_paths)), .or_else(|| self.find_library_crate("", &mut seen_paths)),
@ -431,7 +431,7 @@ impl<'a> Context<'a> {
fn find_library_crate(&mut self, fn find_library_crate(&mut self,
extra_prefix: &str, extra_prefix: &str,
seen_paths: &mut HashSet<PathBuf>) seen_paths: &mut FxHashSet<PathBuf>)
-> Option<Library> { -> Option<Library> {
// If an SVH is specified, then this is a transitive dependency that // If an SVH is specified, then this is a transitive dependency that
// must be loaded via -L plus some filtering. // must be loaded via -L plus some filtering.

View file

@ -67,9 +67,9 @@ use rustc::ty::{self, TyCtxt, AdtDef, Ty};
use rustc::ty::subst::Substs; use rustc::ty::subst::Substs;
use util::dump_mir; use util::dump_mir;
use util::liveness::{self, IdentityMap}; use util::liveness::{self, IdentityMap};
use rustc_data_structures::fx::FxHashMap;
use rustc_data_structures::indexed_vec::Idx; use rustc_data_structures::indexed_vec::Idx;
use rustc_data_structures::indexed_set::IdxSet; use rustc_data_structures::indexed_set::IdxSet;
use std::collections::HashMap;
use std::borrow::Cow; use std::borrow::Cow;
use std::iter::once; use std::iter::once;
use std::mem; use std::mem;
@ -142,10 +142,12 @@ struct TransformVisitor<'a, 'tcx: 'a> {
state_field: usize, state_field: usize,
// Mapping from Local to (type of local, generator struct index) // Mapping from Local to (type of local, generator struct index)
remap: HashMap<Local, (Ty<'tcx>, usize)>, // FIXME(eddyb) This should use `IndexVec<Local, Option<_>>`.
remap: FxHashMap<Local, (Ty<'tcx>, usize)>,
// A map from a suspension point in a block to the locals which have live storage at that point // A map from a suspension point in a block to the locals which have live storage at that point
storage_liveness: HashMap<BasicBlock, liveness::LiveVarSet<Local>>, // FIXME(eddyb) This should use `IndexVec<BasicBlock, Option<_>>`.
storage_liveness: FxHashMap<BasicBlock, liveness::LiveVarSet<Local>>,
// A list of suspension points, generated during the transform // A list of suspension points, generated during the transform
suspension_points: Vec<SuspensionPoint>, suspension_points: Vec<SuspensionPoint>,
@ -364,12 +366,15 @@ impl<'tcx> Visitor<'tcx> for BorrowedLocals {
} }
} }
fn locals_live_across_suspend_points<'a, 'tcx,>(tcx: TyCtxt<'a, 'tcx, 'tcx>, fn locals_live_across_suspend_points(
tcx: TyCtxt<'a, 'tcx, 'tcx>,
mir: &Mir<'tcx>, mir: &Mir<'tcx>,
source: MirSource, source: MirSource,
movable: bool) -> movable: bool,
(liveness::LiveVarSet<Local>, ) -> (
HashMap<BasicBlock, liveness::LiveVarSet<Local>>) { liveness::LiveVarSet<Local>,
FxHashMap<BasicBlock, liveness::LiveVarSet<Local>>,
) {
let dead_unwinds = IdxSet::new_empty(mir.basic_blocks().len()); let dead_unwinds = IdxSet::new_empty(mir.basic_blocks().len());
let node_id = tcx.hir.as_local_node_id(source.def_id).unwrap(); let node_id = tcx.hir.as_local_node_id(source.def_id).unwrap();
@ -413,7 +418,7 @@ fn locals_live_across_suspend_points<'a, 'tcx,>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
&liveness, &liveness,
); );
let mut storage_liveness_map = HashMap::new(); let mut storage_liveness_map = FxHashMap::default();
for (block, data) in mir.basic_blocks().iter_enumerated() { for (block, data) in mir.basic_blocks().iter_enumerated() {
if let TerminatorKind::Yield { .. } = data.terminator().kind { if let TerminatorKind::Yield { .. } = data.terminator().kind {
@ -477,9 +482,9 @@ fn compute_layout<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
interior: Ty<'tcx>, interior: Ty<'tcx>,
movable: bool, movable: bool,
mir: &mut Mir<'tcx>) mir: &mut Mir<'tcx>)
-> (HashMap<Local, (Ty<'tcx>, usize)>, -> (FxHashMap<Local, (Ty<'tcx>, usize)>,
GeneratorLayout<'tcx>, GeneratorLayout<'tcx>,
HashMap<BasicBlock, liveness::LiveVarSet<Local>>) FxHashMap<BasicBlock, liveness::LiveVarSet<Local>>)
{ {
// Use a liveness analysis to compute locals which are live across a suspension point // Use a liveness analysis to compute locals which are live across a suspension point
let (live_locals, storage_liveness) = locals_live_across_suspend_points(tcx, let (live_locals, storage_liveness) = locals_live_across_suspend_points(tcx,

View file

@ -12,6 +12,7 @@
use rustc::lint::{EarlyLintPassObject, LateLintPassObject, LintId, Lint}; use rustc::lint::{EarlyLintPassObject, LateLintPassObject, LintId, Lint};
use rustc::session::Session; use rustc::session::Session;
use rustc::util::nodemap::FxHashMap;
use syntax::ext::base::{SyntaxExtension, NamedSyntaxExtension, NormalTT, IdentTT}; use syntax::ext::base::{SyntaxExtension, NamedSyntaxExtension, NormalTT, IdentTT};
use syntax::ext::base::MacroExpanderFn; use syntax::ext::base::MacroExpanderFn;
@ -21,7 +22,6 @@ use syntax::ast;
use syntax::feature_gate::AttributeType; use syntax::feature_gate::AttributeType;
use syntax_pos::Span; use syntax_pos::Span;
use std::collections::HashMap;
use std::borrow::ToOwned; use std::borrow::ToOwned;
/// Structure used to register plugins. /// Structure used to register plugins.
@ -53,7 +53,7 @@ pub struct Registry<'a> {
pub late_lint_passes: Vec<LateLintPassObject>, pub late_lint_passes: Vec<LateLintPassObject>,
#[doc(hidden)] #[doc(hidden)]
pub lint_groups: HashMap<&'static str, Vec<LintId>>, pub lint_groups: FxHashMap<&'static str, Vec<LintId>>,
#[doc(hidden)] #[doc(hidden)]
pub llvm_passes: Vec<String>, pub llvm_passes: Vec<String>,
@ -74,7 +74,7 @@ impl<'a> Registry<'a> {
syntax_exts: vec![], syntax_exts: vec![],
early_lint_passes: vec![], early_lint_passes: vec![],
late_lint_passes: vec![], late_lint_passes: vec![],
lint_groups: HashMap::new(), lint_groups: FxHashMap::default(),
llvm_passes: vec![], llvm_passes: vec![],
attributes: vec![], attributes: vec![],
whitelisted_custom_derives: Vec::new(), whitelisted_custom_derives: Vec::new(),

View file

@ -91,7 +91,7 @@ pub struct DumpVisitor<'l, 'tcx: 'l, 'll, O: DumpOutput + 'll> {
// of macro use (callsite) spans. We store these to ensure // of macro use (callsite) spans. We store these to ensure
// we only write one macro def per unique macro definition, and // we only write one macro def per unique macro definition, and
// one macro use per unique callsite span. // one macro use per unique callsite span.
// mac_defs: HashSet<Span>, // mac_defs: FxHashSet<Span>,
macro_calls: FxHashSet<Span>, macro_calls: FxHashSet<Span>,
} }
@ -107,7 +107,7 @@ impl<'l, 'tcx: 'l, 'll, O: DumpOutput + 'll> DumpVisitor<'l, 'tcx, 'll, O> {
dumper, dumper,
span: span_utils.clone(), span: span_utils.clone(),
cur_scope: CRATE_NODE_ID, cur_scope: CRATE_NODE_ID,
// mac_defs: HashSet::new(), // mac_defs: FxHashSet::default(),
macro_calls: FxHashSet(), macro_calls: FxHashSet(),
} }
} }

View file

@ -29,8 +29,9 @@
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
use rustc_data_structures::fx::FxHashMap;
use std::cell::RefCell; use std::cell::RefCell;
use std::collections::{HashMap, VecDeque}; use std::collections::VecDeque;
use std::default::Default; use std::default::Default;
use std::fmt::{self, Write}; use std::fmt::{self, Write};
use std::borrow::Cow; use std::borrow::Cow;
@ -417,14 +418,14 @@ impl<'a, I: Iterator<Item = Event<'a>>> Iterator for SummaryLine<'a, I> {
/// references. /// references.
struct Footnotes<'a, I: Iterator<Item = Event<'a>>> { struct Footnotes<'a, I: Iterator<Item = Event<'a>>> {
inner: I, inner: I,
footnotes: HashMap<String, (Vec<Event<'a>>, u16)>, footnotes: FxHashMap<String, (Vec<Event<'a>>, u16)>,
} }
impl<'a, I: Iterator<Item = Event<'a>>> Footnotes<'a, I> { impl<'a, I: Iterator<Item = Event<'a>>> Footnotes<'a, I> {
fn new(iter: I) -> Self { fn new(iter: I) -> Self {
Footnotes { Footnotes {
inner: iter, inner: iter,
footnotes: HashMap::new(), footnotes: FxHashMap::default(),
} }
} }
fn get_entry(&mut self, key: &str) -> &mut (Vec<Event<'a>>, u16) { fn get_entry(&mut self, key: &str) -> &mut (Vec<Event<'a>>, u16) {
@ -865,7 +866,7 @@ pub fn markdown_links(md: &str) -> Vec<(String, Option<Range<usize>>)> {
#[derive(Default)] #[derive(Default)]
pub struct IdMap { pub struct IdMap {
map: HashMap<String, usize>, map: FxHashMap<String, usize>,
} }
impl IdMap { impl IdMap {
@ -880,7 +881,7 @@ impl IdMap {
} }
pub fn reset(&mut self) { pub fn reset(&mut self) {
self.map = HashMap::new(); self.map = FxHashMap::default();
} }
pub fn derive(&mut self, candidate: String) -> String { pub fn derive(&mut self, candidate: String) -> String {

View file

@ -38,7 +38,7 @@ pub use self::ExternalLocation::*;
use std::borrow::Cow; use std::borrow::Cow;
use std::cell::RefCell; use std::cell::RefCell;
use std::cmp::Ordering; use std::cmp::Ordering;
use std::collections::{BTreeMap, HashSet, VecDeque}; use std::collections::{BTreeMap, VecDeque};
use std::default::Default; use std::default::Default;
use std::error; use std::error;
use std::fmt::{self, Display, Formatter, Write as FmtWrite}; use std::fmt::{self, Display, Formatter, Write as FmtWrite};
@ -741,7 +741,7 @@ fn write_shared(cx: &Context,
// To avoid "light.css" to be overwritten, we'll first run over the received themes and only // To avoid "light.css" to be overwritten, we'll first run over the received themes and only
// then we'll run over the "official" styles. // then we'll run over the "official" styles.
let mut themes: HashSet<String> = HashSet::new(); let mut themes: FxHashSet<String> = FxHashSet::default();
for entry in &cx.shared.themes { for entry in &cx.shared.themes {
let mut content = Vec::with_capacity(100000); let mut content = Vec::with_capacity(100000);
@ -1539,35 +1539,36 @@ impl Ord for ItemEntry {
#[derive(Debug)] #[derive(Debug)]
struct AllTypes { struct AllTypes {
structs: HashSet<ItemEntry>, structs: FxHashSet<ItemEntry>,
enums: HashSet<ItemEntry>, enums: FxHashSet<ItemEntry>,
unions: HashSet<ItemEntry>, unions: FxHashSet<ItemEntry>,
primitives: HashSet<ItemEntry>, primitives: FxHashSet<ItemEntry>,
traits: HashSet<ItemEntry>, traits: FxHashSet<ItemEntry>,
macros: HashSet<ItemEntry>, macros: FxHashSet<ItemEntry>,
functions: HashSet<ItemEntry>, functions: FxHashSet<ItemEntry>,
typedefs: HashSet<ItemEntry>, typedefs: FxHashSet<ItemEntry>,
existentials: HashSet<ItemEntry>, existentials: FxHashSet<ItemEntry>,
statics: HashSet<ItemEntry>, statics: FxHashSet<ItemEntry>,
constants: HashSet<ItemEntry>, constants: FxHashSet<ItemEntry>,
keywords: HashSet<ItemEntry>, keywords: FxHashSet<ItemEntry>,
} }
impl AllTypes { impl AllTypes {
fn new() -> AllTypes { fn new() -> AllTypes {
let new_set = |cap| FxHashSet::with_capacity_and_hasher(cap, Default::default());
AllTypes { AllTypes {
structs: HashSet::with_capacity(100), structs: new_set(100),
enums: HashSet::with_capacity(100), enums: new_set(100),
unions: HashSet::with_capacity(100), unions: new_set(100),
primitives: HashSet::with_capacity(26), primitives: new_set(26),
traits: HashSet::with_capacity(100), traits: new_set(100),
macros: HashSet::with_capacity(100), macros: new_set(100),
functions: HashSet::with_capacity(100), functions: new_set(100),
typedefs: HashSet::with_capacity(100), typedefs: new_set(100),
existentials: HashSet::with_capacity(100), existentials: new_set(100),
statics: HashSet::with_capacity(100), statics: new_set(100),
constants: HashSet::with_capacity(100), constants: new_set(100),
keywords: HashSet::with_capacity(100), keywords: new_set(100),
} }
} }
@ -1595,7 +1596,7 @@ impl AllTypes {
} }
} }
fn print_entries(f: &mut fmt::Formatter, e: &HashSet<ItemEntry>, title: &str, fn print_entries(f: &mut fmt::Formatter, e: &FxHashSet<ItemEntry>, title: &str,
class: &str) -> fmt::Result { class: &str) -> fmt::Result {
if !e.is_empty() { if !e.is_empty() {
let mut e: Vec<&ItemEntry> = e.iter().collect(); let mut e: Vec<&ItemEntry> = e.iter().collect();
@ -4185,7 +4186,7 @@ fn sidebar_assoc_items(it: &clean::Item) -> String {
} }
} }
let format_impls = |impls: Vec<&Impl>| { let format_impls = |impls: Vec<&Impl>| {
let mut links = HashSet::new(); let mut links = FxHashSet::default();
impls.iter() impls.iter()
.filter_map(|i| { .filter_map(|i| {
let is_negative_impl = is_negative_impl(i.inner_impl()); let is_negative_impl = is_negative_impl(i.inner_impl());

View file

@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
use std::collections::HashSet; use rustc_data_structures::fx::FxHashSet;
use std::fs::File; use std::fs::File;
use std::hash::{Hash, Hasher}; use std::hash::{Hash, Hasher};
use std::io::Read; use std::io::Read;
@ -31,7 +31,7 @@ macro_rules! try_something {
#[derive(Debug, Clone, Eq)] #[derive(Debug, Clone, Eq)]
pub struct CssPath { pub struct CssPath {
pub name: String, pub name: String,
pub children: HashSet<CssPath>, pub children: FxHashSet<CssPath>,
} }
// This PartialEq implementation IS NOT COMMUTATIVE!!! // This PartialEq implementation IS NOT COMMUTATIVE!!!
@ -66,7 +66,7 @@ impl CssPath {
fn new(name: String) -> CssPath { fn new(name: String) -> CssPath {
CssPath { CssPath {
name, name,
children: HashSet::new(), children: FxHashSet::default(),
} }
} }
} }
@ -211,7 +211,7 @@ fn build_rule(v: &[u8], positions: &[usize]) -> String {
.join(" ") .join(" ")
} }
fn inner(v: &[u8], events: &[Events], pos: &mut usize) -> HashSet<CssPath> { fn inner(v: &[u8], events: &[Events], pos: &mut usize) -> FxHashSet<CssPath> {
let mut paths = Vec::with_capacity(50); let mut paths = Vec::with_capacity(50);
while *pos < events.len() { while *pos < events.len() {

View file

@ -28,8 +28,8 @@ use ThinVec;
use tokenstream::{ThinTokenStream, TokenStream}; use tokenstream::{ThinTokenStream, TokenStream};
use serialize::{self, Encoder, Decoder}; use serialize::{self, Encoder, Decoder};
use std::collections::HashSet;
use std::fmt; use std::fmt;
use rustc_data_structures::fx::FxHashSet;
use rustc_data_structures::sync::Lrc; use rustc_data_structures::sync::Lrc;
use std::u32; use std::u32;
@ -407,7 +407,7 @@ pub struct WhereEqPredicate {
/// The set of MetaItems that define the compilation environment of the crate, /// The set of MetaItems that define the compilation environment of the crate,
/// used to drive conditional compilation /// used to drive conditional compilation
pub type CrateConfig = HashSet<(Name, Option<Symbol>)>; pub type CrateConfig = FxHashSet<(Name, Option<Symbol>)>;
#[derive(Clone, RustcEncodable, RustcDecodable, Debug)] #[derive(Clone, RustcEncodable, RustcDecodable, Debug)]
pub struct Crate { pub struct Crate {

View file

@ -26,7 +26,7 @@ use OneVector;
use symbol::{keywords, Ident, Symbol}; use symbol::{keywords, Ident, Symbol};
use ThinVec; use ThinVec;
use std::collections::HashMap; use rustc_data_structures::fx::FxHashMap;
use std::iter; use std::iter;
use std::path::PathBuf; use std::path::PathBuf;
use std::rc::Rc; use std::rc::Rc;
@ -800,7 +800,7 @@ pub struct ExtCtxt<'a> {
pub resolver: &'a mut dyn Resolver, pub resolver: &'a mut dyn Resolver,
pub resolve_err_count: usize, pub resolve_err_count: usize,
pub current_expansion: ExpansionData, pub current_expansion: ExpansionData,
pub expansions: HashMap<Span, Vec<String>>, pub expansions: FxHashMap<Span, Vec<String>>,
} }
impl<'a> ExtCtxt<'a> { impl<'a> ExtCtxt<'a> {
@ -821,7 +821,7 @@ impl<'a> ExtCtxt<'a> {
directory_ownership: DirectoryOwnership::Owned { relative: None }, directory_ownership: DirectoryOwnership::Owned { relative: None },
crate_span: None, crate_span: None,
}, },
expansions: HashMap::new(), expansions: FxHashMap::default(),
} }
} }

View file

@ -17,7 +17,7 @@ use parse::parser::PathStyle;
use symbol::Symbol; use symbol::Symbol;
use syntax_pos::Span; use syntax_pos::Span;
use std::collections::HashSet; use rustc_data_structures::fx::FxHashSet;
pub fn collect_derives(cx: &mut ExtCtxt, attrs: &mut Vec<ast::Attribute>) -> Vec<ast::Path> { pub fn collect_derives(cx: &mut ExtCtxt, attrs: &mut Vec<ast::Attribute>) -> Vec<ast::Path> {
let mut result = Vec::new(); let mut result = Vec::new();
@ -48,7 +48,7 @@ pub fn collect_derives(cx: &mut ExtCtxt, attrs: &mut Vec<ast::Attribute>) -> Vec
pub fn add_derived_markers<T>(cx: &mut ExtCtxt, span: Span, traits: &[ast::Path], item: T) -> T pub fn add_derived_markers<T>(cx: &mut ExtCtxt, span: Span, traits: &[ast::Path], item: T) -> T
where T: HasAttrs, where T: HasAttrs,
{ {
let (mut names, mut pretty_name) = (HashSet::new(), "derive(".to_owned()); let (mut names, mut pretty_name) = (FxHashSet::default(), "derive(".to_owned());
for (i, path) in traits.iter().enumerate() { for (i, path) in traits.iter().enumerate() {
if i > 0 { if i > 0 {
pretty_name.push_str(", "); pretty_name.push_str(", ");

View file

@ -34,7 +34,7 @@ use syntax_pos::hygiene::ExpnFormat;
use tokenstream::{TokenStream, TokenTree}; use tokenstream::{TokenStream, TokenTree};
use visit::{self, Visitor}; use visit::{self, Visitor};
use std::collections::HashMap; use rustc_data_structures::fx::FxHashMap;
use std::fs::File; use std::fs::File;
use std::io::Read; use std::io::Read;
use std::iter::FromIterator; use std::iter::FromIterator;
@ -319,7 +319,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
// Unresolved macros produce dummy outputs as a recovery measure. // Unresolved macros produce dummy outputs as a recovery measure.
invocations.reverse(); invocations.reverse();
let mut expanded_fragments = Vec::new(); let mut expanded_fragments = Vec::new();
let mut derives: HashMap<Mark, Vec<_>> = HashMap::new(); let mut derives: FxHashMap<Mark, Vec<_>> = FxHashMap::default();
let mut undetermined_invocations = Vec::new(); let mut undetermined_invocations = Vec::new();
let (mut progress, mut force) = (false, !self.monotonic); let (mut progress, mut force) = (false, !self.monotonic);
loop { loop {

View file

@ -21,7 +21,7 @@ use symbol::keywords;
use ThinVec; use ThinVec;
use util::move_map::MoveMap; use util::move_map::MoveMap;
use std::collections::HashMap; use rustc_data_structures::fx::FxHashMap;
pub fn placeholder(kind: AstFragmentKind, id: ast::NodeId) -> AstFragment { pub fn placeholder(kind: AstFragmentKind, id: ast::NodeId) -> AstFragment {
fn mac_placeholder() -> ast::Mac { fn mac_placeholder() -> ast::Mac {
@ -81,7 +81,7 @@ pub fn placeholder(kind: AstFragmentKind, id: ast::NodeId) -> AstFragment {
} }
pub struct PlaceholderExpander<'a, 'b: 'a> { pub struct PlaceholderExpander<'a, 'b: 'a> {
expanded_fragments: HashMap<ast::NodeId, AstFragment>, expanded_fragments: FxHashMap<ast::NodeId, AstFragment>,
cx: &'a mut ExtCtxt<'b>, cx: &'a mut ExtCtxt<'b>,
monotonic: bool, monotonic: bool,
} }
@ -90,7 +90,7 @@ impl<'a, 'b> PlaceholderExpander<'a, 'b> {
pub fn new(cx: &'a mut ExtCtxt<'b>, monotonic: bool) -> Self { pub fn new(cx: &'a mut ExtCtxt<'b>, monotonic: bool) -> Self {
PlaceholderExpander { PlaceholderExpander {
cx, cx,
expanded_fragments: HashMap::new(), expanded_fragments: FxHashMap::default(),
monotonic, monotonic,
} }
} }

View file

@ -96,11 +96,11 @@ use OneVector;
use symbol::keywords; use symbol::keywords;
use tokenstream::TokenStream; use tokenstream::TokenStream;
use rustc_data_structures::fx::FxHashMap;
use std::collections::hash_map::Entry::{Occupied, Vacant};
use std::mem; use std::mem;
use std::ops::{Deref, DerefMut}; use std::ops::{Deref, DerefMut};
use std::rc::Rc; use std::rc::Rc;
use std::collections::HashMap;
use std::collections::hash_map::Entry::{Occupied, Vacant};
// To avoid costly uniqueness checks, we require that `MatchSeq` always has a nonempty body. // To avoid costly uniqueness checks, we require that `MatchSeq` always has a nonempty body.
@ -263,7 +263,7 @@ pub enum ParseResult<T> {
/// A `ParseResult` where the `Success` variant contains a mapping of `Ident`s to `NamedMatch`es. /// A `ParseResult` where the `Success` variant contains a mapping of `Ident`s to `NamedMatch`es.
/// This represents the mapping of metavars to the token trees they bind to. /// This represents the mapping of metavars to the token trees they bind to.
pub type NamedParseResult = ParseResult<HashMap<Ident, Rc<NamedMatch>>>; pub type NamedParseResult = ParseResult<FxHashMap<Ident, Rc<NamedMatch>>>;
/// Count how many metavars are named in the given matcher `ms`. /// Count how many metavars are named in the given matcher `ms`.
pub fn count_names(ms: &[TokenTree]) -> usize { pub fn count_names(ms: &[TokenTree]) -> usize {
@ -351,7 +351,7 @@ fn nameize<I: Iterator<Item = NamedMatch>>(
sess: &ParseSess, sess: &ParseSess,
m: &TokenTree, m: &TokenTree,
res: &mut I, res: &mut I,
ret_val: &mut HashMap<Ident, Rc<NamedMatch>>, ret_val: &mut FxHashMap<Ident, Rc<NamedMatch>>,
) -> Result<(), (syntax_pos::Span, String)> { ) -> Result<(), (syntax_pos::Span, String)> {
match *m { match *m {
TokenTree::Sequence(_, ref seq) => for next_m in &seq.tts { TokenTree::Sequence(_, ref seq) => for next_m in &seq.tts {
@ -382,7 +382,7 @@ fn nameize<I: Iterator<Item = NamedMatch>>(
Ok(()) Ok(())
} }
let mut ret_val = HashMap::new(); let mut ret_val = FxHashMap::default();
for m in ms { for m in ms {
match n_rec(sess, m, res.by_ref(), &mut ret_val) { match n_rec(sess, m, res.by_ref(), &mut ret_val) {
Ok(_) => {} Ok(_) => {}

View file

@ -27,8 +27,8 @@ use parse::token::Token::*;
use symbol::Symbol; use symbol::Symbol;
use tokenstream::{TokenStream, TokenTree}; use tokenstream::{TokenStream, TokenTree};
use rustc_data_structures::fx::FxHashMap;
use std::borrow::Cow; use std::borrow::Cow;
use std::collections::HashMap;
use std::collections::hash_map::Entry; use std::collections::hash_map::Entry;
use rustc_data_structures::sync::Lrc; use rustc_data_structures::sync::Lrc;
@ -451,14 +451,14 @@ struct FirstSets {
// If two sequences have the same span in a matcher, then map that // If two sequences have the same span in a matcher, then map that
// span to None (invalidating the mapping here and forcing the code to // span to None (invalidating the mapping here and forcing the code to
// use a slow path). // use a slow path).
first: HashMap<Span, Option<TokenSet>>, first: FxHashMap<Span, Option<TokenSet>>,
} }
impl FirstSets { impl FirstSets {
fn new(tts: &[quoted::TokenTree]) -> FirstSets { fn new(tts: &[quoted::TokenTree]) -> FirstSets {
use self::quoted::TokenTree; use self::quoted::TokenTree;
let mut sets = FirstSets { first: HashMap::new() }; let mut sets = FirstSets { first: FxHashMap::default() };
build_recur(&mut sets, tts); build_recur(&mut sets, tts);
return sets; return sets;

View file

@ -19,11 +19,11 @@ use OneVector;
use syntax_pos::{Span, DUMMY_SP}; use syntax_pos::{Span, DUMMY_SP};
use tokenstream::{TokenStream, TokenTree, Delimited}; use tokenstream::{TokenStream, TokenTree, Delimited};
use std::rc::Rc; use rustc_data_structures::fx::FxHashMap;
use rustc_data_structures::sync::Lrc; use rustc_data_structures::sync::Lrc;
use std::mem; use std::mem;
use std::ops::Add; use std::ops::Add;
use std::collections::HashMap; use std::rc::Rc;
// An iterator over the token trees in a delimited token tree (`{ ... }`) or a sequence (`$(...)`). // An iterator over the token trees in a delimited token tree (`{ ... }`) or a sequence (`$(...)`).
enum Frame { enum Frame {
@ -67,11 +67,11 @@ impl Iterator for Frame {
/// `src` contains no `TokenTree::{Sequence, MetaVar, MetaVarDecl}`s, `interp` can /// `src` contains no `TokenTree::{Sequence, MetaVar, MetaVarDecl}`s, `interp` can
/// (and should) be None. /// (and should) be None.
pub fn transcribe(cx: &ExtCtxt, pub fn transcribe(cx: &ExtCtxt,
interp: Option<HashMap<Ident, Rc<NamedMatch>>>, interp: Option<FxHashMap<Ident, Rc<NamedMatch>>>,
src: Vec<quoted::TokenTree>) src: Vec<quoted::TokenTree>)
-> TokenStream { -> TokenStream {
let mut stack: OneVector<Frame> = smallvec![Frame::new(src)]; let mut stack: OneVector<Frame> = smallvec![Frame::new(src)];
let interpolations = interp.unwrap_or_else(HashMap::new); /* just a convenience */ let interpolations = interp.unwrap_or_else(FxHashMap::default); /* just a convenience */
let mut repeats = Vec::new(); let mut repeats = Vec::new();
let mut result: Vec<TokenStream> = Vec::new(); let mut result: Vec<TokenStream> = Vec::new();
let mut result_stack = Vec::new(); let mut result_stack = Vec::new();
@ -187,7 +187,7 @@ pub fn transcribe(cx: &ExtCtxt,
} }
fn lookup_cur_matched(ident: Ident, fn lookup_cur_matched(ident: Ident,
interpolations: &HashMap<Ident, Rc<NamedMatch>>, interpolations: &FxHashMap<Ident, Rc<NamedMatch>>,
repeats: &[(usize, usize)]) repeats: &[(usize, usize)])
-> Option<Rc<NamedMatch>> { -> Option<Rc<NamedMatch>> {
interpolations.get(&ident).map(|matched| { interpolations.get(&ident).map(|matched| {
@ -234,7 +234,7 @@ impl Add for LockstepIterSize {
} }
fn lockstep_iter_size(tree: &quoted::TokenTree, fn lockstep_iter_size(tree: &quoted::TokenTree,
interpolations: &HashMap<Ident, Rc<NamedMatch>>, interpolations: &FxHashMap<Ident, Rc<NamedMatch>>,
repeats: &[(usize, usize)]) repeats: &[(usize, usize)])
-> LockstepIterSize { -> LockstepIterSize {
use self::quoted::TokenTree; use self::quoted::TokenTree;

View file

@ -1831,10 +1831,10 @@ mod tests {
use errors; use errors;
use feature_gate::UnstableFeatures; use feature_gate::UnstableFeatures;
use parse::token; use parse::token;
use std::collections::HashSet;
use std::io; use std::io;
use std::path::PathBuf; use std::path::PathBuf;
use diagnostics::plugin::ErrorMap; use diagnostics::plugin::ErrorMap;
use rustc_data_structures::fx::FxHashSet;
use rustc_data_structures::sync::Lock; use rustc_data_structures::sync::Lock;
use with_globals; use with_globals;
fn mk_sess(cm: Lrc<SourceMap>) -> ParseSess { fn mk_sess(cm: Lrc<SourceMap>) -> ParseSess {
@ -1845,10 +1845,10 @@ mod tests {
ParseSess { ParseSess {
span_diagnostic: errors::Handler::with_emitter(true, false, Box::new(emitter)), span_diagnostic: errors::Handler::with_emitter(true, false, Box::new(emitter)),
unstable_features: UnstableFeatures::from_environment(), unstable_features: UnstableFeatures::from_environment(),
config: CrateConfig::new(), config: CrateConfig::default(),
included_mod_stack: Lock::new(Vec::new()), included_mod_stack: Lock::new(Vec::new()),
code_map: cm, code_map: cm,
missing_fragment_specifiers: Lock::new(HashSet::new()), missing_fragment_specifiers: Lock::new(FxHashSet::default()),
raw_identifier_spans: Lock::new(Vec::new()), raw_identifier_spans: Lock::new(Vec::new()),
registered_diagnostics: Lock::new(ErrorMap::new()), registered_diagnostics: Lock::new(ErrorMap::new()),
non_modrs_mods: Lock::new(vec![]), non_modrs_mods: Lock::new(vec![]),

View file

@ -24,8 +24,8 @@ use symbol::Symbol;
use tokenstream::{TokenStream, TokenTree}; use tokenstream::{TokenStream, TokenTree};
use diagnostics::plugin::ErrorMap; use diagnostics::plugin::ErrorMap;
use rustc_data_structures::fx::FxHashSet;
use std::borrow::Cow; use std::borrow::Cow;
use std::collections::HashSet;
use std::iter; use std::iter;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::str; use std::str;
@ -46,7 +46,7 @@ pub struct ParseSess {
pub span_diagnostic: Handler, pub span_diagnostic: Handler,
pub unstable_features: UnstableFeatures, pub unstable_features: UnstableFeatures,
pub config: CrateConfig, pub config: CrateConfig,
pub missing_fragment_specifiers: Lock<HashSet<Span>>, pub missing_fragment_specifiers: Lock<FxHashSet<Span>>,
/// Places where raw identifiers were used. This is used for feature gating /// Places where raw identifiers were used. This is used for feature gating
/// raw identifiers /// raw identifiers
pub raw_identifier_spans: Lock<Vec<Span>>, pub raw_identifier_spans: Lock<Vec<Span>>,
@ -75,8 +75,8 @@ impl ParseSess {
ParseSess { ParseSess {
span_diagnostic: handler, span_diagnostic: handler,
unstable_features: UnstableFeatures::from_environment(), unstable_features: UnstableFeatures::from_environment(),
config: HashSet::new(), config: FxHashSet::default(),
missing_fragment_specifiers: Lock::new(HashSet::new()), missing_fragment_specifiers: Lock::new(FxHashSet::default()),
raw_identifier_spans: Lock::new(Vec::new()), raw_identifier_spans: Lock::new(Vec::new()),
registered_diagnostics: Lock::new(ErrorMap::new()), registered_diagnostics: Lock::new(ErrorMap::new()),
included_mod_stack: Lock::new(vec![]), included_mod_stack: Lock::new(vec![]),

View file

@ -24,9 +24,9 @@ use syntax::tokenstream;
use syntax_pos::{MultiSpan, Span, DUMMY_SP}; use syntax_pos::{MultiSpan, Span, DUMMY_SP};
use errors::Applicability; use errors::Applicability;
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
use std::borrow::Cow; use std::borrow::Cow;
use std::collections::hash_map::Entry; use std::collections::hash_map::Entry;
use std::collections::{HashMap, HashSet};
#[derive(PartialEq)] #[derive(PartialEq)]
enum ArgumentType { enum ArgumentType {
@ -65,7 +65,7 @@ struct Context<'a, 'b: 'a> {
/// Unique format specs seen for each argument. /// Unique format specs seen for each argument.
arg_unique_types: Vec<Vec<ArgumentType>>, arg_unique_types: Vec<Vec<ArgumentType>>,
/// Map from named arguments to their resolved indices. /// Map from named arguments to their resolved indices.
names: HashMap<String, usize>, names: FxHashMap<String, usize>,
/// The latest consecutive literal strings, or empty if there weren't any. /// The latest consecutive literal strings, or empty if there weren't any.
literal: String, literal: String,
@ -104,7 +104,7 @@ struct Context<'a, 'b: 'a> {
/// * `count_args`: `vec![Exact(0), Exact(5), Exact(3)]` /// * `count_args`: `vec![Exact(0), Exact(5), Exact(3)]`
count_args: Vec<Position>, count_args: Vec<Position>,
/// Relative slot numbers for count arguments. /// Relative slot numbers for count arguments.
count_positions: HashMap<usize, usize>, count_positions: FxHashMap<usize, usize>,
/// Number of count slots assigned. /// Number of count slots assigned.
count_positions_count: usize, count_positions_count: usize,
@ -134,9 +134,9 @@ struct Context<'a, 'b: 'a> {
fn parse_args(ecx: &mut ExtCtxt, fn parse_args(ecx: &mut ExtCtxt,
sp: Span, sp: Span,
tts: &[tokenstream::TokenTree]) tts: &[tokenstream::TokenTree])
-> Option<(P<ast::Expr>, Vec<P<ast::Expr>>, HashMap<String, usize>)> { -> Option<(P<ast::Expr>, Vec<P<ast::Expr>>, FxHashMap<String, usize>)> {
let mut args = Vec::<P<ast::Expr>>::new(); let mut args = Vec::<P<ast::Expr>>::new();
let mut names = HashMap::<String, usize>::new(); let mut names = FxHashMap::<String, usize>::default();
let mut p = ecx.new_parser_from_tts(tts); let mut p = ecx.new_parser_from_tts(tts);
@ -768,7 +768,7 @@ pub fn expand_preparsed_format_args(ecx: &mut ExtCtxt,
sp: Span, sp: Span,
efmt: P<ast::Expr>, efmt: P<ast::Expr>,
args: Vec<P<ast::Expr>>, args: Vec<P<ast::Expr>>,
names: HashMap<String, usize>, names: FxHashMap<String, usize>,
append_newline: bool) append_newline: bool)
-> P<ast::Expr> { -> P<ast::Expr> {
// NOTE: this verbose way of initializing `Vec<Vec<ArgumentType>>` is because // NOTE: this verbose way of initializing `Vec<Vec<ArgumentType>>` is because
@ -852,7 +852,7 @@ pub fn expand_preparsed_format_args(ecx: &mut ExtCtxt,
curpiece: 0, curpiece: 0,
arg_index_map: Vec::new(), arg_index_map: Vec::new(),
count_args: Vec::new(), count_args: Vec::new(),
count_positions: HashMap::new(), count_positions: FxHashMap::default(),
count_positions_count: 0, count_positions_count: 0,
count_args_index_offset: 0, count_args_index_offset: 0,
literal: String::new(), literal: String::new(),
@ -952,7 +952,7 @@ pub fn expand_preparsed_format_args(ecx: &mut ExtCtxt,
// The set of foreign substitutions we've explained. This prevents spamming the user // The set of foreign substitutions we've explained. This prevents spamming the user
// with `%d should be written as {}` over and over again. // with `%d should be written as {}` over and over again.
let mut explained = HashSet::new(); let mut explained = FxHashSet::default();
macro_rules! check_foreign { macro_rules! check_foreign {
($kind:ident) => {{ ($kind:ident) => {{

View file

@ -21,8 +21,7 @@ use edition::Edition;
use symbol::Symbol; use symbol::Symbol;
use serialize::{Encodable, Decodable, Encoder, Decoder}; use serialize::{Encodable, Decodable, Encoder, Decoder};
use std::collections::HashMap; use rustc_data_structures::fx::{FxHashMap, FxHashSet};
use rustc_data_structures::fx::FxHashSet;
use std::fmt; use std::fmt;
/// A SyntaxContext represents a chain of macro expansions (represented by marks). /// A SyntaxContext represents a chain of macro expansions (represented by marks).
@ -190,7 +189,7 @@ impl Mark {
crate struct HygieneData { crate struct HygieneData {
marks: Vec<MarkData>, marks: Vec<MarkData>,
syntax_contexts: Vec<SyntaxContextData>, syntax_contexts: Vec<SyntaxContextData>,
markings: HashMap<(SyntaxContext, Mark, Transparency), SyntaxContext>, markings: FxHashMap<(SyntaxContext, Mark, Transparency), SyntaxContext>,
default_edition: Edition, default_edition: Edition,
} }
@ -212,7 +211,7 @@ impl HygieneData {
opaque: SyntaxContext(0), opaque: SyntaxContext(0),
opaque_and_semitransparent: SyntaxContext(0), opaque_and_semitransparent: SyntaxContext(0),
}], }],
markings: HashMap::new(), markings: FxHashMap::default(),
default_edition: Edition::Edition2015, default_edition: Edition::Edition2015,
} }
} }
@ -231,7 +230,7 @@ pub fn set_default_edition(edition: Edition) {
} }
pub fn clear_markings() { pub fn clear_markings() {
HygieneData::with(|data| data.markings = HashMap::new()); HygieneData::with(|data| data.markings = FxHashMap::default());
} }
impl SyntaxContext { impl SyntaxContext {