Skip to content

Commit 723ca2a

Browse files
committed
Factor out more repeated code in {write,read}_leb128!.
Make them generate the entire function, not just the function body.
1 parent 4ac959a commit 723ca2a

File tree

1 file changed

+44
-95
lines changed

1 file changed

+44
-95
lines changed

compiler/rustc_serialize/src/opaque.rs

+44-95
Original file line numberDiff line numberDiff line change
@@ -266,51 +266,40 @@ impl Drop for FileEncoder {
266266
}
267267

268268
macro_rules! write_leb128 {
269-
($enc:expr, $value:expr, $int_ty:ty, $fun:ident) => {{
270-
const MAX_ENCODED_LEN: usize = $crate::leb128::max_leb128_len::<$int_ty>();
269+
($this_fn:ident, $int_ty:ty, $write_leb_fn:ident) => {
270+
#[inline]
271+
fn $this_fn(&mut self, v: $int_ty) {
272+
const MAX_ENCODED_LEN: usize = $crate::leb128::max_leb128_len::<$int_ty>();
271273

272-
// We ensure this during `FileEncoder` construction.
273-
debug_assert!($enc.capacity() >= MAX_ENCODED_LEN);
274+
// We ensure this during `FileEncoder` construction.
275+
debug_assert!(self.capacity() >= MAX_ENCODED_LEN);
274276

275-
let mut buffered = $enc.buffered;
277+
let mut buffered = self.buffered;
276278

277-
// This can't overflow. See assertion in `FileEncoder::with_capacity`.
278-
if std::intrinsics::unlikely(buffered + MAX_ENCODED_LEN > $enc.capacity()) {
279-
$enc.flush();
280-
buffered = 0;
281-
}
279+
// This can't overflow. See assertion in `FileEncoder::with_capacity`.
280+
if std::intrinsics::unlikely(buffered + MAX_ENCODED_LEN > self.capacity()) {
281+
self.flush();
282+
buffered = 0;
283+
}
282284

283-
// SAFETY: The above check and flush ensures that there is enough
284-
// room to write the encoded value to the buffer.
285-
let buf = unsafe {
286-
&mut *($enc.buf.as_mut_ptr().add(buffered) as *mut [MaybeUninit<u8>; MAX_ENCODED_LEN])
287-
};
285+
// SAFETY: The above check and flush ensures that there is enough
286+
// room to write the encoded value to the buffer.
287+
let buf = unsafe {
288+
&mut *(self.buf.as_mut_ptr().add(buffered)
289+
as *mut [MaybeUninit<u8>; MAX_ENCODED_LEN])
290+
};
288291

289-
let encoded = leb128::$fun(buf, $value);
290-
$enc.buffered = buffered + encoded.len();
291-
}};
292+
let encoded = leb128::$write_leb_fn(buf, v);
293+
self.buffered = buffered + encoded.len();
294+
}
295+
};
292296
}
293297

294298
impl Encoder for FileEncoder {
295-
#[inline]
296-
fn emit_usize(&mut self, v: usize) {
297-
write_leb128!(self, v, usize, write_usize_leb128)
298-
}
299-
300-
#[inline]
301-
fn emit_u128(&mut self, v: u128) {
302-
write_leb128!(self, v, u128, write_u128_leb128)
303-
}
304-
305-
#[inline]
306-
fn emit_u64(&mut self, v: u64) {
307-
write_leb128!(self, v, u64, write_u64_leb128)
308-
}
309-
310-
#[inline]
311-
fn emit_u32(&mut self, v: u32) {
312-
write_leb128!(self, v, u32, write_u32_leb128)
313-
}
299+
write_leb128!(emit_usize, usize, write_usize_leb128);
300+
write_leb128!(emit_u128, u128, write_u128_leb128);
301+
write_leb128!(emit_u64, u64, write_u64_leb128);
302+
write_leb128!(emit_u32, u32, write_u32_leb128);
314303

315304
#[inline]
316305
fn emit_u16(&mut self, v: u16) {
@@ -322,25 +311,10 @@ impl Encoder for FileEncoder {
322311
self.write_one(v);
323312
}
324313

325-
#[inline]
326-
fn emit_isize(&mut self, v: isize) {
327-
write_leb128!(self, v, isize, write_isize_leb128)
328-
}
329-
330-
#[inline]
331-
fn emit_i128(&mut self, v: i128) {
332-
write_leb128!(self, v, i128, write_i128_leb128)
333-
}
334-
335-
#[inline]
336-
fn emit_i64(&mut self, v: i64) {
337-
write_leb128!(self, v, i64, write_i64_leb128)
338-
}
339-
340-
#[inline]
341-
fn emit_i32(&mut self, v: i32) {
342-
write_leb128!(self, v, i32, write_i32_leb128)
343-
}
314+
write_leb128!(emit_isize, isize, write_isize_leb128);
315+
write_leb128!(emit_i128, i128, write_i128_leb128);
316+
write_leb128!(emit_i64, i64, write_i64_leb128);
317+
write_leb128!(emit_i32, i32, write_i32_leb128);
344318

345319
#[inline]
346320
fn emit_i16(&mut self, v: i16) {
@@ -437,29 +411,19 @@ impl<'a> MemDecoder<'a> {
437411
}
438412

439413
macro_rules! read_leb128 {
440-
($dec:expr, $fun:ident) => {{ leb128::$fun($dec) }};
414+
($this_fn:ident, $int_ty:ty, $read_leb_fn:ident) => {
415+
#[inline]
416+
fn $this_fn(&mut self) -> $int_ty {
417+
leb128::$read_leb_fn(self)
418+
}
419+
};
441420
}
442421

443422
impl<'a> Decoder for MemDecoder<'a> {
444-
#[inline]
445-
fn read_usize(&mut self) -> usize {
446-
read_leb128!(self, read_usize_leb128)
447-
}
448-
449-
#[inline]
450-
fn read_u128(&mut self) -> u128 {
451-
read_leb128!(self, read_u128_leb128)
452-
}
453-
454-
#[inline]
455-
fn read_u64(&mut self) -> u64 {
456-
read_leb128!(self, read_u64_leb128)
457-
}
458-
459-
#[inline]
460-
fn read_u32(&mut self) -> u32 {
461-
read_leb128!(self, read_u32_leb128)
462-
}
423+
read_leb128!(read_usize, usize, read_usize_leb128);
424+
read_leb128!(read_u128, u128, read_u128_leb128);
425+
read_leb128!(read_u64, u64, read_u64_leb128);
426+
read_leb128!(read_u32, u32, read_u32_leb128);
463427

464428
#[inline]
465429
fn read_u16(&mut self) -> u16 {
@@ -479,25 +443,10 @@ impl<'a> Decoder for MemDecoder<'a> {
479443
}
480444
}
481445

482-
#[inline]
483-
fn read_isize(&mut self) -> isize {
484-
read_leb128!(self, read_isize_leb128)
485-
}
486-
487-
#[inline]
488-
fn read_i128(&mut self) -> i128 {
489-
read_leb128!(self, read_i128_leb128)
490-
}
491-
492-
#[inline]
493-
fn read_i64(&mut self) -> i64 {
494-
read_leb128!(self, read_i64_leb128)
495-
}
496-
497-
#[inline]
498-
fn read_i32(&mut self) -> i32 {
499-
read_leb128!(self, read_i32_leb128)
500-
}
446+
read_leb128!(read_isize, isize, read_isize_leb128);
447+
read_leb128!(read_i128, i128, read_i128_leb128);
448+
read_leb128!(read_i64, i64, read_i64_leb128);
449+
read_leb128!(read_i32, i32, read_i32_leb128);
501450

502451
#[inline]
503452
fn read_i16(&mut self) -> i16 {

0 commit comments

Comments
 (0)