|
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,16 @@ 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 | +impl rustc_serialize::UseSpecializedEncodable for CrateNum { |
| 91 | + fn default_encode<E: Encoder>(&self, e: &mut E) -> Result<(), E::Error> { |
| 92 | + e.emit_u32(self.as_u32()) |
| 93 | + } |
| 94 | +} |
| 95 | +impl rustc_serialize::UseSpecializedDecodable for CrateNum { |
| 96 | + fn default_decode<D: Decoder>(d: &mut D) -> Result<CrateNum, D::Error> { |
| 97 | + Ok(CrateNum::from_u32(d.read_u32()?)) |
| 98 | + } |
| 99 | +} |
91 | 100 |
|
92 | 101 | rustc_index::newtype_index! {
|
93 | 102 | /// A DefIndex is an index into the hir-map for a crate, identifying a
|
@@ -135,8 +144,21 @@ impl DefId {
|
135 | 144 | }
|
136 | 145 | }
|
137 | 146 |
|
138 |
| -impl rustc_serialize::UseSpecializedEncodable for DefId {} |
139 |
| -impl rustc_serialize::UseSpecializedDecodable for DefId {} |
| 147 | +impl rustc_serialize::UseSpecializedEncodable for DefId { |
| 148 | + fn default_encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { |
| 149 | + let krate = u64::from(self.krate.as_u32()); |
| 150 | + let index = u64::from(self.index.as_u32()); |
| 151 | + s.emit_u64((krate << 32) | index) |
| 152 | + } |
| 153 | +} |
| 154 | +impl rustc_serialize::UseSpecializedDecodable for DefId { |
| 155 | + fn default_decode<D: Decoder>(d: &mut D) -> Result<DefId, D::Error> { |
| 156 | + let def_id = d.read_u64()?; |
| 157 | + let krate = CrateNum::from_u32((def_id >> 32) as u32); |
| 158 | + let index = DefIndex::from_u32((def_id & 0xffffffff) as u32); |
| 159 | + Ok(DefId { krate, index }) |
| 160 | + } |
| 161 | +} |
140 | 162 |
|
141 | 163 | pub fn default_def_id_debug(def_id: DefId, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
142 | 164 | f.debug_struct("DefId").field("krate", &def_id.krate).field("index", &def_id.index).finish()
|
|
0 commit comments