Skip to content

Commit 38b01d9

Browse files
committed
Auto merge of #90391 - camelid:crate-size, r=jyn514
rustdoc: Compute some fields of `clean::Crate` on-demand to reduce size `clean::Crate` is frequently moved by-value -- for example, in `DocFolder` implementations -- so reducing its size should improve performance. This PR reduces the size of `clean::Crate` from 168 bytes to 104 bytes. r? `@jyn514`
2 parents 0a09858 + a58e214 commit 38b01d9

File tree

6 files changed

+31
-20
lines changed

6 files changed

+31
-20
lines changed

src/librustdoc/clean/types.rs

+17-2
Original file line numberDiff line numberDiff line change
@@ -113,10 +113,9 @@ impl From<DefId> for ItemId {
113113
}
114114
}
115115

116+
/// The crate currently being documented.
116117
#[derive(Clone, Debug)]
117118
crate struct Crate {
118-
crate name: Symbol,
119-
crate src: FileName,
120119
crate module: Item,
121120
crate externs: Vec<ExternalCrate>,
122121
crate primitives: ThinVec<(DefId, PrimitiveType)>,
@@ -125,6 +124,20 @@ crate struct Crate {
125124
crate collapsed: bool,
126125
}
127126

127+
// `Crate` is frequently moved by-value. Make sure it doesn't unintentionally get bigger.
128+
#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
129+
rustc_data_structures::static_assert_size!(Crate, 104);
130+
131+
impl Crate {
132+
crate fn name(&self, tcx: TyCtxt<'_>) -> Symbol {
133+
ExternalCrate::LOCAL.name(tcx)
134+
}
135+
136+
crate fn src(&self, tcx: TyCtxt<'_>) -> FileName {
137+
ExternalCrate::LOCAL.src(tcx)
138+
}
139+
}
140+
128141
/// This struct is used to wrap additional information added by rustdoc on a `trait` item.
129142
#[derive(Clone, Debug)]
130143
crate struct TraitWithExtraInfo {
@@ -138,6 +151,8 @@ crate struct ExternalCrate {
138151
}
139152

140153
impl ExternalCrate {
154+
const LOCAL: Self = Self { crate_num: LOCAL_CRATE };
155+
141156
#[inline]
142157
crate fn def_id(&self) -> DefId {
143158
DefId { krate: self.crate_num, index: CRATE_DEF_INDEX }

src/librustdoc/clean/utils.rs

+1-6
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,11 @@ crate fn krate(cx: &mut DocContext<'_>) -> Crate {
2929
let module = crate::visit_ast::RustdocVisitor::new(cx).visit();
3030

3131
let mut externs = Vec::new();
32-
for &cnum in cx.tcx.crates(()).iter() {
32+
for &cnum in cx.tcx.crates(()) {
3333
externs.push(ExternalCrate { crate_num: cnum });
3434
// Analyze doc-reachability for extern items
3535
LibEmbargoVisitor::new(cx).visit_lib(cnum);
3636
}
37-
externs.sort_unstable_by_key(|e| e.crate_num);
3837

3938
// Clean the crate, translating the entire librustc_ast AST to one that is
4039
// understood by rustdoc.
@@ -57,8 +56,6 @@ crate fn krate(cx: &mut DocContext<'_>) -> Crate {
5756
}
5857

5958
let local_crate = ExternalCrate { crate_num: LOCAL_CRATE };
60-
let src = local_crate.src(cx.tcx);
61-
let name = local_crate.name(cx.tcx);
6259
let primitives = local_crate.primitives(cx.tcx);
6360
let keywords = local_crate.keywords(cx.tcx);
6461
{
@@ -80,8 +77,6 @@ crate fn krate(cx: &mut DocContext<'_>) -> Crate {
8077
}
8178

8279
Crate {
83-
name,
84-
src,
8580
module,
8681
externs,
8782
primitives,

src/librustdoc/html/render/cache.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ crate fn build_index<'tcx>(krate: &clean::Crate, cache: &mut Cache, tcx: TyCtxt<
172172
// Collect the index into a string
173173
format!(
174174
r#""{}":{}"#,
175-
krate.name,
175+
krate.name(tcx),
176176
serde_json::to_string(&CrateData {
177177
doc: crate_doc,
178178
items: crate_items,

src/librustdoc/html/render/context.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ impl<'tcx> FormatRenderer<'tcx> for Context<'tcx> {
408408
..
409409
} = options;
410410

411-
let src_root = match krate.src {
411+
let src_root = match krate.src(tcx) {
412412
FileName::Real(ref p) => match p.local_path_if_available().parent() {
413413
Some(p) => p.to_path_buf(),
414414
None => PathBuf::new(),
@@ -419,14 +419,14 @@ impl<'tcx> FormatRenderer<'tcx> for Context<'tcx> {
419419
let mut playground = None;
420420
if let Some(url) = playground_url {
421421
playground =
422-
Some(markdown::Playground { crate_name: Some(krate.name.to_string()), url });
422+
Some(markdown::Playground { crate_name: Some(krate.name(tcx).to_string()), url });
423423
}
424424
let mut layout = layout::Layout {
425425
logo: String::new(),
426426
favicon: String::new(),
427427
external_html,
428428
default_settings,
429-
krate: krate.name.to_string(),
429+
krate: krate.name(tcx).to_string(),
430430
css_file_extension: extension_css,
431431
generate_search_filter,
432432
scrape_examples_extension: !call_locations.is_empty(),
@@ -447,7 +447,7 @@ impl<'tcx> FormatRenderer<'tcx> for Context<'tcx> {
447447
}
448448
(sym::html_playground_url, Some(s)) => {
449449
playground = Some(markdown::Playground {
450-
crate_name: Some(krate.name.to_string()),
450+
crate_name: Some(krate.name(tcx).to_string()),
451451
url: s.to_string(),
452452
});
453453
}

src/librustdoc/html/render/write_shared.rs

+7-6
Original file line numberDiff line numberDiff line change
@@ -456,10 +456,10 @@ pub(super) fn write_shared(
456456
let dst = cx.dst.join(&format!("source-files{}.js", cx.shared.resource_suffix));
457457
let make_sources = || {
458458
let (mut all_sources, _krates) =
459-
try_err!(collect(&dst, &krate.name.as_str(), "sourcesIndex"), &dst);
459+
try_err!(collect(&dst, &krate.name(cx.tcx()).as_str(), "sourcesIndex"), &dst);
460460
all_sources.push(format!(
461461
"sourcesIndex[\"{}\"] = {};",
462-
&krate.name,
462+
&krate.name(cx.tcx()),
463463
hierarchy.to_json_string()
464464
));
465465
all_sources.sort();
@@ -474,9 +474,10 @@ pub(super) fn write_shared(
474474

475475
// Update the search index and crate list.
476476
let dst = cx.dst.join(&format!("search-index{}.js", cx.shared.resource_suffix));
477-
let (mut all_indexes, mut krates) = try_err!(collect_json(&dst, &krate.name.as_str()), &dst);
477+
let (mut all_indexes, mut krates) =
478+
try_err!(collect_json(&dst, &krate.name(cx.tcx()).as_str()), &dst);
478479
all_indexes.push(search_index);
479-
krates.push(krate.name.to_string());
480+
krates.push(krate.name(cx.tcx()).to_string());
480481
krates.sort();
481482

482483
// Sort the indexes by crate so the file will be generated identically even
@@ -600,7 +601,7 @@ pub(super) fn write_shared(
600601

601602
let implementors = format!(
602603
r#"implementors["{}"] = {};"#,
603-
krate.name,
604+
krate.name(cx.tcx()),
604605
serde_json::to_string(&implementors).unwrap()
605606
);
606607

@@ -612,7 +613,7 @@ pub(super) fn write_shared(
612613
mydst.push(&format!("{}.{}.js", remote_item_type, remote_path[remote_path.len() - 1]));
613614

614615
let (mut all_implementors, _) =
615-
try_err!(collect(&mydst, &krate.name.as_str(), "implementors"), &mydst);
616+
try_err!(collect(&mydst, &krate.name(cx.tcx()).as_str(), "implementors"), &mydst);
616617
all_implementors.push(implementors);
617618
// Sort the implementors by crate so the file will be generated
618619
// identically even with rustdoc running in parallel.

src/librustdoc/html/sources.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use std::path::{Component, Path, PathBuf};
1818

1919
crate fn render(cx: &mut Context<'_>, krate: clean::Crate) -> Result<clean::Crate, Error> {
2020
info!("emitting source files");
21-
let dst = cx.dst.join("src").join(&*krate.name.as_str());
21+
let dst = cx.dst.join("src").join(&*krate.name(cx.tcx()).as_str());
2222
cx.shared.ensure_dir(&dst)?;
2323
let mut folder = SourceCollector { dst, cx, emitted_local_sources: FxHashSet::default() };
2424
Ok(folder.fold_crate(krate))

0 commit comments

Comments
 (0)