about summary refs log tree commit diff
diff options
context:
space:
mode:
authorCamille GILLOT <gillot.camille@gmail.com>2021-03-18 18:54:01 +0100
committerCamille GILLOT <gillot.camille@gmail.com>2021-03-18 20:09:00 +0100
commite5d09fbbe99f87efdb9ed23d6770fa0f62fdffcf (patch)
tree77f4aff3d3de7214d23350cb7f2149544aa28c1a
parent5003b3dc31d422dd568eaa6d8339ecdb0df2c526 (diff)
downloadrust-e5d09fbbe99f87efdb9ed23d6770fa0f62fdffcf.tar.gz
rust-e5d09fbbe99f87efdb9ed23d6770fa0f62fdffcf.zip
Simplify IntEncodedWithFixedSize.
-rw-r--r--compiler/rustc_serialize/src/lib.rs2
-rw-r--r--compiler/rustc_serialize/src/opaque.rs18
2 files changed, 7 insertions, 13 deletions
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<Encoder> 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<Encoder> for IntEncodedWithFixedSize {
 impl serialize::Encodable<FileEncoder> 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<FileEncoder> for IntEncodedWithFixedSize {
 
 impl<'a> serialize::Decodable<Decoder<'a>> for IntEncodedWithFixedSize {
     fn decode(decoder: &mut Decoder<'a>) -> Result<IntEncodedWithFixedSize, String> {
-        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))
     }
 }