Skip to content

Commit c39b447

Browse files
"Cachify" ExternPreludeEntry.binding through a Cell.
1 parent 7278554 commit c39b447

File tree

2 files changed

+11
-12
lines changed

2 files changed

+11
-12
lines changed

compiler/rustc_resolve/src/build_reduced_graph.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -984,18 +984,17 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
984984
// more details: https://github.com/rust-lang/rust/pull/111761
985985
return;
986986
}
987-
let entry = self
988-
.r
989-
.extern_prelude
990-
.entry(ident)
991-
.or_insert(ExternPreludeEntry { binding: None, introduced_by_item: true });
987+
let entry = self.r.extern_prelude.entry(ident).or_insert(ExternPreludeEntry {
988+
binding: Cell::new(None),
989+
introduced_by_item: true,
990+
});
992991
if orig_name.is_some() {
993992
entry.introduced_by_item = true;
994993
}
995994
// Binding from `extern crate` item in source code can replace
996995
// a binding from `--extern` on command line here.
997996
if !entry.is_import() {
998-
entry.binding = Some(imported_binding)
997+
entry.binding.set(Some(imported_binding));
999998
} else if ident.name != kw::Underscore {
1000999
self.r.dcx().span_delayed_bug(
10011000
item.span,

compiler/rustc_resolve/src/lib.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1009,13 +1009,13 @@ impl<'ra> NameBindingData<'ra> {
10091009

10101010
#[derive(Default, Clone)]
10111011
struct ExternPreludeEntry<'ra> {
1012-
binding: Option<NameBinding<'ra>>,
1012+
binding: Cell<Option<NameBinding<'ra>>>,
10131013
introduced_by_item: bool,
10141014
}
10151015

10161016
impl ExternPreludeEntry<'_> {
10171017
fn is_import(&self) -> bool {
1018-
self.binding.is_some_and(|binding| binding.is_import())
1018+
self.binding.get().is_some_and(|binding| binding.is_import())
10191019
}
10201020
}
10211021

@@ -2006,7 +2006,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
20062006
// but not introduce it, as used if they are accessed from lexical scope.
20072007
if used == Used::Scope {
20082008
if let Some(entry) = self.extern_prelude.get(&ident.normalize_to_macros_2_0()) {
2009-
if !entry.introduced_by_item && entry.binding == Some(used_binding) {
2009+
if !entry.introduced_by_item && entry.binding.get() == Some(used_binding) {
20102010
return;
20112011
}
20122012
}
@@ -2170,7 +2170,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
21702170

21712171
let norm_ident = ident.normalize_to_macros_2_0();
21722172
let binding = self.extern_prelude.get(&norm_ident).cloned().and_then(|entry| {
2173-
Some(if let Some(binding) = entry.binding {
2173+
Some(if let Some(binding) = entry.binding.get() {
21742174
if finalize {
21752175
if !entry.is_import() {
21762176
self.cstore_mut().process_path_extern(self.tcx, ident.name, ident.span);
@@ -2195,8 +2195,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
21952195
})
21962196
});
21972197

2198-
if let Some(entry) = self.extern_prelude.get_mut(&norm_ident) {
2199-
entry.binding = binding;
2198+
if let Some(entry) = self.extern_prelude.get(&norm_ident) {
2199+
entry.binding.set(binding);
22002200
}
22012201

22022202
binding

0 commit comments

Comments
 (0)