self.data.as_ref().and_then(|data| data.colors.borrow().get(dep_node).cloned())
}
- /// Try to read a node index for the node dep_node.
- /// A node will have an index, when it's already been marked green, or when we can mark it
- /// green. This function will mark the current task as a reader of the specified node, when
- /// the a node index can be found for that node.
- pub fn read_node_index(&self, tcx: TyCtxt, dep_node: &DepNode) -> Option<DepNodeIndex> {
- match self.node_color(dep_node) {
- Some(DepNodeColor::Green(dep_node_index)) => {
- self.read_index(dep_node_index);
- Some(dep_node_index)
- }
- Some(DepNodeColor::Red) => {
- None
- }
- None => {
- // try_mark_green (called below) will panic when full incremental
- // compilation is disabled. If that's the case, we can't try to mark nodes
- // as green anyway, so we can safely return None here.
- if !self.is_fully_enabled() {
- return None;
- }
- match self.try_mark_green(tcx, &dep_node) {
- Some(dep_node_index) => {
- debug_assert!(tcx.dep_graph.is_green(dep_node_index));
- tcx.dep_graph.read_index(dep_node_index);
- Some(dep_node_index)
- }
- None => {
- None
- }
- }
- }
- }
- }
-
pub fn try_mark_green(&self,
tcx: TyCtxt,
dep_node: &DepNode)
//! that generate the actual methods on tcx which find and execute the
//! provider, manage the caches, and so forth.
-use dep_graph::{DepNodeIndex, DepNode, DepKind};
+use dep_graph::{DepNodeIndex, DepNode, DepKind, DepNodeColor};
use errors::{Diagnostic, DiagnosticBuilder};
use ty::{TyCtxt};
use ty::maps::Query; // NB: actually generated by the macros in this file
Ok(result)
}
+
+ /// Try to read a node index for the node dep_node.
+ /// A node will have an index, when it's already been marked green, or when we can mark it
+ /// green. This function will mark the current task as a reader of the specified node, when
+ /// the a node index can be found for that node.
+ pub(super) fn try_mark_green_and_read(self, dep_node: &DepNode) -> Option<DepNodeIndex> {
+ match self.dep_graph.node_color(dep_node) {
+ Some(DepNodeColor::Green(dep_node_index)) => {
+ self.dep_graph.read_index(dep_node_index);
+ Some(dep_node_index)
+ }
+ Some(DepNodeColor::Red) => {
+ None
+ }
+ None => {
+ // try_mark_green (called below) will panic when full incremental
+ // compilation is disabled. If that's the case, we can't try to mark nodes
+ // as green anyway, so we can safely return None here.
+ if !self.dep_graph.is_fully_enabled() {
+ return None;
+ }
+ match self.dep_graph.try_mark_green(self, &dep_node) {
+ Some(dep_node_index) => {
+ debug_assert!(self.dep_graph.is_green(dep_node_index));
+ self.dep_graph.read_index(dep_node_index);
+ Some(dep_node_index)
+ }
+ None => {
+ None
+ }
+ }
+ }
+ }
+ }
}
// If enabled, send a message to the profile-queries thread
}
if !dep_node.kind.is_input() {
- if let Some(dep_node_index) = tcx.dep_graph.read_node_index(tcx, &dep_node) {
+ if let Some(dep_node_index) = tcx.try_mark_green_and_read(&dep_node) {
profq_msg!(tcx, ProfileQueriesMsg::CacheHit);
return Self::load_from_disk_and_cache_in_memory(tcx,
key,
// Ensuring an "input" or anonymous query makes no sense
assert!(!dep_node.kind.is_anon());
assert!(!dep_node.kind.is_input());
- if tcx.dep_graph.read_node_index(tcx, &dep_node).is_none() {
- // A None return from `read_node_index` means that this is either
+ if tcx.try_mark_green_and_read(&dep_node).is_none() {
+ // A None return from `try_mark_green_and_read` means that this is either
// a new dep node or that the dep node has already been marked red.
// Either way, we can't call `dep_graph.read()` as we don't have the
// DepNodeIndex. We must invoke the query itself. The performance cost