]> git.lizzy.rs Git - rust.git/commitdiff
Rollup merge of #36460 - mikhail-m1:35123-map3, r=nikomatsakis
authorJonathan Turner <jonathandturner@users.noreply.github.com>
Thu, 29 Sep 2016 03:21:50 +0000 (20:21 -0700)
committerGitHub <noreply@github.com>
Thu, 29 Sep 2016 03:21:50 +0000 (20:21 -0700)
map crate numbers between compilations

?r nikomatsakis
issue #35123

1  2 
src/librustc/ty/context.rs
src/librustc_incremental/persist/directory.rs

index 0c7c387b67ea3c33aeb4791dda6a9ffd7da14351,5976bd374d2a7dbb0971bc39544c7bbbe15eba02..b1f80455dd98b979d8a6ad46c2cf5166eb6a9f01
@@@ -17,7 -17,7 +17,7 @@@ use hir::TraitMap
  use hir::def::DefMap;
  use hir::def_id::{CrateNum, DefId, DefIndex, LOCAL_CRATE};
  use hir::map as ast_map;
- use hir::map::{DefKey, DefPath, DefPathData, DisambiguatedDefPathData};
+ use hir::map::{DefKey, DefPathData, DisambiguatedDefPathData};
  use middle::free_region::FreeRegionMap;
  use middle::region::RegionMaps;
  use middle::resolve_lifetime;
@@@ -489,9 -489,6 +489,9 @@@ pub struct GlobalCtxt<'tcx> 
      /// Cache for layouts computed from types.
      pub layout_cache: RefCell<FnvHashMap<Ty<'tcx>, &'tcx Layout>>,
  
 +    /// Used to prevent layout from recursing too deeply.
 +    pub layout_depth: Cell<usize>,
 +
      /// Map from function to the `#[derive]` mode that it's defining. Only used
      /// by `rustc-macro` crates.
      pub derive_macros: RefCell<NodeMap<token::InternedString>>,
@@@ -546,8 -543,11 +546,11 @@@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, '
          }
      }
  
-     pub fn retrace_path(self, path: &DefPath) -> Option<DefId> {
-         debug!("retrace_path(path={:?}, krate={:?})", path, self.crate_name(path.krate));
+     pub fn retrace_path(self,
+                         krate: CrateNum,
+                         path_data: &[DisambiguatedDefPathData])
+                         -> Option<DefId> {
+         debug!("retrace_path(path={:?}, krate={:?})", path_data, self.crate_name(krate));
  
          let root_key = DefKey {
              parent: None,
              },
          };
  
-         let root_index = self.def_index_for_def_key(path.krate, root_key)
+         let root_index = self.def_index_for_def_key(krate, root_key)
                               .expect("no root key?");
  
          debug!("retrace_path: root_index={:?}", root_index);
  
          let mut index = root_index;
-         for data in &path.data {
+         for data in path_data {
              let key = DefKey { parent: Some(index), disambiguated_data: data.clone() };
              debug!("retrace_path: key={:?}", key);
-             match self.def_index_for_def_key(path.krate, key) {
+             match self.def_index_for_def_key(krate, key) {
                  Some(i) => index = i,
                  None => return None,
              }
          }
  
-         Some(DefId { krate: path.krate, index: index })
+         Some(DefId { krate: krate, index: index })
      }
  
      pub fn type_parameter_def(self,
              crate_name: token::intern_and_get_ident(crate_name),
              data_layout: data_layout,
              layout_cache: RefCell::new(FnvHashMap()),
 +            layout_depth: Cell::new(0),
              derive_macros: RefCell::new(NodeMap()),
         }, f)
      }
index 619e237ee34a3fc6f49d30503e5c3f127fb78c3c,7e2d5b8c8ef6365c60787654d1e2d72aef5c2027..d238121872be67131f8a2a206e4c20cbd456e68e
@@@ -20,6 -20,7 +20,7 @@@ use rustc::ty::TyCtxt
  use rustc::util::nodemap::DefIdMap;
  use std::fmt::{self, Debug};
  use std::iter::once;
+ use std::collections::HashMap;
  
  /// Index into the DefIdDirectory
  #[derive(Copy, Clone, Debug, PartialOrd, Ord, Hash, PartialEq, Eq,
@@@ -90,18 -91,29 +91,29 @@@ impl DefIdDirectory 
      }
  
      pub fn retrace(&self, tcx: TyCtxt) -> RetracedDefIdDirectory {
-         let max_current_crate = self.max_current_crate(tcx);
+         fn make_key(name: &str, disambiguator: &str) -> String {
+             format!("{}/{}", name, disambiguator)
+         }
+         let new_krates: HashMap<_, _> =
+             once(LOCAL_CRATE)
+             .chain(tcx.sess.cstore.crates())
+             .map(|krate| (make_key(&tcx.crate_name(krate),
+                                    &tcx.crate_disambiguator(krate)), krate))
+             .collect();
  
          let ids = self.paths.iter()
                              .map(|path| {
-                                 if self.krate_still_valid(tcx, max_current_crate, path.krate) {
-                                     tcx.retrace_path(path)
+                                 let old_krate_id = path.krate.as_usize();
+                                 assert!(old_krate_id < self.krates.len());
+                                 let old_crate_info = &self.krates[old_krate_id];
+                                 let old_crate_key = make_key(&old_crate_info.name,
+                                                          &old_crate_info.disambiguator);
+                                 if let Some(&new_crate_key) = new_krates.get(&old_crate_key) {
+                                     tcx.retrace_path(new_crate_key, &path.data)
                                  } else {
-                                     debug!("crate {} changed from {:?} to {:?}/{:?}",
-                                            path.krate,
-                                            self.krates[path.krate.as_usize()],
-                                            tcx.crate_name(path.krate),
-                                            tcx.crate_disambiguator(path.krate));
+                                     debug!("crate {:?} no longer exists", old_crate_key);
                                      None
                                  }
                              })
@@@ -178,6 -190,7 +190,6 @@@ impl<'a,'tcx> DefIdDirectoryBuilder<'a,
          &self.directory.paths[id.index as usize]
      }
  
 -
      pub fn map(&mut self, node: &DepNode<DefId>) -> DepNode<DefPathIndex> {
          node.map_def(|&def_id| Some(self.add(def_id))).unwrap()
      }