diff options
| author | Nicholas Nethercote <nnethercote@mozilla.com> | 2019-12-12 16:41:18 +1100 |
|---|---|---|
| committer | Nicholas Nethercote <nnethercote@mozilla.com> | 2020-01-30 11:18:56 +1100 |
| commit | 0d69fe8308a76630a104504c14e1d3d74e2a3f15 (patch) | |
| tree | 8539fc7552335e7298ae1b556c32286671d1fadf /src/librustc_expand | |
| parent | eed12bcd0cb281979c4c9ed956b9e41fda2bfaeb (diff) | |
| download | rust-0d69fe8308a76630a104504c14e1d3d74e2a3f15.tar.gz rust-0d69fe8308a76630a104504c14e1d3d74e2a3f15.zip | |
Use `P` for `NtTraitItem`, `NtImplItem`, and `NtForeignItem`.
This commit reduces the size of `Nonterminal` from a whopping 240 bytes to 72 bytes (on x86-64), which gets it below the `memcpy` threshold. It also removes some impedance mismatches with `Annotatable`, which already uses `P` for these variants.
Diffstat (limited to 'src/librustc_expand')
| -rw-r--r-- | src/librustc_expand/base.rs | 36 | ||||
| -rw-r--r-- | src/librustc_expand/expand.rs | 84 | ||||
| -rw-r--r-- | src/librustc_expand/placeholders.rs | 37 |
3 files changed, 86 insertions, 71 deletions
diff --git a/src/librustc_expand/base.rs b/src/librustc_expand/base.rs index 52ba14dbc3d..9debae19fa5 100644 --- a/src/librustc_expand/base.rs +++ b/src/librustc_expand/base.rs @@ -136,23 +136,23 @@ impl Annotatable { } } - pub fn expect_trait_item(self) -> ast::AssocItem { + pub fn expect_trait_item(self) -> P<ast::AssocItem> { match self { - Annotatable::TraitItem(i) => i.into_inner(), + Annotatable::TraitItem(i) => i, _ => panic!("expected Item"), } } - pub fn expect_impl_item(self) -> ast::AssocItem { + pub fn expect_impl_item(self) -> P<ast::AssocItem> { match self { - Annotatable::ImplItem(i) => i.into_inner(), + Annotatable::ImplItem(i) => i, _ => panic!("expected Item"), } } - pub fn expect_foreign_item(self) -> ast::ForeignItem { + pub fn expect_foreign_item(self) -> P<ast::ForeignItem> { match self { - Annotatable::ForeignItem(i) => i.into_inner(), + Annotatable::ForeignItem(i) => i, _ => panic!("expected foreign item"), } } @@ -382,17 +382,17 @@ pub trait MacResult { } /// Creates zero or more impl items. - fn make_impl_items(self: Box<Self>) -> Option<SmallVec<[ast::AssocItem; 1]>> { + fn make_impl_items(self: Box<Self>) -> Option<SmallVec<[P<ast::AssocItem>; 1]>> { None } /// Creates zero or more trait items. - fn make_trait_items(self: Box<Self>) -> Option<SmallVec<[ast::AssocItem; 1]>> { + fn make_trait_items(self: Box<Self>) -> Option<SmallVec<[P<ast::AssocItem>; 1]>> { None } /// Creates zero or more items in an `extern {}` block - fn make_foreign_items(self: Box<Self>) -> Option<SmallVec<[ast::ForeignItem; 1]>> { + fn make_foreign_items(self: Box<Self>) -> Option<SmallVec<[P<ast::ForeignItem>; 1]>> { None } @@ -470,9 +470,9 @@ make_MacEager! { expr: P<ast::Expr>, pat: P<ast::Pat>, items: SmallVec<[P<ast::Item>; 1]>, - impl_items: SmallVec<[ast::AssocItem; 1]>, - trait_items: SmallVec<[ast::AssocItem; 1]>, - foreign_items: SmallVec<[ast::ForeignItem; 1]>, + impl_items: SmallVec<[P<ast::AssocItem>; 1]>, + trait_items: SmallVec<[P<ast::AssocItem>; 1]>, + foreign_items: SmallVec<[P<ast::ForeignItem>; 1]>, stmts: SmallVec<[ast::Stmt; 1]>, ty: P<ast::Ty>, } @@ -486,15 +486,15 @@ impl MacResult for MacEager { self.items } - fn make_impl_items(self: Box<Self>) -> Option<SmallVec<[ast::AssocItem; 1]>> { + fn make_impl_items(self: Box<Self>) -> Option<SmallVec<[P<ast::AssocItem>; 1]>> { self.impl_items } - fn make_trait_items(self: Box<Self>) -> Option<SmallVec<[ast::AssocItem; 1]>> { + fn make_trait_items(self: Box<Self>) -> Option<SmallVec<[P<ast::AssocItem>; 1]>> { self.trait_items } - fn make_foreign_items(self: Box<Self>) -> Option<SmallVec<[ast::ForeignItem; 1]>> { + fn make_foreign_items(self: Box<Self>) -> Option<SmallVec<[P<ast::ForeignItem>; 1]>> { self.foreign_items } @@ -586,15 +586,15 @@ impl MacResult for DummyResult { Some(SmallVec::new()) } - fn make_impl_items(self: Box<DummyResult>) -> Option<SmallVec<[ast::AssocItem; 1]>> { + fn make_impl_items(self: Box<DummyResult>) -> Option<SmallVec<[P<ast::AssocItem>; 1]>> { Some(SmallVec::new()) } - fn make_trait_items(self: Box<DummyResult>) -> Option<SmallVec<[ast::AssocItem; 1]>> { + fn make_trait_items(self: Box<DummyResult>) -> Option<SmallVec<[P<ast::AssocItem>; 1]>> { Some(SmallVec::new()) } - fn make_foreign_items(self: Box<Self>) -> Option<SmallVec<[ast::ForeignItem; 1]>> { + fn make_foreign_items(self: Box<Self>) -> Option<SmallVec<[P<ast::ForeignItem>; 1]>> { Some(SmallVec::new()) } diff --git a/src/librustc_expand/expand.rs b/src/librustc_expand/expand.rs index f915f44c17a..ea459064b09 100644 --- a/src/librustc_expand/expand.rs +++ b/src/librustc_expand/expand.rs @@ -152,13 +152,13 @@ ast_fragments! { Items(SmallVec<[P<ast::Item>; 1]>) { "item"; many fn flat_map_item; fn visit_item; fn make_items; } - TraitItems(SmallVec<[ast::AssocItem; 1]>) { + TraitItems(SmallVec<[P<ast::AssocItem>; 1]>) { "trait item"; many fn flat_map_trait_item; fn visit_trait_item; fn make_trait_items; } - ImplItems(SmallVec<[ast::AssocItem; 1]>) { + ImplItems(SmallVec<[P<ast::AssocItem>; 1]>) { "impl item"; many fn flat_map_impl_item; fn visit_impl_item; fn make_impl_items; } - ForeignItems(SmallVec<[ast::ForeignItem; 1]>) { + ForeignItems(SmallVec<[P<ast::ForeignItem>; 1]>) { "foreign item"; many fn flat_map_foreign_item; fn visit_foreign_item; @@ -554,15 +554,15 @@ impl<'a, 'b> MacroExpander<'a, 'b> { // we know that fold result vector will contain exactly one element match item { Annotatable::Item(item) => Annotatable::Item(cfg.flat_map_item(item).pop().unwrap()), - Annotatable::TraitItem(item) => Annotatable::TraitItem( - item.map(|item| cfg.flat_map_trait_item(item).pop().unwrap()), - ), + Annotatable::TraitItem(item) => { + Annotatable::TraitItem(cfg.flat_map_trait_item(item).pop().unwrap()) + } Annotatable::ImplItem(item) => { - Annotatable::ImplItem(item.map(|item| cfg.flat_map_impl_item(item).pop().unwrap())) + Annotatable::ImplItem(cfg.flat_map_impl_item(item).pop().unwrap()) + } + Annotatable::ForeignItem(item) => { + Annotatable::ForeignItem(cfg.flat_map_foreign_item(item).pop().unwrap()) } - Annotatable::ForeignItem(item) => Annotatable::ForeignItem( - item.map(|item| cfg.flat_map_foreign_item(item).pop().unwrap()), - ), Annotatable::Stmt(stmt) => { Annotatable::Stmt(stmt.map(|stmt| cfg.flat_map_stmt(stmt).pop().unwrap())) } @@ -643,11 +643,9 @@ impl<'a, 'b> MacroExpander<'a, 'b> { let item_tok = TokenTree::token( token::Interpolated(Lrc::new(match item { Annotatable::Item(item) => token::NtItem(item), - Annotatable::TraitItem(item) => token::NtTraitItem(item.into_inner()), - Annotatable::ImplItem(item) => token::NtImplItem(item.into_inner()), - Annotatable::ForeignItem(item) => { - token::NtForeignItem(item.into_inner()) - } + Annotatable::TraitItem(item) => token::NtTraitItem(item), + Annotatable::ImplItem(item) => token::NtImplItem(item), + Annotatable::ForeignItem(item) => token::NtForeignItem(item), Annotatable::Stmt(stmt) => token::NtStmt(stmt.into_inner()), Annotatable::Expr(expr) => token::NtExpr(expr), Annotatable::Arm(..) @@ -1411,7 +1409,7 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> { } } - fn flat_map_trait_item(&mut self, item: ast::AssocItem) -> SmallVec<[ast::AssocItem; 1]> { + fn flat_map_trait_item(&mut self, item: P<ast::AssocItem>) -> SmallVec<[P<ast::AssocItem>; 1]> { let mut item = configure!(self, item); let (attr, traits, after_derive) = self.classify_item(&mut item); @@ -1420,7 +1418,7 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> { .collect_attr( attr, traits, - Annotatable::TraitItem(P(item)), + Annotatable::TraitItem(item), AstFragmentKind::TraitItems, after_derive, ) @@ -1428,16 +1426,20 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> { } match item.kind { - ast::AssocItemKind::Macro(mac) => { - let ast::AssocItem { attrs, span, .. } = item; - self.check_attributes(&attrs); - self.collect_bang(mac, span, AstFragmentKind::TraitItems).make_trait_items() + ast::AssocItemKind::Macro(..) => { + self.check_attributes(&item.attrs); + item.and_then(|item| match item.kind { + ast::AssocItemKind::Macro(mac) => self + .collect_bang(mac, item.span, AstFragmentKind::TraitItems) + .make_trait_items(), + _ => unreachable!(), + }) } _ => noop_flat_map_assoc_item(item, self), } } - fn flat_map_impl_item(&mut self, item: ast::AssocItem) -> SmallVec<[ast::AssocItem; 1]> { + fn flat_map_impl_item(&mut self, item: P<ast::AssocItem>) -> SmallVec<[P<ast::AssocItem>; 1]> { let mut item = configure!(self, item); let (attr, traits, after_derive) = self.classify_item(&mut item); @@ -1446,7 +1448,7 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> { .collect_attr( attr, traits, - Annotatable::ImplItem(P(item)), + Annotatable::ImplItem(item), AstFragmentKind::ImplItems, after_derive, ) @@ -1454,10 +1456,14 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> { } match item.kind { - ast::AssocItemKind::Macro(mac) => { - let ast::AssocItem { attrs, span, .. } = item; - self.check_attributes(&attrs); - self.collect_bang(mac, span, AstFragmentKind::ImplItems).make_impl_items() + ast::AssocItemKind::Macro(..) => { + self.check_attributes(&item.attrs); + item.and_then(|item| match item.kind { + ast::AssocItemKind::Macro(mac) => self + .collect_bang(mac, item.span, AstFragmentKind::ImplItems) + .make_impl_items(), + _ => unreachable!(), + }) } _ => noop_flat_map_assoc_item(item, self), } @@ -1482,8 +1488,8 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> { fn flat_map_foreign_item( &mut self, - mut foreign_item: ast::ForeignItem, - ) -> SmallVec<[ast::ForeignItem; 1]> { + mut foreign_item: P<ast::ForeignItem>, + ) -> SmallVec<[P<ast::ForeignItem>; 1]> { let (attr, traits, after_derive) = self.classify_item(&mut foreign_item); if attr.is_some() || !traits.is_empty() { @@ -1491,21 +1497,25 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> { .collect_attr( attr, traits, - Annotatable::ForeignItem(P(foreign_item)), + Annotatable::ForeignItem(foreign_item), AstFragmentKind::ForeignItems, after_derive, ) .make_foreign_items(); } - if let ast::ForeignItemKind::Macro(mac) = foreign_item.kind { - self.check_attributes(&foreign_item.attrs); - return self - .collect_bang(mac, foreign_item.span, AstFragmentKind::ForeignItems) - .make_foreign_items(); + match foreign_item.kind { + ast::ForeignItemKind::Macro(..) => { + self.check_attributes(&foreign_item.attrs); + foreign_item.and_then(|item| match item.kind { + ast::ForeignItemKind::Macro(mac) => self + .collect_bang(mac, item.span, AstFragmentKind::ForeignItems) + .make_foreign_items(), + _ => unreachable!(), + }) + } + _ => noop_flat_map_foreign_item(foreign_item, self), } - - noop_flat_map_foreign_item(foreign_item, self) } fn visit_item_kind(&mut self, item: &mut ast::ItemKind) { diff --git a/src/librustc_expand/placeholders.rs b/src/librustc_expand/placeholders.rs index 8b18a5dc4bb..6bcb8f45f00 100644 --- a/src/librustc_expand/placeholders.rs +++ b/src/librustc_expand/placeholders.rs @@ -51,7 +51,7 @@ pub fn placeholder( kind: ast::ItemKind::Mac(mac_placeholder()), tokens: None, })]), - AstFragmentKind::TraitItems => AstFragment::TraitItems(smallvec![ast::AssocItem { + AstFragmentKind::TraitItems => AstFragment::TraitItems(smallvec![P(ast::AssocItem { id, span, ident, @@ -61,8 +61,8 @@ pub fn placeholder( kind: ast::AssocItemKind::Macro(mac_placeholder()), defaultness: ast::Defaultness::Final, tokens: None, - }]), - AstFragmentKind::ImplItems => AstFragment::ImplItems(smallvec![ast::AssocItem { + })]), + AstFragmentKind::ImplItems => AstFragment::ImplItems(smallvec![P(ast::AssocItem { id, span, ident, @@ -72,16 +72,18 @@ pub fn placeholder( kind: ast::AssocItemKind::Macro(mac_placeholder()), defaultness: ast::Defaultness::Final, tokens: None, - }]), - AstFragmentKind::ForeignItems => AstFragment::ForeignItems(smallvec![ast::ForeignItem { - id, - span, - ident, - vis, - attrs, - kind: ast::ForeignItemKind::Macro(mac_placeholder()), - tokens: None, - }]), + })]), + AstFragmentKind::ForeignItems => { + AstFragment::ForeignItems(smallvec![P(ast::ForeignItem { + id, + span, + ident, + vis, + attrs, + kind: ast::ForeignItemKind::Macro(mac_placeholder()), + tokens: None, + })]) + } AstFragmentKind::Pat => { AstFragment::Pat(P(ast::Pat { id, span, kind: ast::PatKind::Mac(mac_placeholder()) })) } @@ -250,21 +252,24 @@ impl<'a, 'b> MutVisitor for PlaceholderExpander<'a, 'b> { noop_flat_map_item(item, self) } - fn flat_map_trait_item(&mut self, item: ast::AssocItem) -> SmallVec<[ast::AssocItem; 1]> { + fn flat_map_trait_item(&mut self, item: P<ast::AssocItem>) -> SmallVec<[P<ast::AssocItem>; 1]> { match item.kind { ast::AssocItemKind::Macro(_) => self.remove(item.id).make_trait_items(), _ => noop_flat_map_assoc_item(item, self), } } - fn flat_map_impl_item(&mut self, item: ast::AssocItem) -> SmallVec<[ast::AssocItem; 1]> { + fn flat_map_impl_item(&mut self, item: P<ast::AssocItem>) -> SmallVec<[P<ast::AssocItem>; 1]> { match item.kind { ast::AssocItemKind::Macro(_) => self.remove(item.id).make_impl_items(), _ => noop_flat_map_assoc_item(item, self), } } - fn flat_map_foreign_item(&mut self, item: ast::ForeignItem) -> SmallVec<[ast::ForeignItem; 1]> { + fn flat_map_foreign_item( + &mut self, + item: P<ast::ForeignItem>, + ) -> SmallVec<[P<ast::ForeignItem>; 1]> { match item.kind { ast::ForeignItemKind::Macro(_) => self.remove(item.id).make_foreign_items(), _ => noop_flat_map_foreign_item(item, self), |
