diff options
| author | Nicholas Nethercote <nnethercote@mozilla.com> | 2019-05-27 13:52:11 +1000 |
|---|---|---|
| committer | Nicholas Nethercote <nnethercote@mozilla.com> | 2019-05-29 09:32:56 +1000 |
| commit | caea42f6c8ba8f5cc5ed04557ec5d072b107e7b4 (patch) | |
| tree | 9ddcc6be16ffaabb4d5dfbd86340c043c2e08f3a /src/libsyntax_pos | |
| parent | 828f6fdbe57a7b0e6b7bf7194ee9a2079b2779cd (diff) | |
| download | rust-caea42f6c8ba8f5cc5ed04557ec5d072b107e7b4.tar.gz rust-caea42f6c8ba8f5cc5ed04557ec5d072b107e7b4.zip | |
Introduce and use `SyntaxContext::outer_expn_info()`.
It reduces two `hygiene_data` accesses to one on some hot paths.
Diffstat (limited to 'src/libsyntax_pos')
| -rw-r--r-- | src/libsyntax_pos/hygiene.rs | 10 | ||||
| -rw-r--r-- | src/libsyntax_pos/lib.rs | 20 |
2 files changed, 20 insertions, 10 deletions
diff --git a/src/libsyntax_pos/hygiene.rs b/src/libsyntax_pos/hygiene.rs index 3ffeaf43b85..b4bb6d9c5e8 100644 --- a/src/libsyntax_pos/hygiene.rs +++ b/src/libsyntax_pos/hygiene.rs @@ -517,6 +517,16 @@ impl SyntaxContext { HygieneData::with(|data| data.syntax_contexts[self.0 as usize].outer_mark) } + /// `ctxt.outer_expn_info()` is equivalent to but faster than + /// `ctxt.outer().expn_info()`. + #[inline] + pub fn outer_expn_info(self) -> Option<ExpnInfo> { + HygieneData::with(|data| { + let outer = data.syntax_contexts[self.0 as usize].outer_mark; + data.marks[outer.0 as usize].expn_info.clone() + }) + } + pub fn dollar_crate_name(self) -> Symbol { HygieneData::with(|data| data.syntax_contexts[self.0 as usize].dollar_crate_name) } diff --git a/src/libsyntax_pos/lib.rs b/src/libsyntax_pos/lib.rs index cb5aaf7eb88..30e075a3396 100644 --- a/src/libsyntax_pos/lib.rs +++ b/src/libsyntax_pos/lib.rs @@ -348,18 +348,18 @@ impl Span { /// Returns the source span -- this is either the supplied span, or the span for /// the macro callsite that expanded to it. pub fn source_callsite(self) -> Span { - self.ctxt().outer().expn_info().map(|info| info.call_site.source_callsite()).unwrap_or(self) + self.ctxt().outer_expn_info().map(|info| info.call_site.source_callsite()).unwrap_or(self) } /// The `Span` for the tokens in the previous macro expansion from which `self` was generated, /// if any. pub fn parent(self) -> Option<Span> { - self.ctxt().outer().expn_info().map(|i| i.call_site) + self.ctxt().outer_expn_info().map(|i| i.call_site) } /// Edition of the crate from which this span came. pub fn edition(self) -> edition::Edition { - self.ctxt().outer().expn_info().map_or_else(|| { + self.ctxt().outer_expn_info().map_or_else(|| { Edition::from_session() }, |einfo| einfo.edition) } @@ -381,19 +381,19 @@ impl Span { /// corresponding to the source callsite. pub fn source_callee(self) -> Option<ExpnInfo> { fn source_callee(info: ExpnInfo) -> ExpnInfo { - match info.call_site.ctxt().outer().expn_info() { + match info.call_site.ctxt().outer_expn_info() { Some(info) => source_callee(info), None => info, } } - self.ctxt().outer().expn_info().map(source_callee) + self.ctxt().outer_expn_info().map(source_callee) } /// Checks if a span is "internal" to a macro in which `#[unstable]` /// items can be used (that is, a macro marked with /// `#[allow_internal_unstable]`). pub fn allows_unstable(&self, feature: Symbol) -> bool { - match self.ctxt().outer().expn_info() { + match self.ctxt().outer_expn_info() { Some(info) => info .allow_internal_unstable .map_or(false, |features| features.iter().any(|&f| @@ -405,7 +405,7 @@ impl Span { /// Checks if this span arises from a compiler desugaring of kind `kind`. pub fn is_compiler_desugaring(&self, kind: CompilerDesugaringKind) -> bool { - match self.ctxt().outer().expn_info() { + match self.ctxt().outer_expn_info() { Some(info) => match info.format { ExpnFormat::CompilerDesugaring(k) => k == kind, _ => false, @@ -417,7 +417,7 @@ impl Span { /// Returns the compiler desugaring that created this span, or `None` /// if this span is not from a desugaring. pub fn compiler_desugaring_kind(&self) -> Option<CompilerDesugaringKind> { - match self.ctxt().outer().expn_info() { + match self.ctxt().outer_expn_info() { Some(info) => match info.format { ExpnFormat::CompilerDesugaring(k) => Some(k), _ => None @@ -430,7 +430,7 @@ impl Span { /// can be used without triggering the `unsafe_code` lint // (that is, a macro marked with `#[allow_internal_unsafe]`). pub fn allows_unsafe(&self) -> bool { - match self.ctxt().outer().expn_info() { + match self.ctxt().outer_expn_info() { Some(info) => info.allow_internal_unsafe, None => false, } @@ -439,7 +439,7 @@ impl Span { pub fn macro_backtrace(mut self) -> Vec<MacroBacktrace> { let mut prev_span = DUMMY_SP; let mut result = vec![]; - while let Some(info) = self.ctxt().outer().expn_info() { + while let Some(info) = self.ctxt().outer_expn_info() { // Don't print recursive invocations. if !info.call_site.source_equal(&prev_span) { let (pre, post) = match info.format { |
