diff --git a/compiler/rustc_serialize/src/lib.rs b/compiler/rustc_serialize/src/lib.rs index e439ddcdaa9..40b9522949d 100644 --- a/compiler/rustc_serialize/src/lib.rs +++ b/compiler/rustc_serialize/src/lib.rs @@ -17,6 +17,8 @@ Core encoding and decoding interfaces. #![feature(vec_spare_capacity)] #![feature(core_intrinsics)] #![feature(int_bits_const)] +#![feature(maybe_uninit_array_assume_init)] +#![feature(maybe_uninit_uninit_array)] #![feature(maybe_uninit_slice)] #![feature(new_uninit)] #![cfg_attr(test, feature(test))] diff --git a/compiler/rustc_serialize/src/opaque.rs b/compiler/rustc_serialize/src/opaque.rs index 8d833dbf88e..6aad3f498e9 100644 --- a/compiler/rustc_serialize/src/opaque.rs +++ b/compiler/rustc_serialize/src/opaque.rs @@ -729,9 +729,7 @@ impl IntEncodedWithFixedSize { impl serialize::Encodable for IntEncodedWithFixedSize { fn encode(&self, e: &mut Encoder) -> EncodeResult { let start_pos = e.position(); - for i in 0..IntEncodedWithFixedSize::ENCODED_SIZE { - ((self.0 >> (i * 8)) as u8).encode(e)?; - } + e.emit_raw_bytes(&self.0.to_le_bytes()); let end_pos = e.position(); assert_eq!((end_pos - start_pos), IntEncodedWithFixedSize::ENCODED_SIZE); Ok(()) @@ -741,9 +739,7 @@ impl serialize::Encodable for IntEncodedWithFixedSize { impl serialize::Encodable for IntEncodedWithFixedSize { fn encode(&self, e: &mut FileEncoder) -> FileEncodeResult { let start_pos = e.position(); - for i in 0..IntEncodedWithFixedSize::ENCODED_SIZE { - ((self.0 >> (i * 8)) as u8).encode(e)?; - } + e.emit_raw_bytes(&self.0.to_le_bytes())?; let end_pos = e.position(); assert_eq!((end_pos - start_pos), IntEncodedWithFixedSize::ENCODED_SIZE); Ok(()) @@ -752,17 +748,13 @@ impl serialize::Encodable for IntEncodedWithFixedSize { impl<'a> serialize::Decodable> for IntEncodedWithFixedSize { fn decode(decoder: &mut Decoder<'a>) -> Result { - let mut value: u64 = 0; + let mut bytes = MaybeUninit::uninit_array(); let start_pos = decoder.position(); - - for i in 0..IntEncodedWithFixedSize::ENCODED_SIZE { - let byte: u8 = serialize::Decodable::decode(decoder)?; - value |= (byte as u64) << (i * 8); - } - + decoder.read_raw_bytes(&mut bytes)?; let end_pos = decoder.position(); assert_eq!((end_pos - start_pos), IntEncodedWithFixedSize::ENCODED_SIZE); + let value = u64::from_le_bytes(unsafe { MaybeUninit::array_assume_init(bytes) }); Ok(IntEncodedWithFixedSize(value)) } }