From e1a26ad2713994ccba65d62ca64a2eb5db4eaf81 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Tue, 15 Oct 2013 00:37:32 -0400 Subject: 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. --- src/libstd/rand/mod.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'src/libstd/rand') 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 = unsafe { cast::transmute_copy(&dest) }; + slice.len /= size_of::(); + 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 = unsafe { cast::transmute_copy(&dest) }; + slice.len /= size_of::(); + let as_u32: &mut [u32] = unsafe { cast::transmute(slice) }; as_u32[as_u32.len() - 1] = self.next_u32(); remaining -= 4; } -- cgit 1.4.1-3-g733a5