@@ -145,7 +145,7 @@ struct InternalNode<K, V> {
145145
146146 /// The pointers to the children of this node. `len + 1` of these are considered
147147 /// initialized and valid.
148- edges : [ BoxedNode < K , V > ; 2 * B ] ,
148+ edges : [ MaybeUninit < BoxedNode < K , V > > ; 2 * B ] ,
149149}
150150
151151impl < K , V > InternalNode < K , V > {
@@ -159,7 +159,10 @@ impl<K, V> InternalNode<K, V> {
159159 unsafe fn new ( ) -> Self {
160160 InternalNode {
161161 data : LeafNode :: new ( ) ,
162- edges : mem:: uninitialized ( )
162+ // Creating a `[MaybeUninit; N]` array by first creating a
163+ // `MaybeUninit<[MaybeUninit; N]>`; the `into_inner` is safe because the inner
164+ // array does not require initialization.
165+ edges : MaybeUninit :: uninitialized ( ) . into_inner ( ) ,
163166 }
164167 }
165168}
@@ -261,7 +264,7 @@ impl<K, V> Root<K, V> {
261264 -> NodeRef < marker:: Mut , K , V , marker:: Internal > {
262265 debug_assert ! ( !self . is_shared_root( ) ) ;
263266 let mut new_node = Box :: new ( unsafe { InternalNode :: new ( ) } ) ;
264- new_node. edges [ 0 ] = unsafe { BoxedNode :: from_ptr ( self . node . as_ptr ( ) ) } ;
267+ new_node. edges [ 0 ] . set ( unsafe { BoxedNode :: from_ptr ( self . node . as_ptr ( ) ) } ) ;
265268
266269 self . node = BoxedNode :: from_internal ( new_node) ;
267270 self . height += 1 ;
@@ -718,7 +721,7 @@ impl<'a, K, V> NodeRef<marker::Mut<'a>, K, V, marker::Internal> {
718721 unsafe {
719722 ptr:: write ( self . keys_mut ( ) . get_unchecked_mut ( idx) , key) ;
720723 ptr:: write ( self . vals_mut ( ) . get_unchecked_mut ( idx) , val) ;
721- ptr :: write ( self . as_internal_mut ( ) . edges . get_unchecked_mut ( idx + 1 ) , edge. node ) ;
724+ self . as_internal_mut ( ) . edges . get_unchecked_mut ( idx + 1 ) . set ( edge. node ) ;
722725
723726 ( * self . as_leaf_mut ( ) ) . len += 1 ;
724727
@@ -749,7 +752,7 @@ impl<'a, K, V> NodeRef<marker::Mut<'a>, K, V, marker::Internal> {
749752 slice_insert ( self . vals_mut ( ) , 0 , val) ;
750753 slice_insert (
751754 slice:: from_raw_parts_mut (
752- self . as_internal_mut ( ) . edges . as_mut_ptr ( ) ,
755+ MaybeUninit :: first_mut_ptr ( & mut self . as_internal_mut ( ) . edges ) ,
753756 self . len ( ) +1
754757 ) ,
755758 0 ,
@@ -778,7 +781,9 @@ impl<'a, K, V> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
778781 let edge = match self . reborrow_mut ( ) . force ( ) {
779782 ForceResult :: Leaf ( _) => None ,
780783 ForceResult :: Internal ( internal) => {
781- let edge = ptr:: read ( internal. as_internal ( ) . edges . get_unchecked ( idx + 1 ) ) ;
784+ let edge = ptr:: read (
785+ internal. as_internal ( ) . edges . get_unchecked ( idx + 1 ) . as_ptr ( )
786+ ) ;
782787 let mut new_root = Root { node : edge, height : internal. height - 1 } ;
783788 ( * new_root. as_mut ( ) . as_leaf_mut ( ) ) . parent = ptr:: null ( ) ;
784789 Some ( new_root)
@@ -806,7 +811,7 @@ impl<'a, K, V> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
806811 ForceResult :: Internal ( mut internal) => {
807812 let edge = slice_remove (
808813 slice:: from_raw_parts_mut (
809- internal. as_internal_mut ( ) . edges . as_mut_ptr ( ) ,
814+ MaybeUninit :: first_mut_ptr ( & mut internal. as_internal_mut ( ) . edges ) ,
810815 old_len+1
811816 ) ,
812817 0
@@ -1085,7 +1090,7 @@ impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>, marker::
10851090
10861091 slice_insert (
10871092 slice:: from_raw_parts_mut (
1088- self . node . as_internal_mut ( ) . edges . as_mut_ptr ( ) ,
1093+ MaybeUninit :: first_mut_ptr ( & mut self . node . as_internal_mut ( ) . edges ) ,
10891094 self . node . len ( )
10901095 ) ,
10911096 self . idx + 1 ,
@@ -1140,7 +1145,9 @@ impl<BorrowType, K, V>
11401145 pub fn descend ( self ) -> NodeRef < BorrowType , K , V , marker:: LeafOrInternal > {
11411146 NodeRef {
11421147 height : self . node . height - 1 ,
1143- node : unsafe { self . node . as_internal ( ) . edges . get_unchecked ( self . idx ) . as_ptr ( ) } ,
1148+ node : unsafe {
1149+ self . node . as_internal ( ) . edges . get_unchecked ( self . idx ) . get_ref ( ) . as_ptr ( )
1150+ } ,
11441151 root : self . node . root ,
11451152 _marker : PhantomData
11461153 }
0 commit comments