about summary refs log tree commit diff
diff options
context:
space:
mode:
authorklensy <klensy@users.noreply.github.com>2021-06-14 21:32:42 +0300
committerklensy <klensy@users.noreply.github.com>2021-07-01 18:01:37 +0300
commit2b57fc40d8ee59f6e2a6340a5700270c422525da (patch)
tree409ce90fbc4a40f6ef10485f259e85780c130baa
parenta216131c3566858b78f45ccc0c36b5578f5c5155 (diff)
downloadrust-2b57fc40d8ee59f6e2a6340a5700270c422525da.tar.gz
rust-2b57fc40d8ee59f6e2a6340a5700270c422525da.zip
rustc_mir: calc hex number length without string allocation
-rw-r--r--compiler/rustc_mir/src/util/pretty.rs22
1 files changed, 21 insertions, 1 deletions
diff --git a/compiler/rustc_mir/src/util/pretty.rs b/compiler/rustc_mir/src/util/pretty.rs
index c4e1e184ac5..e4625472a11 100644
--- a/compiler/rustc_mir/src/util/pretty.rs
+++ b/compiler/rustc_mir/src/util/pretty.rs
@@ -824,7 +824,7 @@ fn write_allocation_bytes<Tag: Copy + Debug, Extra>(
 ) -> std::fmt::Result {
     let num_lines = alloc.size().bytes_usize().saturating_sub(BYTES_PER_LINE);
     // Number of chars needed to represent all line numbers.
-    let pos_width = format!("{:x}", alloc.size().bytes()).len();
+    let pos_width = hex_number_length(alloc.size().bytes());
 
     if num_lines > 0 {
         write!(w, "{}0x{:02$x} │ ", prefix, 0, pos_width)?;
@@ -1023,3 +1023,23 @@ pub fn dump_mir_def_ids(tcx: TyCtxt<'_>, single: Option<DefId>) -> Vec<DefId> {
         tcx.mir_keys(()).iter().map(|def_id| def_id.to_def_id()).collect()
     }
 }
+
+/// Calc converted u64 decimal into hex and return it's length in chars
+///
+/// ```ignore (cannot-test-private-function)
+/// assert_eq!(1, hex_number_length(0));
+/// assert_eq!(1, hex_number_length(1));
+/// assert_eq!(2, hex_number_length(16));
+/// ```
+fn hex_number_length(x: u64) -> usize {
+    if x == 0 {
+        return 1;
+    }
+    let mut length = 0;
+    let mut x_left = x;
+    while x_left > 0 {
+        x_left /= 16;
+        length += 1;
+    }
+    length
+}