diff options
| author | Nicholas Nethercote <n.nethercote@gmail.com> | 2022-05-25 14:01:18 +1000 |
|---|---|---|
| committer | Nicholas Nethercote <n.nethercote@gmail.com> | 2022-05-26 08:56:49 +1000 |
| commit | 2b91c40c19e51b694ec113fd6991cf59959d4046 (patch) | |
| tree | b32895c88922e4f2e7216209de60f46aa07cc7ff /compiler/rustc_span/src/source_map.rs | |
| parent | 3e810c64d091112cf8ac51a533068632fad30a8d (diff) | |
| download | rust-2b91c40c19e51b694ec113fd6991cf59959d4046.tar.gz rust-2b91c40c19e51b694ec113fd6991cf59959d4046.zip | |
Avoid adjusting file positions twice.
`imported_source_files` adjusts lots of file positions, and then calls `new_imported_source_file`, which then adjust them all again. This commit combines the two adjustments into one, for a small perf win.
Diffstat (limited to 'compiler/rustc_span/src/source_map.rs')
| -rw-r--r-- | compiler/rustc_span/src/source_map.rs | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/compiler/rustc_span/src/source_map.rs b/compiler/rustc_span/src/source_map.rs index 020ae3ad0c7..d60b4d3d021 100644 --- a/compiler/rustc_span/src/source_map.rs +++ b/compiler/rustc_span/src/source_map.rs @@ -345,20 +345,27 @@ impl SourceMap { let end_pos = Pos::from_usize(start_pos + source_len); let start_pos = Pos::from_usize(start_pos); + // Translate these positions into the new global frame of reference, + // now that the offset of the SourceFile is known. + // + // These are all unsigned values. `original_start_pos` may be larger or + // smaller than `start_pos`, but `pos` is always larger than both. + // Therefore, `(pos - original_start_pos) + start_pos` won't overflow + // but `start_pos - original_start_pos` might. So we use the former + // form rather than pre-computing the offset into a local variable. The + // compiler backend can optimize away the repeated computations in a + // way that won't trigger overflow checks. for pos in &mut file_local_lines { - *pos = *pos + start_pos; + *pos = (*pos - original_start_pos) + start_pos; } - for mbc in &mut file_local_multibyte_chars { - mbc.pos = mbc.pos + start_pos; + mbc.pos = (mbc.pos - original_start_pos) + start_pos; } - for swc in &mut file_local_non_narrow_chars { - *swc = *swc + start_pos; + *swc = (*swc - original_start_pos) + start_pos; } - for nc in &mut file_local_normalized_pos { - nc.pos = nc.pos + start_pos; + nc.pos = (nc.pos - original_start_pos) + start_pos; } let source_file = Lrc::new(SourceFile { |
