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)]

`