Rollup merge of #125606 - diondokter:opt-size-int-fmt, r=cuviper · model-checking/verify-rust-std@3b60335 (original) (raw)
`@@ -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:identviau:ident via u:identviaconv_fn:ident named $name:ident) => {
`
``
215
`+
#[cfg(not(feature = "optimize_for_size"))]
`
215
216
`fn name(mutn:name(mut n: name(mutn: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::::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(mutn:name(mut n: name(mutn: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::::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)]
`