From 28d5d2fad06688164946cea250e23516cabc3541 Mon Sep 17 00:00:00 2001 From: Andrew Paseltiner <apaseltiner@gmail.com> Date: Sun, 9 Aug 2015 21:52:43 -0400 Subject: [PATCH] Remove transmute from `btree::node::Node::as_slices_internal_mut` Closes #27620. --- src/libcollections/btree/node.rs | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/libcollections/btree/node.rs b/src/libcollections/btree/node.rs index e0018efe9e0..37f235c1c7b 100644 --- a/src/libcollections/btree/node.rs +++ b/src/libcollections/btree/node.rs @@ -390,8 +390,29 @@ impl<K, V> Node<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]