diff options
| author | Tim Taubert <tim@timtaubert.de> | 2012-12-15 02:03:35 +0100 |
|---|---|---|
| committer | Tim Taubert <tim@timtaubert.de> | 2012-12-15 18:45:40 +0100 |
| commit | 2f3d4f61817fcfe48c03990f94175258bdbcc0cb (patch) | |
| tree | 1e5abc000ec9f2ba4812d4b9d3c06d086cc74bf6 /src/libcore/uint-template.rs | |
| parent | dbc52ce505eb5da181a658606a6129962a90c403 (diff) | |
rewrite uint::to_str_bytes to avoid raw pointers
Diffstat (limited to 'src/libcore/uint-template.rs')
| -rw-r--r-- | src/libcore/uint-template.rs | 48 |
1 files changed, 20 insertions, 28 deletions
diff --git a/src/libcore/uint-template.rs b/src/libcore/uint-template.rs index a7d37c3ae61..17a2b02647e 100644 --- a/src/libcore/uint-template.rs +++ b/src/libcore/uint-template.rs @@ -179,7 +179,7 @@ pub pure fn to_str_bytes<U>(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<U>(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 |
