Skip to content

Optimize position adjustments #97386

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 27, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 4 additions & 22 deletions compiler/rustc_metadata/src/rmeta/decoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1639,10 +1639,10 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
src_hash,
start_pos,
end_pos,
mut lines,
mut multibyte_chars,
mut non_narrow_chars,
mut normalized_pos,
lines,
multibyte_chars,
non_narrow_chars,
normalized_pos,
name_hash,
..
} = source_file_to_import;
Expand Down Expand Up @@ -1679,24 +1679,6 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {

let source_length = (end_pos - start_pos).to_usize();

// Translate line-start positions and multibyte character
// position into frame of reference local to file.
// `SourceMap::new_imported_source_file()` will then translate those
// coordinates to their new global frame of reference when the
// offset of the SourceFile is known.
for pos in &mut lines {
*pos = *pos - start_pos;
}
for mbc in &mut multibyte_chars {
mbc.pos = mbc.pos - start_pos;
}
for swc in &mut non_narrow_chars {
*swc = *swc - start_pos;
}
for np in &mut normalized_pos {
np.pos = np.pos - start_pos;
}

let local_version = sess.source_map().new_imported_source_file(
name,
src_hash,
Expand Down
4 changes: 3 additions & 1 deletion compiler/rustc_span/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1270,7 +1270,9 @@ impl<S: Encoder> Encodable<S> for SourceFile {
// the lines list is sorted and individual lines are
// probably not that long. Because of that we can store lines
// as a difference list, using as little space as possible
// for the differences.
// for the differences. But note that the first line is
// always encoded as a `BytePos` because its position is
// often much larger than any of the differences.
let max_line_length = if lines.len() == 1 {
0
} else {
Expand Down
21 changes: 14 additions & 7 deletions compiler/rustc_span/src/source_map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down