Skip to content

Commit b1cb3c0

Browse files
committed
Auto merge of #67340 - nnethercote:shrink-Nonterminal, r=petrochenkov
Shrink `Nonterminal` These commits shrink `Nonterminal` from 240 bytes to 40 bytes. When building `serde_derive` they reduce the number of `memcpy` calls from 9.6M to 7.4M, and it's a tiny win on a few other benchmarks. r? @petrochenkov
2 parents 266ecd6 + 7d2173e commit b1cb3c0

File tree

14 files changed

+144
-122
lines changed

14 files changed

+144
-122
lines changed

src/librustc_builtin_macros/deriving/generic/mod.rs

+8-7
Original file line numberDiff line numberDiff line change
@@ -531,13 +531,13 @@ impl<'a> TraitDef<'a> {
531531
type_ident: Ident,
532532
generics: &Generics,
533533
field_tys: Vec<P<ast::Ty>>,
534-
methods: Vec<ast::AssocItem>,
534+
methods: Vec<P<ast::AssocItem>>,
535535
) -> P<ast::Item> {
536536
let trait_path = self.path.to_path(cx, self.span, type_ident, generics);
537537

538538
// Transform associated types from `deriving::ty::Ty` into `ast::AssocItem`
539-
let associated_types =
540-
self.associated_types.iter().map(|&(ident, ref type_def)| ast::AssocItem {
539+
let associated_types = self.associated_types.iter().map(|&(ident, ref type_def)| {
540+
P(ast::AssocItem {
541541
id: ast::DUMMY_NODE_ID,
542542
span: self.span,
543543
ident,
@@ -550,7 +550,8 @@ impl<'a> TraitDef<'a> {
550550
Some(type_def.to_ty(cx, self.span, type_ident, generics)),
551551
),
552552
tokens: None,
553-
});
553+
})
554+
});
554555

555556
let Generics { mut params, mut where_clause, span } =
556557
self.generics.to_generics(cx, self.span, type_ident, generics);
@@ -938,7 +939,7 @@ impl<'a> MethodDef<'a> {
938939
explicit_self: Option<ast::ExplicitSelf>,
939940
arg_types: Vec<(Ident, P<ast::Ty>)>,
940941
body: P<Expr>,
941-
) -> ast::AssocItem {
942+
) -> P<ast::AssocItem> {
942943
// Create the generics that aren't for `Self`.
943944
let fn_generics = self.generics.to_generics(cx, trait_.span, type_ident, generics);
944945

@@ -968,7 +969,7 @@ impl<'a> MethodDef<'a> {
968969
};
969970

970971
// Create the method.
971-
ast::AssocItem {
972+
P(ast::AssocItem {
972973
id: ast::DUMMY_NODE_ID,
973974
attrs: self.attributes.clone(),
974975
generics: fn_generics,
@@ -978,7 +979,7 @@ impl<'a> MethodDef<'a> {
978979
ident: method_ident,
979980
kind: ast::AssocItemKind::Fn(sig, Some(body_block)),
980981
tokens: None,
981-
}
982+
})
982983
}
983984

984985
/// ```

src/librustc_expand/base.rs

+18-18
Original file line numberDiff line numberDiff line change
@@ -136,23 +136,23 @@ impl Annotatable {
136136
}
137137
}
138138

139-
pub fn expect_trait_item(self) -> ast::AssocItem {
139+
pub fn expect_trait_item(self) -> P<ast::AssocItem> {
140140
match self {
141-
Annotatable::TraitItem(i) => i.into_inner(),
141+
Annotatable::TraitItem(i) => i,
142142
_ => panic!("expected Item"),
143143
}
144144
}
145145

146-
pub fn expect_impl_item(self) -> ast::AssocItem {
146+
pub fn expect_impl_item(self) -> P<ast::AssocItem> {
147147
match self {
148-
Annotatable::ImplItem(i) => i.into_inner(),
148+
Annotatable::ImplItem(i) => i,
149149
_ => panic!("expected Item"),
150150
}
151151
}
152152

153-
pub fn expect_foreign_item(self) -> ast::ForeignItem {
153+
pub fn expect_foreign_item(self) -> P<ast::ForeignItem> {
154154
match self {
155-
Annotatable::ForeignItem(i) => i.into_inner(),
155+
Annotatable::ForeignItem(i) => i,
156156
_ => panic!("expected foreign item"),
157157
}
158158
}
@@ -382,17 +382,17 @@ pub trait MacResult {
382382
}
383383

384384
/// Creates zero or more impl items.
385-
fn make_impl_items(self: Box<Self>) -> Option<SmallVec<[ast::AssocItem; 1]>> {
385+
fn make_impl_items(self: Box<Self>) -> Option<SmallVec<[P<ast::AssocItem>; 1]>> {
386386
None
387387
}
388388

389389
/// Creates zero or more trait items.
390-
fn make_trait_items(self: Box<Self>) -> Option<SmallVec<[ast::AssocItem; 1]>> {
390+
fn make_trait_items(self: Box<Self>) -> Option<SmallVec<[P<ast::AssocItem>; 1]>> {
391391
None
392392
}
393393

394394
/// Creates zero or more items in an `extern {}` block
395-
fn make_foreign_items(self: Box<Self>) -> Option<SmallVec<[ast::ForeignItem; 1]>> {
395+
fn make_foreign_items(self: Box<Self>) -> Option<SmallVec<[P<ast::ForeignItem>; 1]>> {
396396
None
397397
}
398398

@@ -470,9 +470,9 @@ make_MacEager! {
470470
expr: P<ast::Expr>,
471471
pat: P<ast::Pat>,
472472
items: SmallVec<[P<ast::Item>; 1]>,
473-
impl_items: SmallVec<[ast::AssocItem; 1]>,
474-
trait_items: SmallVec<[ast::AssocItem; 1]>,
475-
foreign_items: SmallVec<[ast::ForeignItem; 1]>,
473+
impl_items: SmallVec<[P<ast::AssocItem>; 1]>,
474+
trait_items: SmallVec<[P<ast::AssocItem>; 1]>,
475+
foreign_items: SmallVec<[P<ast::ForeignItem>; 1]>,
476476
stmts: SmallVec<[ast::Stmt; 1]>,
477477
ty: P<ast::Ty>,
478478
}
@@ -486,15 +486,15 @@ impl MacResult for MacEager {
486486
self.items
487487
}
488488

489-
fn make_impl_items(self: Box<Self>) -> Option<SmallVec<[ast::AssocItem; 1]>> {
489+
fn make_impl_items(self: Box<Self>) -> Option<SmallVec<[P<ast::AssocItem>; 1]>> {
490490
self.impl_items
491491
}
492492

493-
fn make_trait_items(self: Box<Self>) -> Option<SmallVec<[ast::AssocItem; 1]>> {
493+
fn make_trait_items(self: Box<Self>) -> Option<SmallVec<[P<ast::AssocItem>; 1]>> {
494494
self.trait_items
495495
}
496496

497-
fn make_foreign_items(self: Box<Self>) -> Option<SmallVec<[ast::ForeignItem; 1]>> {
497+
fn make_foreign_items(self: Box<Self>) -> Option<SmallVec<[P<ast::ForeignItem>; 1]>> {
498498
self.foreign_items
499499
}
500500

@@ -586,15 +586,15 @@ impl MacResult for DummyResult {
586586
Some(SmallVec::new())
587587
}
588588

589-
fn make_impl_items(self: Box<DummyResult>) -> Option<SmallVec<[ast::AssocItem; 1]>> {
589+
fn make_impl_items(self: Box<DummyResult>) -> Option<SmallVec<[P<ast::AssocItem>; 1]>> {
590590
Some(SmallVec::new())
591591
}
592592

593-
fn make_trait_items(self: Box<DummyResult>) -> Option<SmallVec<[ast::AssocItem; 1]>> {
593+
fn make_trait_items(self: Box<DummyResult>) -> Option<SmallVec<[P<ast::AssocItem>; 1]>> {
594594
Some(SmallVec::new())
595595
}
596596

597-
fn make_foreign_items(self: Box<Self>) -> Option<SmallVec<[ast::ForeignItem; 1]>> {
597+
fn make_foreign_items(self: Box<Self>) -> Option<SmallVec<[P<ast::ForeignItem>; 1]>> {
598598
Some(SmallVec::new())
599599
}
600600

src/librustc_expand/expand.rs

+47-37
Original file line numberDiff line numberDiff line change
@@ -152,13 +152,13 @@ ast_fragments! {
152152
Items(SmallVec<[P<ast::Item>; 1]>) {
153153
"item"; many fn flat_map_item; fn visit_item; fn make_items;
154154
}
155-
TraitItems(SmallVec<[ast::AssocItem; 1]>) {
155+
TraitItems(SmallVec<[P<ast::AssocItem>; 1]>) {
156156
"trait item"; many fn flat_map_trait_item; fn visit_trait_item; fn make_trait_items;
157157
}
158-
ImplItems(SmallVec<[ast::AssocItem; 1]>) {
158+
ImplItems(SmallVec<[P<ast::AssocItem>; 1]>) {
159159
"impl item"; many fn flat_map_impl_item; fn visit_impl_item; fn make_impl_items;
160160
}
161-
ForeignItems(SmallVec<[ast::ForeignItem; 1]>) {
161+
ForeignItems(SmallVec<[P<ast::ForeignItem>; 1]>) {
162162
"foreign item";
163163
many fn flat_map_foreign_item;
164164
fn visit_foreign_item;
@@ -554,15 +554,15 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
554554
// we know that fold result vector will contain exactly one element
555555
match item {
556556
Annotatable::Item(item) => Annotatable::Item(cfg.flat_map_item(item).pop().unwrap()),
557-
Annotatable::TraitItem(item) => Annotatable::TraitItem(
558-
item.map(|item| cfg.flat_map_trait_item(item).pop().unwrap()),
559-
),
557+
Annotatable::TraitItem(item) => {
558+
Annotatable::TraitItem(cfg.flat_map_trait_item(item).pop().unwrap())
559+
}
560560
Annotatable::ImplItem(item) => {
561-
Annotatable::ImplItem(item.map(|item| cfg.flat_map_impl_item(item).pop().unwrap()))
561+
Annotatable::ImplItem(cfg.flat_map_impl_item(item).pop().unwrap())
562+
}
563+
Annotatable::ForeignItem(item) => {
564+
Annotatable::ForeignItem(cfg.flat_map_foreign_item(item).pop().unwrap())
562565
}
563-
Annotatable::ForeignItem(item) => Annotatable::ForeignItem(
564-
item.map(|item| cfg.flat_map_foreign_item(item).pop().unwrap()),
565-
),
566566
Annotatable::Stmt(stmt) => {
567567
Annotatable::Stmt(stmt.map(|stmt| cfg.flat_map_stmt(stmt).pop().unwrap()))
568568
}
@@ -643,11 +643,9 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
643643
let item_tok = TokenTree::token(
644644
token::Interpolated(Lrc::new(match item {
645645
Annotatable::Item(item) => token::NtItem(item),
646-
Annotatable::TraitItem(item) => token::NtTraitItem(item.into_inner()),
647-
Annotatable::ImplItem(item) => token::NtImplItem(item.into_inner()),
648-
Annotatable::ForeignItem(item) => {
649-
token::NtForeignItem(item.into_inner())
650-
}
646+
Annotatable::TraitItem(item) => token::NtTraitItem(item),
647+
Annotatable::ImplItem(item) => token::NtImplItem(item),
648+
Annotatable::ForeignItem(item) => token::NtForeignItem(item),
651649
Annotatable::Stmt(stmt) => token::NtStmt(stmt.into_inner()),
652650
Annotatable::Expr(expr) => token::NtExpr(expr),
653651
Annotatable::Arm(..)
@@ -1411,7 +1409,7 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> {
14111409
}
14121410
}
14131411

1414-
fn flat_map_trait_item(&mut self, item: ast::AssocItem) -> SmallVec<[ast::AssocItem; 1]> {
1412+
fn flat_map_trait_item(&mut self, item: P<ast::AssocItem>) -> SmallVec<[P<ast::AssocItem>; 1]> {
14151413
let mut item = configure!(self, item);
14161414

14171415
let (attr, traits, after_derive) = self.classify_item(&mut item);
@@ -1420,24 +1418,28 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> {
14201418
.collect_attr(
14211419
attr,
14221420
traits,
1423-
Annotatable::TraitItem(P(item)),
1421+
Annotatable::TraitItem(item),
14241422
AstFragmentKind::TraitItems,
14251423
after_derive,
14261424
)
14271425
.make_trait_items();
14281426
}
14291427

14301428
match item.kind {
1431-
ast::AssocItemKind::Macro(mac) => {
1432-
let ast::AssocItem { attrs, span, .. } = item;
1433-
self.check_attributes(&attrs);
1434-
self.collect_bang(mac, span, AstFragmentKind::TraitItems).make_trait_items()
1429+
ast::AssocItemKind::Macro(..) => {
1430+
self.check_attributes(&item.attrs);
1431+
item.and_then(|item| match item.kind {
1432+
ast::AssocItemKind::Macro(mac) => self
1433+
.collect_bang(mac, item.span, AstFragmentKind::TraitItems)
1434+
.make_trait_items(),
1435+
_ => unreachable!(),
1436+
})
14351437
}
14361438
_ => noop_flat_map_assoc_item(item, self),
14371439
}
14381440
}
14391441

1440-
fn flat_map_impl_item(&mut self, item: ast::AssocItem) -> SmallVec<[ast::AssocItem; 1]> {
1442+
fn flat_map_impl_item(&mut self, item: P<ast::AssocItem>) -> SmallVec<[P<ast::AssocItem>; 1]> {
14411443
let mut item = configure!(self, item);
14421444

14431445
let (attr, traits, after_derive) = self.classify_item(&mut item);
@@ -1446,18 +1448,22 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> {
14461448
.collect_attr(
14471449
attr,
14481450
traits,
1449-
Annotatable::ImplItem(P(item)),
1451+
Annotatable::ImplItem(item),
14501452
AstFragmentKind::ImplItems,
14511453
after_derive,
14521454
)
14531455
.make_impl_items();
14541456
}
14551457

14561458
match item.kind {
1457-
ast::AssocItemKind::Macro(mac) => {
1458-
let ast::AssocItem { attrs, span, .. } = item;
1459-
self.check_attributes(&attrs);
1460-
self.collect_bang(mac, span, AstFragmentKind::ImplItems).make_impl_items()
1459+
ast::AssocItemKind::Macro(..) => {
1460+
self.check_attributes(&item.attrs);
1461+
item.and_then(|item| match item.kind {
1462+
ast::AssocItemKind::Macro(mac) => self
1463+
.collect_bang(mac, item.span, AstFragmentKind::ImplItems)
1464+
.make_impl_items(),
1465+
_ => unreachable!(),
1466+
})
14611467
}
14621468
_ => noop_flat_map_assoc_item(item, self),
14631469
}
@@ -1482,30 +1488,34 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> {
14821488

14831489
fn flat_map_foreign_item(
14841490
&mut self,
1485-
mut foreign_item: ast::ForeignItem,
1486-
) -> SmallVec<[ast::ForeignItem; 1]> {
1491+
mut foreign_item: P<ast::ForeignItem>,
1492+
) -> SmallVec<[P<ast::ForeignItem>; 1]> {
14871493
let (attr, traits, after_derive) = self.classify_item(&mut foreign_item);
14881494

14891495
if attr.is_some() || !traits.is_empty() {
14901496
return self
14911497
.collect_attr(
14921498
attr,
14931499
traits,
1494-
Annotatable::ForeignItem(P(foreign_item)),
1500+
Annotatable::ForeignItem(foreign_item),
14951501
AstFragmentKind::ForeignItems,
14961502
after_derive,
14971503
)
14981504
.make_foreign_items();
14991505
}
15001506

1501-
if let ast::ForeignItemKind::Macro(mac) = foreign_item.kind {
1502-
self.check_attributes(&foreign_item.attrs);
1503-
return self
1504-
.collect_bang(mac, foreign_item.span, AstFragmentKind::ForeignItems)
1505-
.make_foreign_items();
1507+
match foreign_item.kind {
1508+
ast::ForeignItemKind::Macro(..) => {
1509+
self.check_attributes(&foreign_item.attrs);
1510+
foreign_item.and_then(|item| match item.kind {
1511+
ast::ForeignItemKind::Macro(mac) => self
1512+
.collect_bang(mac, item.span, AstFragmentKind::ForeignItems)
1513+
.make_foreign_items(),
1514+
_ => unreachable!(),
1515+
})
1516+
}
1517+
_ => noop_flat_map_foreign_item(foreign_item, self),
15061518
}
1507-
1508-
noop_flat_map_foreign_item(foreign_item, self)
15091519
}
15101520

15111521
fn visit_item_kind(&mut self, item: &mut ast::ItemKind) {

src/librustc_expand/mbe/macro_parser.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ use rustc_parse::Directory;
8181
use rustc_span::symbol::{kw, sym, Symbol};
8282
use syntax::ast::{Ident, Name};
8383
use syntax::print::pprust;
84+
use syntax::ptr::P;
8485
use syntax::sess::ParseSess;
8586
use syntax::token::{self, DocComment, Nonterminal, Token};
8687
use syntax::tokenstream::TokenStream;
@@ -914,7 +915,7 @@ fn parse_nt_inner<'a>(p: &mut Parser<'a>, sp: Span, name: Symbol) -> PResult<'a,
914915
}
915916
}
916917
sym::path => token::NtPath(p.parse_path(PathStyle::Type)?),
917-
sym::meta => token::NtMeta(p.parse_attr_item()?),
918+
sym::meta => token::NtMeta(P(p.parse_attr_item()?)),
918919
sym::vis => token::NtVis(p.parse_visibility(FollowedByType::Yes)?),
919920
sym::lifetime => {
920921
if p.check_lifetime() {

0 commit comments

Comments
 (0)