Skip to content

Commit

Permalink
Auto merge of #126591 - petrochenkov:upctxt5, r=<try>
Browse files Browse the repository at this point in the history
[perf] More span update benchmarking

#126544 (comment)
  • Loading branch information
bors committed Jun 17, 2024
2 parents 3baa20b + 7e4f176 commit 725e23c
Showing 1 changed file with 13 additions and 31 deletions.
44 changes: 13 additions & 31 deletions compiler/rustc_span/src/span_encoding.rs
Original file line number Diff line number Diff line change
Expand Up @@ -327,43 +327,25 @@ impl Span {
// interner and can fall back to `Span::new`.
#[inline]
pub fn map_ctxt(self, update: impl FnOnce(SyntaxContext) -> SyntaxContext) -> Span {
let (updated_ctxt32, data);
match_span_kind! {
self,
InlineCtxt(span) => {
updated_ctxt32 = update(SyntaxContext::from_u16(span.ctxt)).as_u32();
// Any small new context including zero will preserve the format.
if updated_ctxt32 <= MAX_CTXT {
return InlineCtxt::span(span.lo, span.len, updated_ctxt32 as u16);
}
data = span.data();
},
InlineParent(span) => {
updated_ctxt32 = update(SyntaxContext::root()).as_u32();
// Only if the new context is zero the format will be preserved.
if updated_ctxt32 == 0 {
// Do nothing.
return self;
}
data = span.data();
},
PartiallyInterned(span) => {
updated_ctxt32 = update(SyntaxContext::from_u16(span.ctxt)).as_u32();
// Any small new context excluding zero will preserve the format.
// Zero may change the format to `InlineParent` if parent and len are small enough.
if updated_ctxt32 <= MAX_CTXT && updated_ctxt32 != 0 {
return PartiallyInterned::span(span.index, updated_ctxt32 as u16);
}
data = span.data();
},
Interned(span) => {
data = span.data();
updated_ctxt32 = update(data.ctxt).as_u32();
let updated_ctxt32 = update(SyntaxContext::from_u16(span.ctxt)).as_u32();
// Any small new context including zero will preserve the format,
// any big new context will result in a fully interned format.
return if updated_ctxt32 <= MAX_CTXT {
InlineCtxt::span(span.lo, span.len, updated_ctxt32 as u16)
} else {
Interned::span(with_span_interner(|interner| interner.intern(&span.data())))
};
},
InlineParent(_span) => {},
PartiallyInterned(_span) => {},
Interned(_span) => {},
}

// We could not keep the span in the same inline format, fall back to the complete logic.
data.with_ctxt(SyntaxContext::from_u32(updated_ctxt32))
let data = self.data_untracked();
data.with_ctxt(update(data.ctxt))
}

// Returns either syntactic context, if it can be retrieved without taking the interner lock,
Expand Down

0 comments on commit 725e23c

Please sign in to comment.