about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2015-08-18 18:41:17 +0000
committerbors <bors@rust-lang.org>2015-08-18 18:41:17 +0000
commit6c11e4a48ec3ac385f32da1879384bc6921bdf75 (patch)
tree2b860588b5cf8e89b9c525758f59c2896ed1bbf2
parentdc9b74f38d2824d929660deabd5e78e39dcea2c5 (diff)
parent28d5d2fad06688164946cea250e23516cabc3541 (diff)
Auto merge of #27624 - apasel422:issue-27620, r=Gankro
Closes #27620.
-rw-r--r--src/libcollections/btree/node.rs25
1 files changed, 23 insertions, 2 deletions
diff --git a/src/libcollections/btree/node.rs b/src/libcollections/btree/node.rs
index 7b544078d5b..ab343430296 100644
--- a/src/libcollections/btree/node.rs
+++ b/src/libcollections/btree/node.rs
@@ -387,8 +387,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]