diff options
| author | Camille GILLOT <gillot.camille@gmail.com> | 2021-07-15 13:45:38 +0200 |
|---|---|---|
| committer | Camille GILLOT <gillot.camille@gmail.com> | 2021-07-17 19:41:14 +0200 |
| commit | b35ceeeec706e957ee46166e0a8b6d912ac215a3 (patch) | |
| tree | 3d21be024537e6cd4c8e662e93d0e324b34959f3 | |
| parent | dddaa6d06801955dcbb7b1d1094932383ff36853 (diff) | |
| download | rust-b35ceeeec706e957ee46166e0a8b6d912ac215a3.tar.gz rust-b35ceeeec706e957ee46166e0a8b6d912ac215a3.zip | |
Simplify Expn creation.
| -rw-r--r-- | compiler/rustc_span/src/hygiene.rs | 52 |
1 files changed, 25 insertions, 27 deletions
diff --git a/compiler/rustc_span/src/hygiene.rs b/compiler/rustc_span/src/hygiene.rs index c020375fab0..cb3a08439d1 100644 --- a/compiler/rustc_span/src/hygiene.rs +++ b/compiler/rustc_span/src/hygiene.rs @@ -153,14 +153,25 @@ impl LocalExpnId { } pub fn fresh_empty() -> LocalExpnId { - HygieneData::with(|data| data.fresh_expn(None)) + HygieneData::with(|data| { + let expn_id = data.local_expn_data.push(None); + let _eid = data.local_expn_hashes.push(ExpnHash(Fingerprint::ZERO)); + debug_assert_eq!(expn_id, _eid); + expn_id + }) } - pub fn fresh(expn_data: ExpnData, ctx: impl HashStableContext) -> LocalExpnId { + pub fn fresh(mut expn_data: ExpnData, ctx: impl HashStableContext) -> LocalExpnId { debug_assert_eq!(expn_data.parent.krate, LOCAL_CRATE); - let expn_id = HygieneData::with(|data| data.fresh_expn(Some(expn_data))); - update_disambiguator(expn_id, ctx); - expn_id + let expn_hash = update_disambiguator(&mut expn_data, ctx); + HygieneData::with(|data| { + let expn_id = data.local_expn_data.push(Some(expn_data)); + let _eid = data.local_expn_hashes.push(expn_hash); + debug_assert_eq!(expn_id, _eid); + let _old_id = data.expn_hash_to_expn_id.insert(expn_hash, expn_id.to_expn_id()); + debug_assert!(_old_id.is_none()); + expn_id + }) } #[inline] @@ -179,14 +190,18 @@ impl LocalExpnId { } #[inline] - pub fn set_expn_data(self, expn_data: ExpnData, ctx: impl HashStableContext) { + pub fn set_expn_data(self, mut expn_data: ExpnData, ctx: impl HashStableContext) { debug_assert_eq!(expn_data.parent.krate, LOCAL_CRATE); + let expn_hash = update_disambiguator(&mut expn_data, ctx); HygieneData::with(|data| { let old_expn_data = &mut data.local_expn_data[self]; assert!(old_expn_data.is_none(), "expansion data is reset for an expansion ID"); *old_expn_data = Some(expn_data); + debug_assert_eq!(data.local_expn_hashes[self].0, Fingerprint::ZERO); + data.local_expn_hashes[self] = expn_hash; + let _old_id = data.expn_hash_to_expn_id.insert(expn_hash, self.to_expn_id()); + debug_assert!(_old_id.is_none()); }); - update_disambiguator(self, ctx) } #[inline] @@ -335,13 +350,6 @@ impl HygieneData { with_session_globals(|session_globals| f(&mut *session_globals.hygiene_data.borrow_mut())) } - fn fresh_expn(&mut self, expn_data: Option<ExpnData>) -> LocalExpnId { - let expn_id = self.local_expn_data.push(expn_data); - let _eid = self.local_expn_hashes.push(ExpnHash(Fingerprint::ZERO)); - debug_assert_eq!(expn_id, _eid); - expn_id - } - #[inline] fn local_expn_hash(&self, expn_id: LocalExpnId) -> ExpnHash { self.local_expn_hashes[expn_id] @@ -1413,8 +1421,7 @@ impl<D: Decoder> Decodable<D> for SyntaxContext { /// `set_expn_data`). It is *not* called for foreign `ExpnId`s deserialized /// from another crate's metadata - since `ExpnHash` includes the stable crate id, /// collisions are only possible between `ExpnId`s within the same crate. -fn update_disambiguator(expn_id: LocalExpnId, mut ctx: impl HashStableContext) { - let mut expn_data = expn_id.expn_data(); +fn update_disambiguator(expn_data: &mut ExpnData, mut ctx: impl HashStableContext) -> ExpnHash { // This disambiguator should not have been set yet. assert_eq!( expn_data.disambiguator, 0, @@ -1433,8 +1440,7 @@ fn update_disambiguator(expn_id: LocalExpnId, mut ctx: impl HashStableContext) { }); if disambiguator != 0 { - debug!("Set disambiguator for {:?} (hash {:?})", expn_id, expn_hash); - debug!("expn_data = {:?}", expn_data); + debug!("Set disambiguator for expn_data={:?} expn_hash={:?}", expn_data, expn_hash); expn_data.disambiguator = disambiguator; expn_hash = expn_data.hash_expn(&mut ctx); @@ -1450,15 +1456,7 @@ fn update_disambiguator(expn_id: LocalExpnId, mut ctx: impl HashStableContext) { }); } - let expn_hash = - ExpnHash::new(ctx.def_path_hash(LOCAL_CRATE.as_def_id()).stable_crate_id(), expn_hash); - HygieneData::with(|data| { - data.local_expn_data[expn_id].as_mut().unwrap().disambiguator = disambiguator; - debug_assert_eq!(data.local_expn_hashes[expn_id].0, Fingerprint::ZERO); - data.local_expn_hashes[expn_id] = expn_hash; - let _old_id = data.expn_hash_to_expn_id.insert(expn_hash, expn_id.to_expn_id()); - debug_assert!(_old_id.is_none()); - }); + ExpnHash::new(ctx.def_path_hash(LOCAL_CRATE.as_def_id()).stable_crate_id(), expn_hash) } impl<CTX: HashStableContext> HashStable<CTX> for SyntaxContext { |
