about summary refs log tree commit diff
path: root/compiler/rustc_span/src/lib.rs
diff options
context:
space:
mode:
authorMartin Gammelsæter <martin@mg.am>2022-04-12 16:31:03 +0200
committerMartin Gammelsæter <martin@mg.am>2022-04-12 17:29:22 +0200
commit2b14529a7cc106d5d808529cd14d71aa158c7789 (patch)
tree7e7473ae17cfd6a6251e1510b14e211961c26a21 /compiler/rustc_span/src/lib.rs
parent4e1927db3c399fa34dc71992bd5dbec09f945c3d (diff)
downloadrust-2b14529a7cc106d5d808529cd14d71aa158c7789.tar.gz
rust-2b14529a7cc106d5d808529cd14d71aa158c7789.zip
Optimize line offset parsing in <SourceFile as Decodable>::decode
By inverting parsing loop, avoiding continually re-checking bytes_per_diff.
Diffstat (limited to 'compiler/rustc_span/src/lib.rs')
-rw-r--r--compiler/rustc_span/src/lib.rs31
1 files changed, 20 insertions, 11 deletions
diff --git a/compiler/rustc_span/src/lib.rs b/compiler/rustc_span/src/lib.rs
index 5232c8d7006..68401d5ca7c 100644
--- a/compiler/rustc_span/src/lib.rs
+++ b/compiler/rustc_span/src/lib.rs
@@ -1318,17 +1318,26 @@ impl<D: Decoder> Decodable<D> for SourceFile {
                 let mut line_start: BytePos = Decodable::decode(d);
                 lines.push(line_start);
 
-                for _ in 1..num_lines {
-                    let diff = match bytes_per_diff {
-                        1 => d.read_u8() as u32,
-                        2 => d.read_u16() as u32,
-                        4 => d.read_u32(),
-                        _ => unreachable!(),
-                    };
-
-                    line_start = line_start + BytePos(diff);
-
-                    lines.push(line_start);
+                match bytes_per_diff {
+                    1 => {
+                        for _ in 1..num_lines {
+                            line_start = line_start + BytePos(d.read_u8() as u32);
+                            lines.push(line_start);
+                        }
+                    }
+                    2 => {
+                        for _ in 1..num_lines {
+                            line_start = line_start + BytePos(d.read_u16() as u32);
+                            lines.push(line_start);
+                        }
+                    }
+                    4 => {
+                        for _ in 1..num_lines {
+                            line_start = line_start + BytePos(d.read_u32());
+                            lines.push(line_start);
+                        }
+                    }
+                    _ => unreachable!(),
                 }
             }