Skip to content

Commit dc807a9

Browse files
committed
Add walk_chain.
This combines multiple `HygieneData::with` calls on a hot path.
1 parent 6596743 commit dc807a9

File tree

2 files changed

+16
-8
lines changed

2 files changed

+16
-8
lines changed

src/librustc_codegen_ssa/mir/mod.rs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -128,14 +128,7 @@ impl<'a, 'tcx: 'a, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
128128
// Walk up the macro expansion chain until we reach a non-expanded span.
129129
// We also stop at the function body level because no line stepping can occur
130130
// at the level above that.
131-
let mut span = source_info.span;
132-
while span.ctxt() != NO_EXPANSION && span.ctxt() != self.mir.span.ctxt() {
133-
if let Some(info) = span.ctxt().outer_expn_info() {
134-
span = info.call_site;
135-
} else {
136-
break;
137-
}
138-
}
131+
let span = syntax_pos::hygiene::walk_chain(source_info.span, self.mir.span.ctxt());
139132
let scope = self.scope_metadata_for_loc(source_info.scope, span.lo());
140133
// Use span of the outermost expansion site, while keeping the original lexical scope.
141134
(scope, span)

src/libsyntax_pos/hygiene.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,17 @@ impl HygieneData {
257257
marks
258258
}
259259

260+
fn walk_chain(&self, mut span: Span, to: SyntaxContext) -> Span {
261+
while span.ctxt() != crate::NO_EXPANSION && span.ctxt() != to {
262+
if let Some(info) = self.expn_info(self.outer(span.ctxt())) {
263+
span = info.call_site;
264+
} else {
265+
break;
266+
}
267+
}
268+
span
269+
}
270+
260271
fn adjust(&self, ctxt: &mut SyntaxContext, expansion: Mark) -> Option<Mark> {
261272
let mut scope = None;
262273
while !self.is_descendant_of(expansion, self.outer(*ctxt)) {
@@ -366,6 +377,10 @@ pub fn clear_markings() {
366377
HygieneData::with(|data| data.markings = FxHashMap::default());
367378
}
368379

380+
pub fn walk_chain(span: Span, to: SyntaxContext) -> Span {
381+
HygieneData::with(|data| data.walk_chain(span, to))
382+
}
383+
369384
impl SyntaxContext {
370385
#[inline]
371386
pub const fn empty() -> Self {

0 commit comments

Comments
 (0)