about summary refs log tree commit diff
path: root/library/alloc/src
diff options
context:
space:
mode:
authorStein Somers <git@steinsomers.be>2020-10-01 15:02:40 +0200
committerStein Somers <git@steinsomers.be>2020-10-20 13:58:11 +0200
commit7829e1889961cdcabfd327a2e71366a832fd2b0d (patch)
tree372a41ff8fb727aa45c516b9d6cc689a4d129d6f /library/alloc/src
parentc9b52100d5b2284a8d801d722a2941f56decdeac (diff)
downloadrust-7829e1889961cdcabfd327a2e71366a832fd2b0d.tar.gz
rust-7829e1889961cdcabfd327a2e71366a832fd2b0d.zip
BTreeMap: reuse BoxedNode instances directly instead of their contents
Diffstat (limited to 'library/alloc/src')
-rw-r--r--library/alloc/src/collections/btree/node.rs10
1 files changed, 3 insertions, 7 deletions
diff --git a/library/alloc/src/collections/btree/node.rs b/library/alloc/src/collections/btree/node.rs
index cf7961cbbfc..17ac5195fa7 100644
--- a/library/alloc/src/collections/btree/node.rs
+++ b/library/alloc/src/collections/btree/node.rs
@@ -127,10 +127,6 @@ impl<K, V> BoxedNode<K, V> {
         BoxedNode { ptr: Unique::from(&mut Box::leak(node).data) }
     }
 
-    unsafe fn from_ptr(ptr: NonNull<LeafNode<K, V>>) -> Self {
-        BoxedNode { ptr: unsafe { Unique::new_unchecked(ptr.as_ptr()) } }
-    }
-
     fn as_ptr(&self) -> NonNull<LeafNode<K, V>> {
         NonNull::from(self.ptr)
     }
@@ -198,7 +194,7 @@ impl<K, V> Root<K, V> {
     /// and is the opposite of `pop_internal_level`.
     pub fn push_internal_level(&mut self) -> NodeRef<marker::Mut<'_>, K, V, marker::Internal> {
         let mut new_node = Box::new(unsafe { InternalNode::new() });
-        new_node.edges[0].write(unsafe { BoxedNode::from_ptr(self.node.as_ptr()) });
+        new_node.edges[0].write(unsafe { ptr::read(&mut self.node) });
 
         self.node = BoxedNode::from_internal(new_node);
         self.height += 1;
@@ -224,8 +220,8 @@ impl<K, V> Root<K, V> {
 
         let top = self.node.ptr;
 
-        let internal_node = unsafe { self.internal_node_as_mut() };
-        self.node = unsafe { BoxedNode::from_ptr(internal_node.first_edge().descend().node) };
+        let mut internal_node = unsafe { self.internal_node_as_mut() };
+        self.node = unsafe { internal_node.as_internal_mut().edges[0].assume_init_read() };
         self.height -= 1;
         self.node_as_mut().as_leaf_mut().parent = None;