From 2b14529a7cc106d5d808529cd14d71aa158c7789 Mon Sep 17 00:00:00 2001 From: Martin Gammelsæter Date: Tue, 12 Apr 2022 16:31:03 +0200 Subject: Optimize line offset parsing in ::decode By inverting parsing loop, avoiding continually re-checking bytes_per_diff. --- compiler/rustc_span/src/lib.rs | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) (limited to 'compiler/rustc_span/src/lib.rs') 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 Decodable 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!(), } } -- cgit 1.4.1-3-g733a5