about summary refs log tree commit diff
path: root/src/libstd/rand
diff options
context:
space:
mode:
authorDaniel Micay <danielmicay@gmail.com>2013-10-15 00:37:32 -0400
committerDaniel Micay <danielmicay@gmail.com>2013-10-15 16:23:28 -0400
commite1a26ad2713994ccba65d62ca64a2eb5db4eaf81 (patch)
treef7727d6f22617258d6a5e05917defc459418af0c /src/libstd/rand
parentaa93381e1459c5e739fab400ce8f5f83c9466804 (diff)
downloadrust-e1a26ad2713994ccba65d62ca64a2eb5db4eaf81.tar.gz
rust-e1a26ad2713994ccba65d62ca64a2eb5db4eaf81.zip
use element count in slices, not size in bytes
This allows the indexing bounds check or other comparisons against an
element length to avoid a multiplication by the size.
Diffstat (limited to 'src/libstd/rand')
-rw-r--r--src/libstd/rand/mod.rs14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/libstd/rand/mod.rs b/src/libstd/rand/mod.rs
index b800c7b03af..1e76effd0d2 100644
--- a/src/libstd/rand/mod.rs
+++ b/src/libstd/rand/mod.rs
@@ -52,6 +52,8 @@ fn main () {
  ```
 */
 
+use sys::size_of;
+use unstable::raw::Slice;
 use cast;
 use container::Container;
 use iter::{Iterator, range};
@@ -133,10 +135,10 @@ pub trait Rng {
     ///    println!("{:?}", v);
     /// }
     /// ```
-    fn fill_bytes(&mut self, mut dest: &mut [u8]) {
-        // this relies on the lengths being transferred correctly when
-        // transmuting between vectors like this.
-        let as_u64: &mut &mut [u64] = unsafe { cast::transmute(&mut dest) };
+    fn fill_bytes(&mut self, dest: &mut [u8]) {
+        let mut slice: Slice<u64> = unsafe { cast::transmute_copy(&dest) };
+        slice.len /= size_of::<u64>();
+        let as_u64: &mut [u64] = unsafe { cast::transmute(slice) };
         for dest in as_u64.mut_iter() {
             *dest = self.next_u64();
         }
@@ -147,7 +149,9 @@ pub trait Rng {
 
         // space for a u32
         if remaining >= 4 {
-            let as_u32: &mut &mut [u32] = unsafe { cast::transmute(&mut dest) };
+            let mut slice: Slice<u32> = unsafe { cast::transmute_copy(&dest) };
+            slice.len /= size_of::<u32>();
+            let as_u32: &mut [u32] = unsafe { cast::transmute(slice) };
             as_u32[as_u32.len() - 1] = self.next_u32();
             remaining -= 4;
         }