Skip to content
Permalink

Comparing changes

This is a direct comparison between two commits made in this repository or its related repositories. View the default comparison for this range or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: rust-lang/rust
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 7c03be7ae37dde80214f884374f1067e78c04c2b
Choose a base ref
..
head repository: rust-lang/rust
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 4c71f805606ce27ce85f7a87c68a9a3d1728b3f6
Choose a head ref
Showing with 26 additions and 22 deletions.
  1. +26 −22 src/libcore/slice.rs
48 changes: 26 additions & 22 deletions src/libcore/slice.rs
Original file line number Diff line number Diff line change
@@ -804,19 +804,21 @@ impl<'a, T> Iter<'a, T> {

// Helper function for Iter::nth
fn iter_nth(&mut self, n: usize) -> Option<&'a T> {
unsafe {
match self.as_slice().get(n) {
Some(elem_ref) => if mem::size_of::<T>() == 0 {
self.ptr = transmute((elem_ref as *const T) as usize + 1);
Some(& *(1 as *const T))
} else {
self.ptr = (elem_ref as *const T).offset(1);
match self.as_slice().get(n) {
Some(elem_ref) => if mem::size_of::<T>() == 0 {
unsafe {
self.ptr = transmute((elem_ref as *const _) as usize + 1);
Some(& *(1 as *const _))
}
} else {
unsafe {
self.ptr = (elem_ref as *const _).offset(1);
Some(elem_ref)
},
None => {
self.ptr = self.end;
None
}
},
None => {
self.ptr = self.end;
None
}
}
}
@@ -952,19 +954,21 @@ impl<'a, T> IterMut<'a, T> {

// Helper function for IterMut::nth
fn iter_nth(&mut self, n: usize) -> Option<&'a mut T> {
unsafe {
match make_mut_slice!(T => &'a mut [T]: self.ptr, self.end).get_mut(n) {
Some(elem_ref) => if mem::size_of::<T>() == 0 {
self.ptr = transmute((elem_ref as *mut T) as usize + 1);
Some(&mut *(1 as *mut T))
} else {
self.ptr = (elem_ref as *mut T).offset(1);
match make_mut_slice!(T => &'a mut [T]: self.ptr, self.end).get_mut(n) {
Some(elem_ref) => if mem::size_of::<T>() == 0 {
unsafe {
self.ptr = transmute((elem_ref as *mut _) as usize + 1);
Some(&mut *(1 as *mut _))
}
} else {
unsafe {
self.ptr = unsafe { (elem_ref as *mut _).offset(1) };
Some(elem_ref)
},
None => {
self.ptr = self.end;
None
}
},
None => {
self.ptr = self.end;
None
}
}
}