|
1 | 1 | use rustc_data_structures::AtomicRef;
|
2 | 2 | use rustc_index::vec::Idx;
|
| 3 | +use rustc_serialize::{Decoder, Encoder}; |
3 | 4 | use std::fmt;
|
4 |
| -use std::u32; |
| 5 | +use std::{u32, u64}; |
5 | 6 |
|
6 | 7 | rustc_index::newtype_index! {
|
7 | 8 | pub struct CrateId {
|
@@ -86,8 +87,18 @@ impl fmt::Display for CrateNum {
|
86 | 87 | }
|
87 | 88 | }
|
88 | 89 |
|
89 |
| -impl rustc_serialize::UseSpecializedEncodable for CrateNum {} |
90 |
| -impl rustc_serialize::UseSpecializedDecodable for CrateNum {} |
| 90 | +/// As a local identifier, a `CrateNum` is only meaningful within its context, e.g. within a tcx. |
| 91 | +/// Therefore, make sure to include the context when encode a `CrateNum`. |
| 92 | +impl rustc_serialize::UseSpecializedEncodable for CrateNum { |
| 93 | + fn default_encode<E: Encoder>(&self, e: &mut E) -> Result<(), E::Error> { |
| 94 | + e.emit_u32(self.as_u32()) |
| 95 | + } |
| 96 | +} |
| 97 | +impl rustc_serialize::UseSpecializedDecodable for CrateNum { |
| 98 | + fn default_decode<D: Decoder>(d: &mut D) -> Result<CrateNum, D::Error> { |
| 99 | + Ok(CrateNum::from_u32(d.read_u32()?)) |
| 100 | + } |
| 101 | +} |
91 | 102 |
|
92 | 103 | rustc_index::newtype_index! {
|
93 | 104 | /// A DefIndex is an index into the hir-map for a crate, identifying a
|
@@ -135,8 +146,21 @@ impl DefId {
|
135 | 146 | }
|
136 | 147 | }
|
137 | 148 |
|
138 |
| -impl rustc_serialize::UseSpecializedEncodable for DefId {} |
139 |
| -impl rustc_serialize::UseSpecializedDecodable for DefId {} |
| 149 | +impl rustc_serialize::UseSpecializedEncodable for DefId { |
| 150 | + fn default_encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { |
| 151 | + let krate = u64::from(self.krate.as_u32()); |
| 152 | + let index = u64::from(self.index.as_u32()); |
| 153 | + s.emit_u64((krate << 32) | index) |
| 154 | + } |
| 155 | +} |
| 156 | +impl rustc_serialize::UseSpecializedDecodable for DefId { |
| 157 | + fn default_decode<D: Decoder>(d: &mut D) -> Result<DefId, D::Error> { |
| 158 | + let def_id = d.read_u64()?; |
| 159 | + let krate = CrateNum::from_u32((def_id >> 32) as u32); |
| 160 | + let index = DefIndex::from_u32((def_id & 0xffffffff) as u32); |
| 161 | + Ok(DefId { krate, index }) |
| 162 | + } |
| 163 | +} |
140 | 164 |
|
141 | 165 | pub fn default_def_id_debug(def_id: DefId, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
142 | 166 | f.debug_struct("DefId").field("krate", &def_id.krate).field("index", &def_id.index).finish()
|
|
0 commit comments