From 2f3d4f61817fcfe48c03990f94175258bdbcc0cb Mon Sep 17 00:00:00 2001 From: Tim Taubert Date: Sat, 15 Dec 2012 02:03:35 +0100 Subject: [PATCH] rewrite uint::to_str_bytes to avoid raw pointers --- src/libcore/uint-template.rs | 48 +++++++++++++++--------------------- 1 file changed, 20 insertions(+), 28 deletions(-) diff --git a/src/libcore/uint-template.rs b/src/libcore/uint-template.rs index a7d37c3ae61ab..17a2b02647e45 100644 --- a/src/libcore/uint-template.rs +++ b/src/libcore/uint-template.rs @@ -179,7 +179,7 @@ pub pure fn to_str_bytes(neg: bool, num: T, radix: uint, f: fn(v: &[u8]) -> U) -> U { #[inline(always)] - fn digit(n: T) -> u8 { + pure fn digit(n: T) -> u8 { if n <= 9u as T { n as u8 + '0' as u8 } else if n <= 15u as T { @@ -195,35 +195,27 @@ pub pure fn to_str_bytes(neg: bool, num: T, radix: uint, // Worst case: 64-bit number, binary-radix, with // a leading negative sign = 65 bytes. let buf : [mut u8 * 65] = [mut 0u8, ..65]; + let len = buf.len(); - // FIXME (#2649): post-snapshot, you can do this without the raw - // pointers and unsafe bits, and the codegen will prove it's all - // in-bounds, no extra cost. - - unsafe { - do vec::as_imm_buf(buf) |p, len| { - let mp = p as *mut u8; - let mut i = len; - let mut n = num; - let radix = radix as T; - loop { - i -= 1u; - assert 0u < i && i < len; - *ptr::mut_offset(mp, i) = digit(n % radix); - n /= radix; - if n == 0 as T { break; } - } - - assert 0u < i && i < len; - - if neg { - i -= 1u; - *ptr::mut_offset(mp, i) = '-' as u8; - } - - vec::raw::buf_as_slice(ptr::offset(p, i), len - i, f) - } + let mut i = len; + let mut n = num; + let radix = radix as T; + loop { + i -= 1u; + assert 0u < i && i < len; + buf[i] = digit(n % radix); + n /= radix; + if n == 0 as T { break; } + } + + assert 0u < i && i < len; + + if neg { + i -= 1u; + buf[i] = '-' as u8; } + + f(vec::view(buf, i, len)) } /// Convert to a string