|
25 | 25 | #![recursion_limit = "256"] |
26 | 26 | // tidy-alphabetical-end |
27 | 27 |
|
28 | | -use std::cell::{BorrowMutError, Cell, Ref, RefCell, RefMut}; |
| 28 | +use std::cell::{Cell, Ref, RefCell}; |
29 | 29 | use std::collections::BTreeSet; |
30 | | -use std::fmt::{self, Formatter}; |
| 30 | +use std::fmt::{self}; |
31 | 31 | use std::sync::Arc; |
32 | 32 |
|
33 | 33 | use diagnostics::{ImportSuggestion, LabelSuggestion, Suggestion}; |
@@ -96,6 +96,8 @@ pub mod rustdoc; |
96 | 96 |
|
97 | 97 | pub use macros::registered_tools_ast; |
98 | 98 |
|
| 99 | +use crate::ref_mut::{CmCell, CmRefCell}; |
| 100 | + |
99 | 101 | rustc_fluent_macro::fluent_messages! { "../messages.ftl" } |
100 | 102 |
|
101 | 103 | #[derive(Debug)] |
@@ -593,9 +595,9 @@ struct ModuleData<'ra> { |
593 | 595 | /// Resolutions in modules from other crates are not populated until accessed. |
594 | 596 | lazy_resolutions: Resolutions<'ra>, |
595 | 597 | /// True if this is a module from other crate that needs to be populated on access. |
596 | | - populate_on_access: CmCell<bool>, // FIXME(batched): Use an atomic in batched import resolution? |
| 598 | + populate_on_access: Cell<bool>, // FIXME(parallel): Use an atomic in parallel import resolution |
597 | 599 | /// Used to disambiguate underscore items (`const _: T = ...`) in the module. |
598 | | - underscore_disambiguator: CmCell<u32>, // FIXME(batched): Use an atomic in batched import resolution? |
| 600 | + underscore_disambiguator: CmCell<u32>, |
599 | 601 |
|
600 | 602 | /// Macro invocations that can expand into items in this module. |
601 | 603 | unexpanded_invocations: CmRefCell<FxHashSet<LocalExpnId>>, |
@@ -656,7 +658,7 @@ impl<'ra> ModuleData<'ra> { |
656 | 658 | parent, |
657 | 659 | kind, |
658 | 660 | lazy_resolutions: Default::default(), |
659 | | - populate_on_access: CmCell::new(is_foreign), |
| 661 | + populate_on_access: Cell::new(is_foreign), |
660 | 662 | underscore_disambiguator: CmCell::new(0), |
661 | 663 | unexpanded_invocations: Default::default(), |
662 | 664 | no_implicit_prelude, |
@@ -697,7 +699,7 @@ impl<'ra> Module<'ra> { |
697 | 699 |
|
698 | 700 | /// This modifies `self` in place. The traits will be stored in `self.traits`. |
699 | 701 | fn ensure_traits<'tcx>(self, resolver: &impl AsRef<Resolver<'ra, 'tcx>>) { |
700 | | - let mut traits = self.traits.borrow_mut_unchecked(); |
| 702 | + let mut traits = self.traits.borrow_mut(resolver.as_ref()); |
701 | 703 | if traits.is_none() { |
702 | 704 | let mut collected_traits = Vec::new(); |
703 | 705 | self.for_each_child(resolver, |r, name, ns, binding| { |
@@ -1976,7 +1978,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { |
1976 | 1978 | fn resolutions(&self, module: Module<'ra>) -> &'ra Resolutions<'ra> { |
1977 | 1979 | if module.populate_on_access.get() { |
1978 | 1980 | // FIXME(batched): Will be fixed in batched import resolution. |
1979 | | - module.populate_on_access.set_unchecked(false); |
| 1981 | + module.populate_on_access.set(false); |
1980 | 1982 | self.build_reduced_graph_external(module); |
1981 | 1983 | } |
1982 | 1984 | &module.0.0.lazy_resolutions |
@@ -2504,9 +2506,20 @@ pub fn provide(providers: &mut Providers) { |
2504 | 2506 | providers.registered_tools = macros::registered_tools; |
2505 | 2507 | } |
2506 | 2508 |
|
| 2509 | +/// A wrapper around `&mut Resolver` that may be mutable or immutable, depending on a conditions. |
| 2510 | +/// |
| 2511 | +/// `Cm` stands for "conditionally mutable". |
| 2512 | +/// |
| 2513 | +/// Prefer constructing it through [`Resolver::cm`] to ensure correctness. |
| 2514 | +type CmResolver<'r, 'ra, 'tcx> = ref_mut::RefOrMut<'r, Resolver<'ra, 'tcx>>; |
| 2515 | + |
2507 | 2516 | mod ref_mut { |
| 2517 | + use std::cell::{BorrowMutError, Cell, Ref, RefCell, RefMut}; |
| 2518 | + use std::fmt; |
2508 | 2519 | use std::ops::Deref; |
2509 | 2520 |
|
| 2521 | + use crate::Resolver; |
| 2522 | + |
2510 | 2523 | /// A wrapper around a mutable reference that conditionally allows mutable access. |
2511 | 2524 | pub(crate) struct RefOrMut<'a, T> { |
2512 | 2525 | p: &'a mut T, |
@@ -2555,117 +2568,84 @@ mod ref_mut { |
2555 | 2568 | self.p |
2556 | 2569 | } |
2557 | 2570 | } |
2558 | | -} |
2559 | 2571 |
|
2560 | | -/// A wrapper around `&mut Resolver` that may be mutable or immutable, depending on a conditions. |
2561 | | -/// |
2562 | | -/// `Cm` stands for "conditionally mutable". |
2563 | | -/// |
2564 | | -/// Prefer constructing it through [`Resolver::cm`] to ensure correctness. |
2565 | | -type CmResolver<'r, 'ra, 'tcx> = ref_mut::RefOrMut<'r, Resolver<'ra, 'tcx>>; |
2566 | | - |
2567 | | -#[derive(Default)] |
2568 | | -struct CmCell<T> { |
2569 | | - value: Cell<T>, |
2570 | | -} |
2571 | | - |
2572 | | -impl<T: Copy + fmt::Debug> fmt::Debug for CmCell<T> { |
2573 | | - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { |
2574 | | - f.debug_struct("CmCell").field("value", &self.get()).finish() |
2575 | | - } |
2576 | | -} |
| 2572 | + #[derive(Default)] |
| 2573 | + pub(crate) struct CmCell<T>(Cell<T>); |
2577 | 2574 |
|
2578 | | -impl<T: Copy> Clone for CmCell<T> { |
2579 | | - #[inline] |
2580 | | - fn clone(&self) -> CmCell<T> { |
2581 | | - CmCell::new(self.get()) |
| 2575 | + impl<T: Copy + fmt::Debug> fmt::Debug for CmCell<T> { |
| 2576 | + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| 2577 | + f.debug_struct("CmCell").field("value", &self.get()).finish() |
| 2578 | + } |
2582 | 2579 | } |
2583 | | -} |
2584 | 2580 |
|
2585 | | -impl<T: Copy> CmCell<T> { |
2586 | | - const fn get(&self) -> T { |
2587 | | - self.value.get() |
| 2581 | + impl<T: Copy> Clone for CmCell<T> { |
| 2582 | + #[inline] |
| 2583 | + fn clone(&self) -> CmCell<T> { |
| 2584 | + CmCell::new(self.get()) |
| 2585 | + } |
2588 | 2586 | } |
2589 | 2587 |
|
2590 | | - fn update_unchecked(&self, f: impl FnOnce(T) -> T) |
2591 | | - where |
2592 | | - T: Copy, |
2593 | | - { |
2594 | | - let old = self.get(); |
2595 | | - self.set_unchecked(f(old)); |
2596 | | - } |
2597 | | -} |
| 2588 | + impl<T: Copy> CmCell<T> { |
| 2589 | + pub(crate) const fn get(&self) -> T { |
| 2590 | + self.0.get() |
| 2591 | + } |
2598 | 2592 |
|
2599 | | -impl<T> CmCell<T> { |
2600 | | - const fn new(value: T) -> CmCell<T> { |
2601 | | - CmCell { value: Cell::new(value) } |
| 2593 | + pub(crate) fn update_unchecked(&self, f: impl FnOnce(T) -> T) |
| 2594 | + where |
| 2595 | + T: Copy, |
| 2596 | + { |
| 2597 | + let old = self.get(); |
| 2598 | + self.set_unchecked(f(old)); |
| 2599 | + } |
2602 | 2600 | } |
2603 | 2601 |
|
2604 | | - #[track_caller] |
2605 | | - #[allow(dead_code)] |
2606 | | - fn set<'ra, 'tcx>(&self, val: T, r: &Resolver<'ra, 'tcx>) { |
2607 | | - if r.assert_speculative { |
2608 | | - panic!("Not allowed to mutate CmCell during speculative resolution"); |
| 2602 | + impl<T> CmCell<T> { |
| 2603 | + pub(crate) const fn new(value: T) -> CmCell<T> { |
| 2604 | + CmCell(Cell::new(value)) |
2609 | 2605 | } |
2610 | | - self.value.set(val); |
2611 | | - } |
2612 | 2606 |
|
2613 | | - fn set_unchecked(&self, val: T) { |
2614 | | - self.value.set(val); |
2615 | | - } |
| 2607 | + pub(crate) fn set_unchecked(&self, val: T) { |
| 2608 | + self.0.set(val); |
| 2609 | + } |
2616 | 2610 |
|
2617 | | - fn into_inner(self) -> T { |
2618 | | - self.value.into_inner() |
| 2611 | + pub(crate) fn into_inner(self) -> T { |
| 2612 | + self.0.into_inner() |
| 2613 | + } |
2619 | 2614 | } |
2620 | | -} |
2621 | | -#[derive(Default)] |
2622 | | -struct CmRefCell<T> { |
2623 | | - ref_cell: RefCell<T>, |
2624 | | -} |
2625 | 2615 |
|
2626 | | -impl<T> CmRefCell<T> { |
2627 | | - const fn new(value: T) -> CmRefCell<T> { |
2628 | | - CmRefCell { ref_cell: RefCell::new(value) } |
2629 | | - } |
| 2616 | + #[derive(Default)] |
| 2617 | + pub(crate) struct CmRefCell<T>(RefCell<T>); |
2630 | 2618 |
|
2631 | | - #[inline] |
2632 | | - #[track_caller] |
2633 | | - #[allow(dead_code)] |
2634 | | - fn borrow_mut<'ra, 'tcx>(&self, r: &Resolver<'ra, 'tcx>) -> RefMut<'_, T> { |
2635 | | - if r.assert_speculative { |
2636 | | - panic!("Not allowed to mutably borrow a CmRefCell during speculative resolution"); |
| 2619 | + impl<T> CmRefCell<T> { |
| 2620 | + pub(crate) const fn new(value: T) -> CmRefCell<T> { |
| 2621 | + CmRefCell(RefCell::new(value)) |
2637 | 2622 | } |
2638 | | - self.ref_cell.borrow_mut() |
2639 | | - } |
2640 | 2623 |
|
2641 | | - #[inline] |
2642 | | - #[track_caller] |
2643 | | - fn borrow_mut_unchecked(&self) -> RefMut<'_, T> { |
2644 | | - self.ref_cell.borrow_mut() |
2645 | | - } |
| 2624 | + #[inline] |
| 2625 | + #[track_caller] |
| 2626 | + pub(crate) fn borrow_mut_unchecked(&self) -> RefMut<'_, T> { |
| 2627 | + self.0.borrow_mut() |
| 2628 | + } |
2646 | 2629 |
|
2647 | | - #[inline] |
2648 | | - #[track_caller] |
2649 | | - fn try_borrow_mut_unchecked(&self) -> Result<RefMut<'_, T>, BorrowMutError> { |
2650 | | - self.ref_cell.try_borrow_mut() |
2651 | | - } |
| 2630 | + #[inline] |
| 2631 | + #[track_caller] |
| 2632 | + pub(crate) fn borrow_mut<'ra, 'tcx>(&self, r: &Resolver<'ra, 'tcx>) -> RefMut<'_, T> { |
| 2633 | + if r.assert_speculative { |
| 2634 | + panic!("Not allowed to mutably borrow a CmRefCell during speculative resolution"); |
| 2635 | + } |
| 2636 | + self.borrow_mut_unchecked() |
| 2637 | + } |
2652 | 2638 |
|
2653 | | - #[inline] |
2654 | | - #[track_caller] |
2655 | | - #[allow(dead_code)] |
2656 | | - fn try_borrow_mut<'ra, 'tcx>( |
2657 | | - &self, |
2658 | | - r: Resolver<'ra, 'tcx>, |
2659 | | - ) -> Result<RefMut<'_, T>, BorrowMutError> { |
2660 | | - if r.assert_speculative { |
2661 | | - panic!("Not allowed to mutably borrow a CmRefCell during speculative resolution"); |
| 2639 | + #[inline] |
| 2640 | + #[track_caller] |
| 2641 | + pub(crate) fn try_borrow_mut_unchecked(&self) -> Result<RefMut<'_, T>, BorrowMutError> { |
| 2642 | + self.0.try_borrow_mut() |
2662 | 2643 | } |
2663 | | - self.ref_cell.try_borrow_mut() |
2664 | | - } |
2665 | 2644 |
|
2666 | | - #[inline] |
2667 | | - #[track_caller] |
2668 | | - fn borrow(&self) -> Ref<'_, T> { |
2669 | | - self.ref_cell.borrow() |
| 2645 | + #[inline] |
| 2646 | + #[track_caller] |
| 2647 | + pub(crate) fn borrow(&self) -> Ref<'_, T> { |
| 2648 | + self.0.borrow() |
| 2649 | + } |
2670 | 2650 | } |
2671 | 2651 | } |
0 commit comments