about summary refs log tree commit diff
path: root/src/libcore/uint-template.rs
diff options
context:
space:
mode:
authorTim Taubert <tim@timtaubert.de>2012-12-15 02:03:35 +0100
committerTim Taubert <tim@timtaubert.de>2012-12-15 18:45:40 +0100
commit2f3d4f61817fcfe48c03990f94175258bdbcc0cb (patch)
tree1e5abc000ec9f2ba4812d4b9d3c06d086cc74bf6 /src/libcore/uint-template.rs
parentdbc52ce505eb5da181a658606a6129962a90c403 (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.rs48
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