mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-16 04:55:22 +03:00
Auto merge of #91043 - camsteffen:descendant-eq, r=petrochenkov
Add fast path to `is_descendant_of`
This commit is contained in:
@@ -264,7 +264,15 @@ pub fn expn_data(self) -> ExpnData {
|
||||
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 @@ fn expn_data(&self, expn_id: ExpnId) -> &ExpnData {
|
||||
}
|
||||
|
||||
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 {
|
||||
@@ -1223,6 +1240,7 @@ pub fn register_expn_id(
|
||||
data: ExpnData,
|
||||
hash: ExpnHash,
|
||||
) -> ExpnId {
|
||||
debug_assert!(data.parent == ExpnId::root() || krate == data.parent.krate);
|
||||
let expn_id = ExpnId { krate, local_id };
|
||||
HygieneData::with(|hygiene_data| {
|
||||
let _old_data = hygiene_data.foreign_expn_data.insert(expn_id, data);
|
||||
|
||||
Reference in New Issue
Block a user