1
Fork 0

Add fast path to is_descendant_of

This commit is contained in:
Cameron Steffen 2021-11-19 09:43:03 -06:00
parent db9d361a47
commit 768cfac705

View file

@ -264,7 +264,15 @@ impl ExpnId {
HygieneData::with(|data| data.expn_data(self).clone())
}
#[inline]
pub fn is_descendant_of(self, ancestor: ExpnId) -> bool {
// a few "fast path" cases to avoid locking HygieneData
if ancestor == ExpnId::root() || ancestor == self {
return true;
}
if ancestor.krate != self.krate {
return false;
}
HygieneData::with(|data| data.is_descendant_of(self, ancestor))
}
@ -376,13 +384,22 @@ impl HygieneData {
}
fn is_descendant_of(&self, mut expn_id: ExpnId, ancestor: ExpnId) -> bool {
while expn_id != ancestor {
// a couple "fast path" cases to avoid traversing parents in the loop below
if ancestor == ExpnId::root() {
return true;
}
if expn_id.krate != ancestor.krate {
return false;
}
loop {
if expn_id == ancestor {
return true;
}
if expn_id == ExpnId::root() {
return false;
}
expn_id = self.expn_data(expn_id).parent;
}
true
}
fn normalize_to_macros_2_0(&self, ctxt: SyntaxContext) -> SyntaxContext {