Skip to content

Commit

Permalink
Auto merge of rust-lang#97386 - nnethercote:optimize-pos-adjustments,…
Browse files Browse the repository at this point in the history
… r=bjorn3

Optimize position adjustments

A small improvement.

r? `@bjorn3`
  • Loading branch information
bors committed May 26, 2022
2 parents 490324f + 2b91c40 commit b2c9872
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 30 deletions.
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 @@ -1565,10 +1565,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 @@ -1605,24 +1605,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

0 comments on commit b2c9872

Please sign in to comment.