]>
Commit | Line | Data |
---|---|---|
f20569fa XL |
1 | //! Calculation and management of a Strict Version Hash for crates |
2 | //! | |
3 | //! The SVH is used for incremental compilation to track when HIR | |
4 | //! nodes have changed between compilations, and also to detect | |
5 | //! mismatches where we have two versions of the same crate that were | |
6 | //! compiled from distinct sources. | |
7 | ||
8 | use rustc_serialize::{Decodable, Decoder, Encodable, Encoder}; | |
9 | use std::fmt; | |
10 | use std::hash::{Hash, Hasher}; | |
11 | ||
12 | use crate::stable_hasher; | |
13 | ||
14 | #[derive(Copy, Clone, PartialEq, Eq, Debug)] | |
15 | pub struct Svh { | |
16 | hash: u64, | |
17 | } | |
18 | ||
19 | impl Svh { | |
20 | /// Creates a new `Svh` given the hash. If you actually want to | |
21 | /// compute the SVH from some HIR, you want the `calculate_svh` | |
22 | /// function found in `librustc_incremental`. | |
23 | pub fn new(hash: u64) -> Svh { | |
24 | Svh { hash } | |
25 | } | |
26 | ||
27 | pub fn as_u64(&self) -> u64 { | |
28 | self.hash | |
29 | } | |
30 | ||
31 | pub fn to_string(&self) -> String { | |
32 | format!("{:016x}", self.hash) | |
33 | } | |
34 | } | |
35 | ||
36 | impl Hash for Svh { | |
37 | fn hash<H>(&self, state: &mut H) | |
38 | where | |
39 | H: Hasher, | |
40 | { | |
41 | self.hash.to_le().hash(state); | |
42 | } | |
43 | } | |
44 | ||
45 | impl fmt::Display for Svh { | |
46 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | |
47 | f.pad(&self.to_string()) | |
48 | } | |
49 | } | |
50 | ||
51 | impl<S: Encoder> Encodable<S> for Svh { | |
52 | fn encode(&self, s: &mut S) -> Result<(), S::Error> { | |
53 | s.emit_u64(self.as_u64().to_le()) | |
54 | } | |
55 | } | |
56 | ||
57 | impl<D: Decoder> Decodable<D> for Svh { | |
58 | fn decode(d: &mut D) -> Result<Svh, D::Error> { | |
59 | d.read_u64().map(u64::from_le).map(Svh::new) | |
60 | } | |
61 | } | |
62 | ||
63 | impl<T> stable_hasher::HashStable<T> for Svh { | |
64 | #[inline] | |
65 | fn hash_stable(&self, ctx: &mut T, hasher: &mut stable_hasher::StableHasher) { | |
66 | let Svh { hash } = *self; | |
67 | hash.hash_stable(ctx, hasher); | |
68 | } | |
69 | } |