@@ -212,6 +212,7 @@ static DEC_DIGITS_LUT: &[u8; 200] = b"0001020304050607080910111213141516171819\
212
212
213
213
macro_rules! impl_Display {
214
214
( $( $t: ident) ,* as $u: ident via $conv_fn: ident named $name: ident) => {
215
+ #[ cfg( not( feature = "optimize_for_size" ) ) ]
215
216
fn $name( mut n: $u, is_nonnegative: bool , f: & mut fmt:: Formatter <' _>) -> fmt:: Result {
216
217
// 2^128 is about 3*10^38, so 39 gives an extra byte of space
217
218
let mut buf = [ MaybeUninit :: <u8 >:: uninit( ) ; 39 ] ;
@@ -277,6 +278,38 @@ macro_rules! impl_Display {
277
278
f. pad_integral( is_nonnegative, "" , buf_slice)
278
279
}
279
280
281
+ #[ cfg( feature = "optimize_for_size" ) ]
282
+ fn $name( mut n: $u, is_nonnegative: bool , f: & mut fmt:: Formatter <' _>) -> fmt:: Result {
283
+ // 2^128 is about 3*10^38, so 39 gives an extra byte of space
284
+ let mut buf = [ MaybeUninit :: <u8 >:: uninit( ) ; 39 ] ;
285
+ let mut curr = buf. len( ) ;
286
+ let buf_ptr = MaybeUninit :: slice_as_mut_ptr( & mut buf) ;
287
+
288
+ // SAFETY: To show that it's OK to copy into `buf_ptr`, notice that at the beginning
289
+ // `curr == buf.len() == 39 > log(n)` since `n < 2^128 < 10^39`, and at
290
+ // each step this is kept the same as `n` is divided. Since `n` is always
291
+ // non-negative, this means that `curr > 0` so `buf_ptr[curr..curr + 1]`
292
+ // is safe to access.
293
+ unsafe {
294
+ loop {
295
+ curr -= 1 ;
296
+ buf_ptr. add( curr) . write( ( n % 10 ) as u8 + b'0' ) ;
297
+ n /= 10 ;
298
+
299
+ if n == 0 {
300
+ break ;
301
+ }
302
+ }
303
+ }
304
+
305
+ // SAFETY: `curr` > 0 (since we made `buf` large enough), and all the chars are valid UTF-8
306
+ let buf_slice = unsafe {
307
+ str :: from_utf8_unchecked(
308
+ slice:: from_raw_parts( buf_ptr. add( curr) , buf. len( ) - curr) )
309
+ } ;
310
+ f. pad_integral( is_nonnegative, "" , buf_slice)
311
+ }
312
+
280
313
$( #[ stable( feature = "rust1" , since = "1.0.0" ) ]
281
314
impl fmt:: Display for $t {
282
315
#[ allow( unused_comparisons) ]
0 commit comments