Auto merge of #83273 - cjgillot:endecode, r=michaelwoerister
Simplify encoder and decoder Extracted from https://github.com/rust-lang/rust/pull/83036 and https://github.com/rust-lang/rust/pull/82780.
This commit is contained in:
commit
d04c3aa865
11 changed files with 126 additions and 158 deletions
|
@ -472,6 +472,11 @@ macro_rules! implement_ty_decoder {
|
|||
read_str -> Cow<'_, str>;
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn read_raw_bytes(&mut self, bytes: &mut [std::mem::MaybeUninit<u8>]) -> Result<(), Self::Error> {
|
||||
self.opaque.read_raw_bytes(bytes)
|
||||
}
|
||||
|
||||
fn error(&mut self, err: &str) -> Self::Error {
|
||||
self.opaque.error(err)
|
||||
}
|
||||
|
|
|
@ -4,7 +4,6 @@ use crate::mir::{self, interpret};
|
|||
use crate::ty::codec::{RefDecodable, TyDecoder, TyEncoder};
|
||||
use crate::ty::context::TyCtxt;
|
||||
use crate::ty::{self, Ty};
|
||||
use rustc_data_structures::fingerprint::{Fingerprint, FingerprintDecoder, FingerprintEncoder};
|
||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexSet};
|
||||
use rustc_data_structures::sync::{HashMapExt, Lock, Lrc, OnceCell};
|
||||
use rustc_data_structures::thin_vec::ThinVec;
|
||||
|
@ -17,7 +16,7 @@ use rustc_index::vec::{Idx, IndexVec};
|
|||
use rustc_query_system::dep_graph::DepContext;
|
||||
use rustc_query_system::query::QueryContext;
|
||||
use rustc_serialize::{
|
||||
opaque::{self, FileEncodeResult, FileEncoder},
|
||||
opaque::{self, FileEncodeResult, FileEncoder, IntEncodedWithFixedSize},
|
||||
Decodable, Decoder, Encodable, Encoder,
|
||||
};
|
||||
use rustc_session::{CrateDisambiguator, Session};
|
||||
|
@ -913,12 +912,6 @@ impl<'a, 'tcx> Decodable<CacheDecoder<'a, 'tcx>> for DefId {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a, 'tcx> FingerprintDecoder for CacheDecoder<'a, 'tcx> {
|
||||
fn decode_fingerprint(&mut self) -> Result<Fingerprint, Self::Error> {
|
||||
Fingerprint::decode_opaque(&mut self.opaque)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'tcx> Decodable<CacheDecoder<'a, 'tcx>> for &'tcx FxHashSet<LocalDefId> {
|
||||
fn decode(d: &mut CacheDecoder<'a, 'tcx>) -> Result<Self, String> {
|
||||
RefDecodable::decode(d)
|
||||
|
@ -1011,12 +1004,6 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a, 'tcx, E: OpaqueEncoder> FingerprintEncoder for CacheEncoder<'a, 'tcx, E> {
|
||||
fn encode_fingerprint(&mut self, f: &Fingerprint) -> Result<(), E::Error> {
|
||||
self.encoder.encode_fingerprint(f)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'tcx, E> Encodable<CacheEncoder<'a, 'tcx, E>> for SyntaxContext
|
||||
where
|
||||
E: 'a + OpaqueEncoder,
|
||||
|
@ -1167,6 +1154,7 @@ where
|
|||
emit_f32(f32);
|
||||
emit_char(char);
|
||||
emit_str(&str);
|
||||
emit_raw_bytes(&[u8]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1180,42 +1168,6 @@ impl<'a, 'tcx> Encodable<CacheEncoder<'a, 'tcx, FileEncoder>> for [u8] {
|
|||
}
|
||||
}
|
||||
|
||||
// An integer that will always encode to 8 bytes.
|
||||
struct IntEncodedWithFixedSize(u64);
|
||||
|
||||
impl IntEncodedWithFixedSize {
|
||||
pub const ENCODED_SIZE: usize = 8;
|
||||
}
|
||||
|
||||
impl<E: OpaqueEncoder> Encodable<E> for IntEncodedWithFixedSize {
|
||||
fn encode(&self, e: &mut E) -> Result<(), E::Error> {
|
||||
let start_pos = e.position();
|
||||
for i in 0..IntEncodedWithFixedSize::ENCODED_SIZE {
|
||||
((self.0 >> (i * 8)) as u8).encode(e)?;
|
||||
}
|
||||
let end_pos = e.position();
|
||||
assert_eq!((end_pos - start_pos), IntEncodedWithFixedSize::ENCODED_SIZE);
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Decodable<opaque::Decoder<'a>> for IntEncodedWithFixedSize {
|
||||
fn decode(decoder: &mut opaque::Decoder<'a>) -> Result<IntEncodedWithFixedSize, String> {
|
||||
let mut value: u64 = 0;
|
||||
let start_pos = decoder.position();
|
||||
|
||||
for i in 0..IntEncodedWithFixedSize::ENCODED_SIZE {
|
||||
let byte: u8 = Decodable::decode(decoder)?;
|
||||
value |= (byte as u64) << (i * 8);
|
||||
}
|
||||
|
||||
let end_pos = decoder.position();
|
||||
assert_eq!((end_pos - start_pos), IntEncodedWithFixedSize::ENCODED_SIZE);
|
||||
|
||||
Ok(IntEncodedWithFixedSize(value))
|
||||
}
|
||||
}
|
||||
|
||||
pub fn encode_query_results<'a, 'tcx, CTX, Q>(
|
||||
tcx: CTX,
|
||||
encoder: &mut CacheEncoder<'a, 'tcx, FileEncoder>,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue