]> git.lizzy.rs Git - rust.git/commitdiff
Remove transmute from `btree::node::Node::as_slices_internal_mut`
authorAndrew Paseltiner <apaseltiner@gmail.com>
Mon, 10 Aug 2015 01:52:43 +0000 (21:52 -0400)
committerAndrew Paseltiner <apaseltiner@gmail.com>
Mon, 10 Aug 2015 21:30:35 +0000 (17:30 -0400)
Closes #27620.

src/libcollections/btree/node.rs

index e0018efe9e0ddfc6c595b8a036235eb50c974eb0..37f235c1c7b9d8ad31ea5ed87a67a91aa38bbc2d 100644 (file)
@@ -390,8 +390,29 @@ pub fn as_slices_internal<'b>(&'b self) -> NodeSlice<'b, K, V> {
 
     #[inline]
     pub fn as_slices_internal_mut<'b>(&'b mut self) -> MutNodeSlice<'b, K, V> {
-        // FIXME(#27620): Bad: This relies on structure layout!
-        unsafe { mem::transmute(self.as_slices_internal()) }
+        let len = self.len();
+        let is_leaf = self.is_leaf();
+        let keys = unsafe { slice::from_raw_parts_mut(*self.keys, len) };
+        let vals = unsafe { slice::from_raw_parts_mut(*self.vals, len) };
+        let edges: &mut [_] = if is_leaf {
+            &mut []
+        } else {
+            unsafe {
+                let data = match self.edges {
+                    None => heap::EMPTY as *mut Node<K,V>,
+                    Some(ref mut p) => **p as *mut Node<K,V>,
+                };
+                slice::from_raw_parts_mut(data, len + 1)
+            }
+        };
+        MutNodeSlice {
+            keys: keys,
+            vals: vals,
+            edges: edges,
+            head_is_edge: true,
+            tail_is_edge: true,
+            has_edges: !is_leaf,
+        }
     }
 
     #[inline]