@@ -333,12 +333,12 @@ impl<T: ?Sized> Rc<T> {
333
333
unsafe { self . ptr . as_ref ( ) }
334
334
}
335
335
336
- fn from_inner ( ptr : NonNull < RcBox < T > > ) -> Self {
336
+ unsafe fn from_inner ( ptr : NonNull < RcBox < T > > ) -> Self {
337
337
Self { ptr, phantom : PhantomData }
338
338
}
339
339
340
340
unsafe fn from_ptr ( ptr : * mut RcBox < T > ) -> Self {
341
- Self :: from_inner ( unsafe { NonNull :: new_unchecked ( ptr) } )
341
+ unsafe { Self :: from_inner ( NonNull :: new_unchecked ( ptr) ) }
342
342
}
343
343
}
344
344
@@ -359,9 +359,11 @@ impl<T> Rc<T> {
359
359
// pointers, which ensures that the weak destructor never frees
360
360
// the allocation while the strong destructor is running, even
361
361
// if the weak pointer is stored inside the strong one.
362
- Self :: from_inner (
363
- Box :: leak ( box RcBox { strong : Cell :: new ( 1 ) , weak : Cell :: new ( 1 ) , value } ) . into ( ) ,
364
- )
362
+ unsafe {
363
+ Self :: from_inner (
364
+ Box :: leak ( box RcBox { strong : Cell :: new ( 1 ) , weak : Cell :: new ( 1 ) , value } ) . into ( ) ,
365
+ )
366
+ }
365
367
}
366
368
367
369
/// Constructs a new `Rc<T>` using a weak reference to itself. Attempting
@@ -412,16 +414,16 @@ impl<T> Rc<T> {
412
414
// otherwise.
413
415
let data = data_fn ( & weak) ;
414
416
415
- unsafe {
417
+ let strong = unsafe {
416
418
let inner = init_ptr. as_ptr ( ) ;
417
419
ptr:: write ( ptr:: addr_of_mut!( ( * inner) . value) , data) ;
418
420
419
421
let prev_value = ( * inner) . strong . get ( ) ;
420
422
debug_assert_eq ! ( prev_value, 0 , "No prior strong references should exist" ) ;
421
423
( * inner) . strong . set ( 1 ) ;
422
- }
423
424
424
- let strong = Rc :: from_inner ( init_ptr) ;
425
+ Rc :: from_inner ( init_ptr)
426
+ } ;
425
427
426
428
// Strong references should collectively own a shared weak reference,
427
429
// so don't run the destructor for our old weak reference.
@@ -511,10 +513,12 @@ impl<T> Rc<T> {
511
513
// pointers, which ensures that the weak destructor never frees
512
514
// the allocation while the strong destructor is running, even
513
515
// if the weak pointer is stored inside the strong one.
514
- Ok ( Self :: from_inner (
515
- Box :: leak ( Box :: try_new ( RcBox { strong : Cell :: new ( 1 ) , weak : Cell :: new ( 1 ) , value } ) ?)
516
- . into ( ) ,
517
- ) )
516
+ unsafe {
517
+ Ok ( Self :: from_inner (
518
+ Box :: leak ( Box :: try_new ( RcBox { strong : Cell :: new ( 1 ) , weak : Cell :: new ( 1 ) , value } ) ?)
519
+ . into ( ) ,
520
+ ) )
521
+ }
518
522
}
519
523
520
524
/// Constructs a new `Rc` with uninitialized contents, returning an error if the allocation fails
@@ -733,7 +737,7 @@ impl<T> Rc<mem::MaybeUninit<T>> {
733
737
#[ unstable( feature = "new_uninit" , issue = "63291" ) ]
734
738
#[ inline]
735
739
pub unsafe fn assume_init ( self ) -> Rc < T > {
736
- Rc :: from_inner ( mem:: ManuallyDrop :: new ( self ) . ptr . cast ( ) )
740
+ unsafe { Rc :: from_inner ( mem:: ManuallyDrop :: new ( self ) . ptr . cast ( ) ) }
737
741
}
738
742
}
739
743
@@ -1199,9 +1203,11 @@ impl Rc<dyn Any> {
1199
1203
/// ```
1200
1204
pub fn downcast < T : Any > ( self ) -> Result < Rc < T > , Rc < dyn Any > > {
1201
1205
if ( * self ) . is :: < T > ( ) {
1202
- let ptr = self . ptr . cast :: < RcBox < T > > ( ) ;
1203
- forget ( self ) ;
1204
- Ok ( Rc :: from_inner ( ptr) )
1206
+ unsafe {
1207
+ let ptr = self . ptr . cast :: < RcBox < T > > ( ) ;
1208
+ forget ( self ) ;
1209
+ Ok ( Rc :: from_inner ( ptr) )
1210
+ }
1205
1211
} else {
1206
1212
Err ( self )
1207
1213
}
@@ -1474,8 +1480,10 @@ impl<T: ?Sized> Clone for Rc<T> {
1474
1480
/// ```
1475
1481
#[ inline]
1476
1482
fn clone ( & self ) -> Rc < T > {
1477
- self . inner ( ) . inc_strong ( ) ;
1478
- Self :: from_inner ( self . ptr )
1483
+ unsafe {
1484
+ self . inner ( ) . inc_strong ( ) ;
1485
+ Self :: from_inner ( self . ptr )
1486
+ }
1479
1487
}
1480
1488
}
1481
1489
@@ -2225,11 +2233,14 @@ impl<T: ?Sized> Weak<T> {
2225
2233
#[ stable( feature = "rc_weak" , since = "1.4.0" ) ]
2226
2234
pub fn upgrade ( & self ) -> Option < Rc < T > > {
2227
2235
let inner = self . inner ( ) ?;
2236
+
2228
2237
if inner. strong ( ) == 0 {
2229
2238
None
2230
2239
} else {
2231
- inner. inc_strong ( ) ;
2232
- Some ( Rc :: from_inner ( self . ptr ) )
2240
+ unsafe {
2241
+ inner. inc_strong ( ) ;
2242
+ Some ( Rc :: from_inner ( self . ptr ) )
2243
+ }
2233
2244
}
2234
2245
}
2235
2246
0 commit comments