Skip to content

Commit 3aaf6ae

Browse files
authored
der: optimize compile-time: code reuse with encode_value_to_slice (#1940)
1 parent 7674d0c commit 3aaf6ae

File tree

6 files changed

+23
-30
lines changed

6 files changed

+23
-30
lines changed

der/src/asn1/any.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,6 @@ use crate::{
88
};
99
use core::cmp::Ordering;
1010

11-
#[cfg(feature = "alloc")]
12-
use crate::SliceWriter;
13-
1411
/// ASN.1 `ANY`: represents any explicitly tagged ASN.1 value.
1512
///
1613
/// This is a zero-copy reference type which borrows from the input data.
@@ -179,7 +176,7 @@ pub use self::allocating::Any;
179176
#[cfg(feature = "alloc")]
180177
mod allocating {
181178
use super::*;
182-
use crate::{BytesOwned, reader::read_value, referenced::*};
179+
use crate::{BytesOwned, encode::encode_value_to_slice, reader::read_value, referenced::*};
183180
use alloc::boxed::Box;
184181

185182
/// ASN.1 `ANY`: represents any explicitly tagged ASN.1 value.
@@ -242,9 +239,7 @@ mod allocating {
242239
{
243240
let encoded_len = usize::try_from(msg.value_len()?)?;
244241
let mut buf = vec![0u8; encoded_len];
245-
let mut writer = SliceWriter::new(&mut buf);
246-
msg.encode_value(&mut writer)?;
247-
writer.finish()?;
242+
encode_value_to_slice(&mut buf, msg)?;
248243
Any::new(msg.tag(), buf)
249244
}
250245

der/src/asn1/integer.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ pub(super) mod uint;
55

66
use core::{cmp::Ordering, mem::size_of};
77

8-
use crate::{EncodeValue, Result, SliceWriter};
8+
use crate::{EncodeValue, Result, encode::encode_value_to_slice};
99

1010
/// Is the highest bit of the first byte in the slice set to `1`? (if present)
1111
#[inline]
@@ -25,14 +25,12 @@ where
2525
debug_assert!(size_of::<T>() <= MAX_INT_SIZE);
2626

2727
let mut buf1 = [0u8; MAX_INT_SIZE];
28-
let mut encoder1 = SliceWriter::new(&mut buf1);
29-
a.encode_value(&mut encoder1)?;
30-
3128
let mut buf2 = [0u8; MAX_INT_SIZE];
32-
let mut encoder2 = SliceWriter::new(&mut buf2);
33-
b.encode_value(&mut encoder2)?;
3429

35-
Ok(encoder1.finish()?.cmp(encoder2.finish()?))
30+
let buf1 = encode_value_to_slice(&mut buf1, &a)?;
31+
let buf2 = encode_value_to_slice(&mut buf2, &b)?;
32+
33+
Ok(buf1.cmp(buf2))
3634
}
3735

3836
#[cfg(test)]

der/src/asn1/integer/int.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -311,9 +311,7 @@ mod allocating {
311311

312312
fn try_from(value: $int) -> $crate::Result<Self> {
313313
let mut buf = [0u8; 16];
314-
let mut writer = $crate::SliceWriter::new(&mut buf[..]);
315-
value.encode_value(&mut writer)?;
316-
let buf = writer.finish()?;
314+
let buf = $crate::encode::encode_value_to_slice(&mut buf, &value)?;
317315
Int::new(buf)
318316
}
319317
}

der/src/asn1/integer/uint.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -284,9 +284,7 @@ mod allocating {
284284

285285
fn try_from(value: $uint) -> $crate::Result<Self> {
286286
let mut buf = [0u8; 17];
287-
let mut writer = $crate::SliceWriter::new(&mut buf[..]);
288-
value.encode_value(&mut writer)?;
289-
let buf = writer.finish()?;
287+
let buf = $crate::encode::encode_value_to_slice(&mut buf, &value)?;
290288
Uint::new(buf)
291289
}
292290
}

der/src/encode.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,3 +164,13 @@ where
164164
T::encode_value(self, writer)
165165
}
166166
}
167+
168+
/// Encodes value only (without tag + length) to a slice.
169+
pub(crate) fn encode_value_to_slice<'a, T>(buf: &'a mut [u8], value: &T) -> Result<&'a [u8]>
170+
where
171+
T: EncodeValue,
172+
{
173+
let mut encoder = SliceWriter::new(buf);
174+
value.encode_value(&mut encoder)?;
175+
encoder.finish()
176+
}

der/src/length.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@
33
pub(crate) mod indefinite;
44

55
use self::indefinite::INDEFINITE_LENGTH_OCTET;
6-
use crate::{
7-
Decode, DerOrd, Encode, EncodingRules, Error, ErrorKind, Reader, Result, SliceWriter, Tag,
8-
Writer,
9-
};
6+
use crate::{Decode, DerOrd, Encode, EncodingRules, Error, ErrorKind, Reader, Result, Tag, Writer};
107
use core::{
118
cmp::Ordering,
129
fmt,
@@ -327,13 +324,10 @@ impl DerOrd for Length {
327324
let mut buf1 = [0u8; Self::MAX_SIZE];
328325
let mut buf2 = [0u8; Self::MAX_SIZE];
329326

330-
let mut encoder1 = SliceWriter::new(&mut buf1);
331-
encoder1.encode(self)?;
332-
333-
let mut encoder2 = SliceWriter::new(&mut buf2);
334-
encoder2.encode(other)?;
327+
let buf1 = self.encode_to_slice(&mut buf1)?;
328+
let buf2 = other.encode_to_slice(&mut buf2)?;
335329

336-
Ok(encoder1.finish()?.cmp(encoder2.finish()?))
330+
Ok(buf1.cmp(buf2))
337331
}
338332
}
339333

0 commit comments

Comments
 (0)