@@ -145,7 +145,7 @@ struct InternalNode<K, V> {
145
145
146
146
/// The pointers to the children of this node. `len + 1` of these are considered
147
147
/// initialized and valid.
148
- edges : [ BoxedNode < K , V > ; 2 * B ] ,
148
+ edges : [ MaybeUninit < BoxedNode < K , V > > ; 2 * B ] ,
149
149
}
150
150
151
151
impl < K , V > InternalNode < K , V > {
@@ -159,7 +159,10 @@ impl<K, V> InternalNode<K, V> {
159
159
unsafe fn new ( ) -> Self {
160
160
InternalNode {
161
161
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 ( ) ,
163
166
}
164
167
}
165
168
}
@@ -261,7 +264,7 @@ impl<K, V> Root<K, V> {
261
264
-> NodeRef < marker:: Mut , K , V , marker:: Internal > {
262
265
debug_assert ! ( !self . is_shared_root( ) ) ;
263
266
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 ( ) ) } ) ;
265
268
266
269
self . node = BoxedNode :: from_internal ( new_node) ;
267
270
self . height += 1 ;
@@ -718,7 +721,7 @@ impl<'a, K, V> NodeRef<marker::Mut<'a>, K, V, marker::Internal> {
718
721
unsafe {
719
722
ptr:: write ( self . keys_mut ( ) . get_unchecked_mut ( idx) , key) ;
720
723
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 ) ;
722
725
723
726
( * self . as_leaf_mut ( ) ) . len += 1 ;
724
727
@@ -749,7 +752,7 @@ impl<'a, K, V> NodeRef<marker::Mut<'a>, K, V, marker::Internal> {
749
752
slice_insert ( self . vals_mut ( ) , 0 , val) ;
750
753
slice_insert (
751
754
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 ) ,
753
756
self . len ( ) +1
754
757
) ,
755
758
0 ,
@@ -778,7 +781,9 @@ impl<'a, K, V> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
778
781
let edge = match self . reborrow_mut ( ) . force ( ) {
779
782
ForceResult :: Leaf ( _) => None ,
780
783
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
+ ) ;
782
787
let mut new_root = Root { node : edge, height : internal. height - 1 } ;
783
788
( * new_root. as_mut ( ) . as_leaf_mut ( ) ) . parent = ptr:: null ( ) ;
784
789
Some ( new_root)
@@ -806,7 +811,7 @@ impl<'a, K, V> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
806
811
ForceResult :: Internal ( mut internal) => {
807
812
let edge = slice_remove (
808
813
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 ) ,
810
815
old_len+1
811
816
) ,
812
817
0
@@ -1085,7 +1090,7 @@ impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>, marker::
1085
1090
1086
1091
slice_insert (
1087
1092
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 ) ,
1089
1094
self . node . len ( )
1090
1095
) ,
1091
1096
self . idx + 1 ,
@@ -1140,7 +1145,9 @@ impl<BorrowType, K, V>
1140
1145
pub fn descend ( self ) -> NodeRef < BorrowType , K , V , marker:: LeafOrInternal > {
1141
1146
NodeRef {
1142
1147
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
+ } ,
1144
1151
root : self . node . root ,
1145
1152
_marker : PhantomData
1146
1153
}
0 commit comments