about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Howell <michael@notriddle.com>2022-08-05 08:56:09 -0700
committerMichael Howell <michael@notriddle.com>2022-08-05 08:56:09 -0700
commitdddc2fd6de3db11eeeb244e0ac5754c49f9ad11b (patch)
tree5c9ae2109fa07fa526ab6a1625a5a01b2225e002
parent513cf8664ab074d0fa540f1e1661193aeff0d358 (diff)
downloadrust-dddc2fd6de3db11eeeb244e0ac5754c49f9ad11b.tar.gz
rust-dddc2fd6de3db11eeeb244e0ac5754c49f9ad11b.zip
rustdoc: reduce the number of intermediate Strings allocated
-rw-r--r--src/librustdoc/html/format.rs2
-rw-r--r--src/librustdoc/html/render/write_shared.rs33
2 files changed, 22 insertions, 13 deletions
diff --git a/src/librustdoc/html/format.rs b/src/librustdoc/html/format.rs
index 36a47b05cb9..3dee4d1acc8 100644
--- a/src/librustdoc/html/format.rs
+++ b/src/librustdoc/html/format.rs
@@ -152,7 +152,7 @@ impl Buffer {
     }
 }
 
-fn comma_sep<T: fmt::Display>(
+pub(crate) fn comma_sep<T: fmt::Display>(
     items: impl Iterator<Item = T>,
     space_after_comma: bool,
 ) -> impl fmt::Display {
diff --git a/src/librustdoc/html/render/write_shared.rs b/src/librustdoc/html/render/write_shared.rs
index 246121bd7e3..0b0f5056019 100644
--- a/src/librustdoc/html/render/write_shared.rs
+++ b/src/librustdoc/html/render/write_shared.rs
@@ -1,4 +1,5 @@
 use std::ffi::OsStr;
+use std::fmt;
 use std::fs::{self, File};
 use std::io::prelude::*;
 use std::io::{self, BufReader};
@@ -563,7 +564,7 @@ if (typeof exports !== 'undefined') {exports.searchIndex = searchIndex};
         }
 
         impl Implementor {
-            fn to_js_string(&self) -> String {
+            fn to_js_string(&self) -> impl fmt::Display + '_ {
                 fn single_quote_string(s: &str) -> String {
                     let mut result = String::with_capacity(s.len() + 2);
                     result.push_str("'");
@@ -577,16 +578,21 @@ if (typeof exports !== 'undefined') {exports.searchIndex = searchIndex};
                     result.push_str("'");
                     result
                 }
-                let text_esc = single_quote_string(&self.text);
-                if self.synthetic {
-                    let types = self.types.iter().map(|type_| single_quote_string(type_)).join(",");
-                    // use `1` to represent a synthetic, because it's fewer bytes than `true`
-                    format!("[{text_esc},1,[{types}]]")
-                } else {
-                    // The types list is only used for synthetic impls.
-                    // If this changes, `main.js` and `write_shared.rs` both need changed.
-                    format!("[{text_esc}]")
-                }
+                crate::html::format::display_fn(|f| {
+                    let text_esc = single_quote_string(&self.text);
+                    if self.synthetic {
+                        let types = crate::html::format::comma_sep(
+                            self.types.iter().map(|type_| single_quote_string(type_)),
+                            false,
+                        );
+                        // use `1` to represent a synthetic, because it's fewer bytes than `true`
+                        write!(f, "[{text_esc},1,[{types}]]")
+                    } else {
+                        // The types list is only used for synthetic impls.
+                        // If this changes, `main.js` and `write_shared.rs` both need changed.
+                        write!(f, "[{text_esc}]")
+                    }
+                })
             }
         }
 
@@ -622,7 +628,10 @@ if (typeof exports !== 'undefined') {exports.searchIndex = searchIndex};
         let implementors = format!(
             r#""{}":[{}]"#,
             krate.name(cx.tcx()),
-            implementors.iter().map(Implementor::to_js_string).join(",")
+            crate::html::format::comma_sep(
+                implementors.iter().map(Implementor::to_js_string),
+                false
+            )
         );
 
         let mut mydst = dst.clone();