From 3d8056675fde11fba98dc2a6b3fa7dc5db1a7172 Mon Sep 17 00:00:00 2001 From: Joshua Nelson Date: Sat, 12 Dec 2020 10:21:26 -0500 Subject: [PATCH 1/3] Box `ItemKind::Impl` to shrink the size of Item --- src/librustdoc/clean/auto_trait.rs | 2 +- src/librustdoc/clean/blanket_impl.rs | 2 +- src/librustdoc/clean/inline.rs | 2 +- src/librustdoc/clean/mod.rs | 2 +- src/librustdoc/clean/types.rs | 4 +++- src/librustdoc/json/conversions.rs | 2 +- src/librustdoc/passes/collect_trait_impls.rs | 4 ++-- 7 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/librustdoc/clean/auto_trait.rs b/src/librustdoc/clean/auto_trait.rs index 7a61a169c2bd..d01677acdd62 100644 --- a/src/librustdoc/clean/auto_trait.rs +++ b/src/librustdoc/clean/auto_trait.rs @@ -126,7 +126,7 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> { stability: None, const_stability: None, deprecation: None, - kind: ImplItem(Impl { + kind: ImplItem(box Impl { unsafety: hir::Unsafety::Normal, generics: new_generics, provided_trait_methods: Default::default(), diff --git a/src/librustdoc/clean/blanket_impl.rs b/src/librustdoc/clean/blanket_impl.rs index 33b5e84c5e07..e41ed79a0cf8 100644 --- a/src/librustdoc/clean/blanket_impl.rs +++ b/src/librustdoc/clean/blanket_impl.rs @@ -115,7 +115,7 @@ impl<'a, 'tcx> BlanketImplFinder<'a, 'tcx> { stability: None, const_stability: None, deprecation: None, - kind: ImplItem(Impl { + kind: ImplItem(box Impl { unsafety: hir::Unsafety::Normal, generics: ( self.cx.tcx.generics_of(impl_def_id), diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index f7b6553a9359..8aa8267a0ff3 100644 --- a/src/librustdoc/clean/inline.rs +++ b/src/librustdoc/clean/inline.rs @@ -435,7 +435,7 @@ crate fn build_impl( let mut item = clean::Item::from_def_id_and_parts( did, None, - clean::ImplItem(clean::Impl { + clean::ImplItem(box clean::Impl { unsafety: hir::Unsafety::Normal, generics, provided_trait_methods: provided, diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index 1a63a5092ca0..ad05b3f92528 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -2088,7 +2088,7 @@ fn clean_impl(impl_: &hir::Item<'_>, cx: &DocContext<'_>) -> Vec { _ => None, }); let make_item = |trait_: Option, for_: Type, items: Vec| { - let kind = ImplItem(Impl { + let kind = ImplItem(box Impl { unsafety, generics: generics.clean(cx), provided_trait_methods: provided.clone(), diff --git a/src/librustdoc/clean/types.rs b/src/librustdoc/clean/types.rs index 0228d63ac00e..b303c20bacac 100644 --- a/src/librustdoc/clean/types.rs +++ b/src/librustdoc/clean/types.rs @@ -313,7 +313,9 @@ crate enum ItemKind { ConstantItem(Constant), TraitItem(Trait), TraitAliasItem(TraitAlias), - ImplItem(Impl), + // Impl is 400 bytes (!!), so box it to avoid penalizing other items + // FIXME(jyn514): calculate this information on demand instead + ImplItem(Box), /// A method signature only. Used for required methods in traits (ie, /// non-default-methods). TyMethodItem(Function), diff --git a/src/librustdoc/json/conversions.rs b/src/librustdoc/json/conversions.rs index c463481db86d..7b411fa2ef18 100644 --- a/src/librustdoc/json/conversions.rs +++ b/src/librustdoc/json/conversions.rs @@ -175,7 +175,7 @@ impl From for ItemEnum { TraitAliasItem(t) => ItemEnum::TraitAliasItem(t.into()), MethodItem(m, _) => ItemEnum::MethodItem(m.into()), TyMethodItem(m) => ItemEnum::MethodItem(m.into()), - ImplItem(i) => ItemEnum::ImplItem(i.into()), + ImplItem(box i) => ItemEnum::ImplItem(i.into()), StaticItem(s) => ItemEnum::StaticItem(s.into()), ForeignStaticItem(s) => ItemEnum::StaticItem(s.into()), ForeignTypeItem => ItemEnum::ForeignTypeItem, diff --git a/src/librustdoc/passes/collect_trait_impls.rs b/src/librustdoc/passes/collect_trait_impls.rs index 1e9bc67de04b..16aeb4495754 100644 --- a/src/librustdoc/passes/collect_trait_impls.rs +++ b/src/librustdoc/passes/collect_trait_impls.rs @@ -56,7 +56,7 @@ crate fn collect_trait_impls(krate: Crate, cx: &DocContext<'_>) -> Crate { // scan through included items ahead of time to splice in Deref targets to the "valid" sets for it in &new_items { - if let ImplItem(Impl { ref for_, ref trait_, ref items, .. }) = it.kind { + if let ImplItem(box Impl { ref for_, ref trait_, ref items, .. }) = it.kind { if cleaner.keep_item(for_) && trait_.def_id() == cx.tcx.lang_items().deref_trait() { let target = items .iter() @@ -76,7 +76,7 @@ crate fn collect_trait_impls(krate: Crate, cx: &DocContext<'_>) -> Crate { } new_items.retain(|it| { - if let ImplItem(Impl { ref for_, ref trait_, ref blanket_impl, .. }) = it.kind { + if let ImplItem(box Impl { ref for_, ref trait_, ref blanket_impl, .. }) = it.kind { cleaner.keep_item(for_) || trait_.as_ref().map_or(false, |t| cleaner.keep_item(t)) || blanket_impl.is_some() From 0b82a25d3cecc907989b4fbcd1664e46cfc5fc10 Mon Sep 17 00:00:00 2001 From: Joshua Nelson Date: Sat, 12 Dec 2020 11:00:44 -0500 Subject: [PATCH 2/3] Box `Function` to reduce the size of `ItemKind` --- src/librustdoc/clean/inline.rs | 4 ++-- src/librustdoc/clean/mod.rs | 16 ++++++++-------- src/librustdoc/clean/types.rs | 8 ++++---- src/librustdoc/json/conversions.rs | 8 ++++---- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index 8aa8267a0ff3..a8d5fff83d44 100644 --- a/src/librustdoc/clean/inline.rs +++ b/src/librustdoc/clean/inline.rs @@ -62,7 +62,7 @@ crate fn try_inline( } Res::Def(DefKind::Fn, did) => { record_extern_fqn(cx, did, clean::TypeKind::Function); - clean::FunctionItem(build_external_function(cx, did)) + clean::FunctionItem(box build_external_function(cx, did)) } Res::Def(DefKind::Struct, did) => { record_extern_fqn(cx, did, clean::TypeKind::Struct); @@ -77,7 +77,7 @@ crate fn try_inline( Res::Def(DefKind::TyAlias, did) => { record_extern_fqn(cx, did, clean::TypeKind::Typedef); ret.extend(build_impls(cx, Some(parent_module), did, attrs)); - clean::TypedefItem(build_type_alias(cx, did), false) + clean::TypedefItem(box build_type_alias(cx, did), false) } Res::Def(DefKind::Enum, did) => { record_extern_fqn(cx, did, clean::TypeKind::Enum); diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index ad05b3f92528..339463aa66ce 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -919,7 +919,7 @@ fn clean_fn_or_proc_macro( } else { hir::Constness::NotConst }; - FunctionItem(func) + FunctionItem(box func) } } } @@ -1076,7 +1076,7 @@ impl Clean for hir::TraitItem<'_> { { m.header.constness = hir::Constness::NotConst; } - MethodItem(m, None) + MethodItem(box m, None) } hir::TraitItemKind::Fn(ref sig, hir::TraitFn::Required(ref names)) => { let (generics, decl) = enter_impl_trait(cx, || { @@ -1090,7 +1090,7 @@ impl Clean for hir::TraitItem<'_> { { t.header.constness = hir::Constness::NotConst; } - TyMethodItem(t) + TyMethodItem(box t) } hir::TraitItemKind::Type(ref bounds, ref default) => { AssocTypeItem(bounds.clean(cx), default.clean(cx)) @@ -1116,12 +1116,12 @@ impl Clean for hir::ImplItem<'_> { { m.header.constness = hir::Constness::NotConst; } - MethodItem(m, Some(self.defaultness)) + MethodItem(box m, Some(self.defaultness)) } hir::ImplItemKind::TyAlias(ref ty) => { let type_ = ty.clean(cx); let item_type = type_.def_id().and_then(|did| inline::build_ty(cx, did)); - TypedefItem(Typedef { type_, generics: Generics::default(), item_type }, true) + TypedefItem(box Typedef { type_, generics: Generics::default(), item_type }, true) } }; Item::from_def_id_and_parts(local_did, Some(self.ident.name.clean(cx)), inner, cx) @@ -1185,7 +1185,7 @@ impl Clean for ty::AssocItem { ty::TraitContainer(_) => None, }; MethodItem( - Function { + box Function { generics, decl, header: hir::FnHeader { @@ -1200,7 +1200,7 @@ impl Clean for ty::AssocItem { defaultness, ) } else { - TyMethodItem(Function { + TyMethodItem(box Function { generics, decl, header: hir::FnHeader { @@ -2263,7 +2263,7 @@ impl Clean for (&hir::ForeignItem<'_>, Option) { (generics.clean(cx), (&**decl, &names[..]).clean(cx)) }); let (all_types, ret_types) = get_all_types(&generics, &decl, cx); - ForeignFunctionItem(Function { + ForeignFunctionItem(box Function { decl, generics, header: hir::FnHeader { diff --git a/src/librustdoc/clean/types.rs b/src/librustdoc/clean/types.rs index b303c20bacac..7c685e9e2b33 100644 --- a/src/librustdoc/clean/types.rs +++ b/src/librustdoc/clean/types.rs @@ -305,7 +305,7 @@ crate enum ItemKind { StructItem(Struct), UnionItem(Union), EnumItem(Enum), - FunctionItem(Function), + FunctionItem(Box), ModuleItem(Module), TypedefItem(Typedef, bool /* is associated type */), OpaqueTyItem(OpaqueTy), @@ -318,13 +318,13 @@ crate enum ItemKind { ImplItem(Box), /// A method signature only. Used for required methods in traits (ie, /// non-default-methods). - TyMethodItem(Function), + TyMethodItem(Box), /// A method with a body. - MethodItem(Function, Option), + MethodItem(Box, Option), StructFieldItem(Type), VariantItem(Variant), /// `fn`s from an extern block - ForeignFunctionItem(Function), + ForeignFunctionItem(Box), /// `static`s from an extern block ForeignStaticItem(Static), /// `type`s from an extern block diff --git a/src/librustdoc/json/conversions.rs b/src/librustdoc/json/conversions.rs index 7b411fa2ef18..9fa8428af5dc 100644 --- a/src/librustdoc/json/conversions.rs +++ b/src/librustdoc/json/conversions.rs @@ -169,12 +169,12 @@ impl From for ItemEnum { StructFieldItem(f) => ItemEnum::StructFieldItem(f.into()), EnumItem(e) => ItemEnum::EnumItem(e.into()), VariantItem(v) => ItemEnum::VariantItem(v.into()), - FunctionItem(f) => ItemEnum::FunctionItem(f.into()), - ForeignFunctionItem(f) => ItemEnum::FunctionItem(f.into()), + FunctionItem(box f) => ItemEnum::FunctionItem(f.into()), + ForeignFunctionItem(box f) => ItemEnum::FunctionItem(f.into()), TraitItem(t) => ItemEnum::TraitItem(t.into()), TraitAliasItem(t) => ItemEnum::TraitAliasItem(t.into()), - MethodItem(m, _) => ItemEnum::MethodItem(m.into()), - TyMethodItem(m) => ItemEnum::MethodItem(m.into()), + MethodItem(box m, _) => ItemEnum::MethodItem(m.into()), + TyMethodItem(box m) => ItemEnum::MethodItem(m.into()), ImplItem(box i) => ItemEnum::ImplItem(i.into()), StaticItem(s) => ItemEnum::StaticItem(s.into()), ForeignStaticItem(s) => ItemEnum::StaticItem(s.into()), From 32b2b429499cbfad144ac28ca831dc71c8f980b4 Mon Sep 17 00:00:00 2001 From: Joshua Nelson Date: Sat, 12 Dec 2020 11:01:19 -0500 Subject: [PATCH 3/3] Box Typedef to reduce the size of ItemKind --- src/librustdoc/clean/mod.rs | 4 ++-- src/librustdoc/clean/types.rs | 2 +- src/librustdoc/html/render/mod.rs | 4 ++-- src/librustdoc/json/conversions.rs | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index 339463aa66ce..f49ae9030141 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -1270,7 +1270,7 @@ impl Clean for ty::AssocItem { let type_ = cx.tcx.type_of(self.def_id).clean(cx); let item_type = type_.def_id().and_then(|did| inline::build_ty(cx, did)); TypedefItem( - Typedef { + box Typedef { type_, generics: Generics { params: Vec::new(), where_predicates: Vec::new() }, item_type, @@ -1981,7 +1981,7 @@ impl Clean> for (&hir::Item<'_>, Option) { let rustdoc_ty = ty.clean(cx); let item_type = rustdoc_ty.def_id().and_then(|did| inline::build_ty(cx, did)); TypedefItem( - Typedef { type_: rustdoc_ty, generics: generics.clean(cx), item_type }, + box Typedef { type_: rustdoc_ty, generics: generics.clean(cx), item_type }, false, ) } diff --git a/src/librustdoc/clean/types.rs b/src/librustdoc/clean/types.rs index 7c685e9e2b33..cbb4d5dfd6c8 100644 --- a/src/librustdoc/clean/types.rs +++ b/src/librustdoc/clean/types.rs @@ -307,7 +307,7 @@ crate enum ItemKind { EnumItem(Enum), FunctionItem(Box), ModuleItem(Module), - TypedefItem(Typedef, bool /* is associated type */), + TypedefItem(Box, bool /* is associated type */), OpaqueTyItem(OpaqueTy), StaticItem(Static), ConstantItem(Constant), diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs index db04624dca84..d875bdca8ad1 100644 --- a/src/librustdoc/html/render/mod.rs +++ b/src/librustdoc/html/render/mod.rs @@ -3559,7 +3559,7 @@ fn render_deref_methods( .items .iter() .find_map(|item| match item.kind { - clean::TypedefItem(ref t, true) => Some(match *t { + clean::TypedefItem(ref t, true) => Some(match **t { clean::Typedef { item_type: Some(ref type_), .. } => (type_, &t.type_), _ => (&t.type_, &t.type_), }), @@ -4237,7 +4237,7 @@ fn sidebar_assoc_items(it: &clean::Item) -> String { { if let Some((target, real_target)) = impl_.inner_impl().items.iter().find_map(|item| match item.kind { - clean::TypedefItem(ref t, true) => Some(match *t { + clean::TypedefItem(ref t, true) => Some(match **t { clean::Typedef { item_type: Some(ref type_), .. } => (type_, &t.type_), _ => (&t.type_, &t.type_), }), diff --git a/src/librustdoc/json/conversions.rs b/src/librustdoc/json/conversions.rs index 9fa8428af5dc..1a4bd0b6916d 100644 --- a/src/librustdoc/json/conversions.rs +++ b/src/librustdoc/json/conversions.rs @@ -179,7 +179,7 @@ impl From for ItemEnum { StaticItem(s) => ItemEnum::StaticItem(s.into()), ForeignStaticItem(s) => ItemEnum::StaticItem(s.into()), ForeignTypeItem => ItemEnum::ForeignTypeItem, - TypedefItem(t, _) => ItemEnum::TypedefItem(t.into()), + TypedefItem(box t, _) => ItemEnum::TypedefItem(t.into()), OpaqueTyItem(t) => ItemEnum::OpaqueTyItem(t.into()), ConstantItem(c) => ItemEnum::ConstantItem(c.into()), MacroItem(m) => ItemEnum::MacroItem(m.source),