@@ -159,12 +159,12 @@ use core::hash::{Hash, Hasher};
159
159
use core:: iter:: FusedIterator ;
160
160
use core:: marker:: Tuple ;
161
161
use core:: marker:: Unsize ;
162
- use core:: mem;
162
+ use core:: mem:: { self , SizedTypeProperties } ;
163
163
use core:: ops:: {
164
164
CoerceUnsized , Deref , DerefMut , DispatchFromDyn , Generator , GeneratorState , Receiver ,
165
165
} ;
166
166
use core:: pin:: Pin ;
167
- use core:: ptr:: { self , Unique } ;
167
+ use core:: ptr:: { self , NonNull , Unique } ;
168
168
use core:: task:: { Context , Poll } ;
169
169
170
170
#[ cfg( not( no_global_oom_handling) ) ]
@@ -483,8 +483,12 @@ impl<T, A: Allocator> Box<T, A> {
483
483
where
484
484
A : Allocator ,
485
485
{
486
- let layout = Layout :: new :: < mem:: MaybeUninit < T > > ( ) ;
487
- let ptr = alloc. allocate ( layout) ?. cast ( ) ;
486
+ let ptr = if T :: IS_ZST {
487
+ NonNull :: dangling ( )
488
+ } else {
489
+ let layout = Layout :: new :: < mem:: MaybeUninit < T > > ( ) ;
490
+ alloc. allocate ( layout) ?. cast ( )
491
+ } ;
488
492
unsafe { Ok ( Box :: from_raw_in ( ptr. as_ptr ( ) , alloc) ) }
489
493
}
490
494
@@ -553,8 +557,12 @@ impl<T, A: Allocator> Box<T, A> {
553
557
where
554
558
A : Allocator ,
555
559
{
556
- let layout = Layout :: new :: < mem:: MaybeUninit < T > > ( ) ;
557
- let ptr = alloc. allocate_zeroed ( layout) ?. cast ( ) ;
560
+ let ptr = if T :: IS_ZST {
561
+ NonNull :: dangling ( )
562
+ } else {
563
+ let layout = Layout :: new :: < mem:: MaybeUninit < T > > ( ) ;
564
+ alloc. allocate_zeroed ( layout) ?. cast ( )
565
+ } ;
558
566
unsafe { Ok ( Box :: from_raw_in ( ptr. as_ptr ( ) , alloc) ) }
559
567
}
560
568
@@ -679,14 +687,16 @@ impl<T> Box<[T]> {
679
687
#[ unstable( feature = "allocator_api" , issue = "32838" ) ]
680
688
#[ inline]
681
689
pub fn try_new_uninit_slice ( len : usize ) -> Result < Box < [ mem:: MaybeUninit < T > ] > , AllocError > {
682
- unsafe {
690
+ let ptr = if T :: IS_ZST || len == 0 {
691
+ NonNull :: dangling ( )
692
+ } else {
683
693
let layout = match Layout :: array :: < mem:: MaybeUninit < T > > ( len) {
684
694
Ok ( l) => l,
685
695
Err ( _) => return Err ( AllocError ) ,
686
696
} ;
687
- let ptr = Global . allocate ( layout) ?;
688
- Ok ( RawVec :: from_raw_parts_in ( ptr . as_mut_ptr ( ) as * mut _ , len , Global ) . into_box ( len ) )
689
- }
697
+ Global . allocate ( layout) ?. cast ( )
698
+ } ;
699
+ unsafe { Ok ( RawVec :: from_raw_parts_in ( ptr . as_ptr ( ) , len , Global ) . into_box ( len ) ) }
690
700
}
691
701
692
702
/// Constructs a new boxed slice with uninitialized contents, with the memory
@@ -711,14 +721,16 @@ impl<T> Box<[T]> {
711
721
#[ unstable( feature = "allocator_api" , issue = "32838" ) ]
712
722
#[ inline]
713
723
pub fn try_new_zeroed_slice ( len : usize ) -> Result < Box < [ mem:: MaybeUninit < T > ] > , AllocError > {
714
- unsafe {
724
+ let ptr = if T :: IS_ZST || len == 0 {
725
+ NonNull :: dangling ( )
726
+ } else {
715
727
let layout = match Layout :: array :: < mem:: MaybeUninit < T > > ( len) {
716
728
Ok ( l) => l,
717
729
Err ( _) => return Err ( AllocError ) ,
718
730
} ;
719
- let ptr = Global . allocate_zeroed ( layout) ?;
720
- Ok ( RawVec :: from_raw_parts_in ( ptr . as_mut_ptr ( ) as * mut _ , len , Global ) . into_box ( len ) )
721
- }
731
+ Global . allocate_zeroed ( layout) ?. cast ( )
732
+ } ;
733
+ unsafe { Ok ( RawVec :: from_raw_parts_in ( ptr . as_ptr ( ) , len , Global ) . into_box ( len ) ) }
722
734
}
723
735
}
724
736
@@ -1215,8 +1227,18 @@ impl<T: ?Sized, A: Allocator> Box<T, A> {
1215
1227
1216
1228
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
1217
1229
unsafe impl < #[ may_dangle] T : ?Sized , A : Allocator > Drop for Box < T , A > {
1230
+ #[ inline]
1218
1231
fn drop ( & mut self ) {
1219
- // FIXME: Do nothing, drop is currently performed by compiler.
1232
+ // the T in the Box is dropped by the compiler before the destructor is run
1233
+
1234
+ let ptr = self . 0 ;
1235
+
1236
+ unsafe {
1237
+ let layout = Layout :: for_value_raw ( ptr. as_ptr ( ) ) ;
1238
+ if layout. size ( ) != 0 {
1239
+ self . 1 . deallocate ( From :: from ( ptr. cast ( ) ) , layout) ;
1240
+ }
1241
+ }
1220
1242
}
1221
1243
}
1222
1244
@@ -2165,7 +2187,7 @@ impl dyn Error + Send {
2165
2187
let err: Box < dyn Error > = self ;
2166
2188
<dyn Error >:: downcast ( err) . map_err ( |s| unsafe {
2167
2189
// Reapply the `Send` marker.
2168
- mem :: transmute :: < Box < dyn Error > , Box < dyn Error + Send > > ( s )
2190
+ Box :: from_raw ( Box :: into_raw ( s ) as * mut ( dyn Error + Send ) )
2169
2191
} )
2170
2192
}
2171
2193
}
@@ -2179,7 +2201,7 @@ impl dyn Error + Send + Sync {
2179
2201
let err: Box < dyn Error > = self ;
2180
2202
<dyn Error >:: downcast ( err) . map_err ( |s| unsafe {
2181
2203
// Reapply the `Send + Sync` marker.
2182
- mem :: transmute :: < Box < dyn Error > , Box < dyn Error + Send + Sync > > ( s )
2204
+ Box :: from_raw ( Box :: into_raw ( s ) as * mut ( dyn Error + Send + Sync ) )
2183
2205
} )
2184
2206
}
2185
2207
}
0 commit comments