diff options
| author | Igor Gutorov <igootorov@gmail.com> | 2018-08-13 22:15:16 +0300 |
|---|---|---|
| committer | Igor Gutorov <igootorov@gmail.com> | 2018-08-23 10:45:53 +0300 |
| commit | 4d81fe9243cc8372d3ad5a0eec3dd638578a3541 (patch) | |
| tree | f392a7f8c84c5c771588d993675ecb07338739db /src/libsyntax | |
| parent | e73077e10603b3586828f2d3d067f804c2fc0a1f (diff) | |
| download | rust-4d81fe9243cc8372d3ad5a0eec3dd638578a3541.tar.gz rust-4d81fe9243cc8372d3ad5a0eec3dd638578a3541.zip | |
Use optimized SmallVec implementation
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/Cargo.toml | 1 | ||||
| -rw-r--r-- | src/libsyntax/diagnostics/plugin.rs | 4 | ||||
| -rw-r--r-- | src/libsyntax/ext/base.rs | 8 | ||||
| -rw-r--r-- | src/libsyntax/ext/expand.rs | 9 | ||||
| -rw-r--r-- | src/libsyntax/ext/placeholders.rs | 22 | ||||
| -rw-r--r-- | src/libsyntax/ext/tt/macro_parser.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/ext/tt/transcribe.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/fold.rs | 19 | ||||
| -rw-r--r-- | src/libsyntax/lib.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/test.rs | 5 |
10 files changed, 40 insertions, 34 deletions
diff --git a/src/libsyntax/Cargo.toml b/src/libsyntax/Cargo.toml index d1a5ab0211b..519cc7aa92c 100644 --- a/src/libsyntax/Cargo.toml +++ b/src/libsyntax/Cargo.toml @@ -17,3 +17,4 @@ syntax_pos = { path = "../libsyntax_pos" } rustc_errors = { path = "../librustc_errors" } rustc_data_structures = { path = "../librustc_data_structures" } rustc_target = { path = "../librustc_target" } +smallvec = { version = "0.6.5", features = ["union"] } diff --git a/src/libsyntax/diagnostics/plugin.rs b/src/libsyntax/diagnostics/plugin.rs index d044efa3c38..c5a2cd5ac0b 100644 --- a/src/libsyntax/diagnostics/plugin.rs +++ b/src/libsyntax/diagnostics/plugin.rs @@ -131,7 +131,7 @@ pub fn expand_register_diagnostic<'cx>(ecx: &'cx mut ExtCtxt, let sym = Ident::with_empty_ctxt(Symbol::gensym(&format!( "__register_diagnostic_{}", code ))); - MacEager::items(OneVector::many(vec![ + MacEager::items(OneVector::from_vec(vec![ ecx.item_mod( span, span, @@ -214,7 +214,7 @@ pub fn expand_build_diagnostic_array<'cx>(ecx: &'cx mut ExtCtxt, ), ); - MacEager::items(OneVector::many(vec![ + MacEager::items(OneVector::from_vec(vec![ P(ast::Item { ident: *name, attrs: Vec::new(), diff --git a/src/libsyntax/ext/base.rs b/src/libsyntax/ext/base.rs index c9925b41498..75d24df7b62 100644 --- a/src/libsyntax/ext/base.rs +++ b/src/libsyntax/ext/base.rs @@ -316,11 +316,11 @@ impl<F> IdentMacroExpander for F // Use a macro because forwarding to a simple function has type system issues macro_rules! make_stmts_default { ($me:expr) => { - $me.make_expr().map(|e| OneVector::one(ast::Stmt { + $me.make_expr().map(|e| smallvec![ast::Stmt { id: ast::DUMMY_NODE_ID, span: e.span, node: ast::StmtKind::Expr(e), - })) + }]) } } @@ -548,11 +548,11 @@ impl MacResult for DummyResult { } fn make_stmts(self: Box<DummyResult>) -> Option<OneVector<ast::Stmt>> { - Some(OneVector::one(ast::Stmt { + Some(smallvec![ast::Stmt { id: ast::DUMMY_NODE_ID, node: ast::StmtKind::Expr(DummyResult::raw_expr(self.span)), span: self.span, - })) + }]) } fn make_ty(self: Box<DummyResult>) -> Option<P<ast::Ty>> { diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs index 97279e00869..276ce73d2d5 100644 --- a/src/libsyntax/ext/expand.rs +++ b/src/libsyntax/ext/expand.rs @@ -37,6 +37,7 @@ use visit::{self, Visitor}; use std::collections::HashMap; use std::fs::File; use std::io::Read; +use std::iter::FromIterator; use std::{iter, mem}; use std::rc::Rc; use std::path::PathBuf; @@ -131,7 +132,7 @@ macro_rules! ast_fragments { self.expand_fragment(AstFragment::$Kind(ast)).$make_ast() })*)* $($(fn $fold_ast_elt(&mut self, ast_elt: <$AstTy as IntoIterator>::Item) -> $AstTy { - self.expand_fragment(AstFragment::$Kind(OneVector::one(ast_elt))).$make_ast() + self.expand_fragment(AstFragment::$Kind(smallvec![ast_elt])).$make_ast() })*)* } @@ -270,7 +271,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> { let orig_mod_span = krate.module.inner; - let krate_item = AstFragment::Items(OneVector::one(P(ast::Item { + let krate_item = AstFragment::Items(smallvec![P(ast::Item { attrs: krate.attrs, span: krate.span, node: ast::ItemKind::Mod(krate.module), @@ -278,7 +279,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> { id: ast::DUMMY_NODE_ID, vis: respan(krate.span.shrink_to_lo(), ast::VisibilityKind::Public), tokens: None, - }))); + })]); match self.expand_fragment(krate_item).make_items().pop().map(P::into_inner) { Some(ast::Item { attrs, node: ast::ItemKind::Mod(module), .. }) => { @@ -1409,7 +1410,7 @@ impl<'a, 'b> Folder for InvocationCollector<'a, 'b> { ui }); - OneVector::many( + OneVector::from_iter( self.fold_unnameable(item).into_iter() .chain(self.fold_unnameable(use_item))) } else { diff --git a/src/libsyntax/ext/placeholders.rs b/src/libsyntax/ext/placeholders.rs index 18b4119fde8..7a8ccfddf8e 100644 --- a/src/libsyntax/ext/placeholders.rs +++ b/src/libsyntax/ext/placeholders.rs @@ -46,37 +46,37 @@ pub fn placeholder(kind: AstFragmentKind, id: ast::NodeId) -> AstFragment { match kind { AstFragmentKind::Expr => AstFragment::Expr(expr_placeholder()), AstFragmentKind::OptExpr => AstFragment::OptExpr(Some(expr_placeholder())), - AstFragmentKind::Items => AstFragment::Items(OneVector::one(P(ast::Item { + AstFragmentKind::Items => AstFragment::Items(smallvec![P(ast::Item { id, span, ident, vis, attrs, node: ast::ItemKind::Mac(mac_placeholder()), tokens: None, - }))), - AstFragmentKind::TraitItems => AstFragment::TraitItems(OneVector::one(ast::TraitItem { + })]), + AstFragmentKind::TraitItems => AstFragment::TraitItems(smallvec![ast::TraitItem { id, span, ident, attrs, generics, node: ast::TraitItemKind::Macro(mac_placeholder()), tokens: None, - })), - AstFragmentKind::ImplItems => AstFragment::ImplItems(OneVector::one(ast::ImplItem { + }]), + AstFragmentKind::ImplItems => AstFragment::ImplItems(smallvec![ast::ImplItem { id, span, ident, vis, attrs, generics, node: ast::ImplItemKind::Macro(mac_placeholder()), defaultness: ast::Defaultness::Final, tokens: None, - })), + }]), AstFragmentKind::ForeignItems => - AstFragment::ForeignItems(OneVector::one(ast::ForeignItem { + AstFragment::ForeignItems(smallvec![ast::ForeignItem { id, span, ident, vis, attrs, node: ast::ForeignItemKind::Macro(mac_placeholder()), - })), + }]), AstFragmentKind::Pat => AstFragment::Pat(P(ast::Pat { id, span, node: ast::PatKind::Mac(mac_placeholder()), })), AstFragmentKind::Ty => AstFragment::Ty(P(ast::Ty { id, span, node: ast::TyKind::Mac(mac_placeholder()), })), - AstFragmentKind::Stmts => AstFragment::Stmts(OneVector::one({ + AstFragmentKind::Stmts => AstFragment::Stmts(smallvec![{ let mac = P((mac_placeholder(), ast::MacStmtStyle::Braces, ThinVec::new())); ast::Stmt { id, span, node: ast::StmtKind::Mac(mac) } - })), + }]), } } @@ -118,7 +118,7 @@ impl<'a, 'b> Folder for PlaceholderExpander<'a, 'b> { fn fold_item(&mut self, item: P<ast::Item>) -> OneVector<P<ast::Item>> { match item.node { ast::ItemKind::Mac(_) => return self.remove(item.id).make_items(), - ast::ItemKind::MacroDef(_) => return OneVector::one(item), + ast::ItemKind::MacroDef(_) => return smallvec![item], _ => {} } diff --git a/src/libsyntax/ext/tt/macro_parser.rs b/src/libsyntax/ext/tt/macro_parser.rs index 7d98fa661c0..dcdeee5c2e7 100644 --- a/src/libsyntax/ext/tt/macro_parser.rs +++ b/src/libsyntax/ext/tt/macro_parser.rs @@ -644,7 +644,7 @@ pub fn parse( // This MatcherPos instance is allocated on the stack. All others -- and // there are frequently *no* others! -- are allocated on the heap. let mut initial = initial_matcher_pos(ms, parser.span.lo()); - let mut cur_items = OneVector::one(MatcherPosHandle::Ref(&mut initial)); + let mut cur_items = smallvec![MatcherPosHandle::Ref(&mut initial)]; let mut next_items = Vec::new(); loop { diff --git a/src/libsyntax/ext/tt/transcribe.rs b/src/libsyntax/ext/tt/transcribe.rs index d451227e77c..67a15b149f6 100644 --- a/src/libsyntax/ext/tt/transcribe.rs +++ b/src/libsyntax/ext/tt/transcribe.rs @@ -70,7 +70,7 @@ pub fn transcribe(cx: &ExtCtxt, interp: Option<HashMap<Ident, Rc<NamedMatch>>>, src: Vec<quoted::TokenTree>) -> TokenStream { - let mut stack = OneVector::one(Frame::new(src)); + let mut stack: OneVector<Frame> = smallvec![Frame::new(src)]; let interpolations = interp.unwrap_or_else(HashMap::new); /* just a convenience */ let mut repeats = Vec::new(); let mut result: Vec<TokenStream> = Vec::new(); diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs index 50a49e2f548..07b8b80c131 100644 --- a/src/libsyntax/fold.rs +++ b/src/libsyntax/fold.rs @@ -31,6 +31,7 @@ use tokenstream::*; use util::move_map::MoveMap; use rustc_data_structures::sync::Lrc; +use rustc_data_structures::small_vec::ExpectOne; pub trait Folder : Sized { // Any additions to this trait should happen in form @@ -962,7 +963,7 @@ pub fn noop_fold_item_kind<T: Folder>(i: ItemKind, folder: &mut T) -> ItemKind { pub fn noop_fold_trait_item<T: Folder>(i: TraitItem, folder: &mut T) -> OneVector<TraitItem> { - OneVector::one(TraitItem { + smallvec![TraitItem { id: folder.new_id(i.id), ident: folder.fold_ident(i.ident), attrs: fold_attrs(i.attrs, folder), @@ -986,12 +987,12 @@ pub fn noop_fold_trait_item<T: Folder>(i: TraitItem, folder: &mut T) }, span: folder.new_span(i.span), tokens: i.tokens, - }) + }] } pub fn noop_fold_impl_item<T: Folder>(i: ImplItem, folder: &mut T) -> OneVector<ImplItem> { - OneVector::one(ImplItem { + smallvec![ImplItem { id: folder.new_id(i.id), vis: folder.fold_vis(i.vis), ident: folder.fold_ident(i.ident), @@ -1014,7 +1015,7 @@ pub fn noop_fold_impl_item<T: Folder>(i: ImplItem, folder: &mut T) }, span: folder.new_span(i.span), tokens: i.tokens, - }) + }] } pub fn noop_fold_fn_header<T: Folder>(mut header: FnHeader, folder: &mut T) -> FnHeader { @@ -1067,7 +1068,7 @@ pub fn noop_fold_crate<T: Folder>(Crate {module, attrs, span}: Crate, // fold one item into possibly many items pub fn noop_fold_item<T: Folder>(i: P<Item>, folder: &mut T) -> OneVector<P<Item>> { - OneVector::one(i.map(|i| folder.fold_item_simple(i))) + smallvec![i.map(|i| folder.fold_item_simple(i))] } // fold one item into exactly one item @@ -1089,7 +1090,7 @@ pub fn noop_fold_item_simple<T: Folder>(Item {id, ident, attrs, node, vis, span, pub fn noop_fold_foreign_item<T: Folder>(ni: ForeignItem, folder: &mut T) -> OneVector<ForeignItem> { - OneVector::one(folder.fold_foreign_item_simple(ni)) + smallvec![folder.fold_foreign_item_simple(ni)] } pub fn noop_fold_foreign_item_simple<T: Folder>(ni: ForeignItem, folder: &mut T) -> ForeignItem { @@ -1377,7 +1378,7 @@ pub fn noop_fold_stmt<T: Folder>(Stmt {node, span, id}: Stmt, folder: &mut T) -> pub fn noop_fold_stmt_kind<T: Folder>(node: StmtKind, folder: &mut T) -> OneVector<StmtKind> { match node { - StmtKind::Local(local) => OneVector::one(StmtKind::Local(folder.fold_local(local))), + StmtKind::Local(local) => smallvec![StmtKind::Local(folder.fold_local(local))], StmtKind::Item(item) => folder.fold_item(item).into_iter().map(StmtKind::Item).collect(), StmtKind::Expr(expr) => { folder.fold_opt_expr(expr).into_iter().map(StmtKind::Expr).collect() @@ -1385,9 +1386,9 @@ pub fn noop_fold_stmt_kind<T: Folder>(node: StmtKind, folder: &mut T) -> OneVect StmtKind::Semi(expr) => { folder.fold_opt_expr(expr).into_iter().map(StmtKind::Semi).collect() } - StmtKind::Mac(mac) => OneVector::one(StmtKind::Mac(mac.map(|(mac, semi, attrs)| { + StmtKind::Mac(mac) => smallvec![StmtKind::Mac(mac.map(|(mac, semi, attrs)| { (folder.fold_mac(mac), semi, fold_attrs(attrs.into(), folder).into()) - }))), + }))], } } diff --git a/src/libsyntax/lib.rs b/src/libsyntax/lib.rs index 289f023cefa..b11726e4cc0 100644 --- a/src/libsyntax/lib.rs +++ b/src/libsyntax/lib.rs @@ -40,6 +40,8 @@ extern crate syntax_pos; extern crate rustc_data_structures; extern crate rustc_target; #[macro_use] extern crate scoped_tls; +#[macro_use] +extern crate smallvec; extern crate serialize as rustc_serialize; // used by deriving diff --git a/src/libsyntax/test.rs b/src/libsyntax/test.rs index 988f50b4f0c..49ab0c2256e 100644 --- a/src/libsyntax/test.rs +++ b/src/libsyntax/test.rs @@ -41,6 +41,7 @@ use ptr::P; use OneVector; use symbol::{self, Symbol, keywords}; use ThinVec; +use rustc_data_structures::small_vec::ExpectOne; enum ShouldPanic { No, @@ -183,7 +184,7 @@ impl<'a> fold::Folder for TestHarnessGenerator<'a> { if ident.name != keywords::Invalid.name() { self.cx.path.pop(); } - OneVector::one(P(item)) + smallvec![P(item)] } fn fold_mac(&mut self, mac: ast::Mac) -> ast::Mac { mac } @@ -235,7 +236,7 @@ impl fold::Folder for EntryPointCleaner { EntryPointType::OtherMain => folded, }; - OneVector::one(folded) + smallvec![folded] } fn fold_mac(&mut self, mac: ast::Mac) -> ast::Mac { mac } |
