File tree 3 files changed +25
-4
lines changed
3 files changed +25
-4
lines changed Original file line number Diff line number Diff line change @@ -672,14 +672,16 @@ impl<T: ?Sized> Rc<T> {
672
672
// Previously, layout was calculated on the expression
673
673
// `&*(ptr as *const RcBox<T>)`, but this created a misaligned
674
674
// reference (see #54908).
675
- let ( layout, _) = Layout :: new :: < RcBox < ( ) > > ( )
676
- . extend ( Layout :: for_value ( & * ptr) ) . unwrap ( ) ;
675
+ let layout = Layout :: new :: < RcBox < ( ) > > ( )
676
+ . extend ( Layout :: for_value ( & * ptr) ) . unwrap ( ) . 0
677
+ . pad_to_align ( ) . unwrap ( ) ;
677
678
678
679
let mem = Global . alloc ( layout)
679
680
. unwrap_or_else ( |_| handle_alloc_error ( layout) ) ;
680
681
681
682
// Initialize the RcBox
682
683
let inner = set_data_ptr ( ptr as * mut T , mem. as_ptr ( ) as * mut u8 ) as * mut RcBox < T > ;
684
+ debug_assert_eq ! ( Layout :: for_value( & * inner) , layout) ;
683
685
684
686
ptr:: write ( & mut ( * inner) . strong , Cell :: new ( 1 ) ) ;
685
687
ptr:: write ( & mut ( * inner) . weak , Cell :: new ( 1 ) ) ;
Original file line number Diff line number Diff line change @@ -575,14 +575,16 @@ impl<T: ?Sized> Arc<T> {
575
575
// Previously, layout was calculated on the expression
576
576
// `&*(ptr as *const ArcInner<T>)`, but this created a misaligned
577
577
// reference (see #54908).
578
- let ( layout, _) = Layout :: new :: < ArcInner < ( ) > > ( )
579
- . extend ( Layout :: for_value ( & * ptr) ) . unwrap ( ) ;
578
+ let layout = Layout :: new :: < ArcInner < ( ) > > ( )
579
+ . extend ( Layout :: for_value ( & * ptr) ) . unwrap ( ) . 0
580
+ . pad_to_align ( ) . unwrap ( ) ;
580
581
581
582
let mem = Global . alloc ( layout)
582
583
. unwrap_or_else ( |_| handle_alloc_error ( layout) ) ;
583
584
584
585
// Initialize the ArcInner
585
586
let inner = set_data_ptr ( ptr as * mut T , mem. as_ptr ( ) as * mut u8 ) as * mut ArcInner < T > ;
587
+ debug_assert_eq ! ( Layout :: for_value( & * inner) , layout) ;
586
588
587
589
ptr:: write ( & mut ( * inner) . strong , atomic:: AtomicUsize :: new ( 1 ) ) ;
588
590
ptr:: write ( & mut ( * inner) . weak , atomic:: AtomicUsize :: new ( 1 ) ) ;
Original file line number Diff line number Diff line change @@ -218,6 +218,23 @@ impl Layout {
218
218
len_rounded_up. wrapping_sub ( len)
219
219
}
220
220
221
+ /// Creates a layout by rounding the size of this layout up to a multiple
222
+ /// of the layout's alignment.
223
+ ///
224
+ /// Returns `Err` if the padded size would overflow.
225
+ ///
226
+ /// This is equivalent to adding the result of `padding_needed_for`
227
+ /// to the layout's current size.
228
+ #[ unstable( feature = "alloc_layout_extra" , issue = "55724" ) ]
229
+ #[ inline]
230
+ pub fn pad_to_align ( & self ) -> Result < Layout , LayoutErr > {
231
+ let pad = self . padding_needed_for ( self . align ( ) ) ;
232
+ let new_size = self . size ( ) . checked_add ( pad)
233
+ . ok_or ( LayoutErr { private : ( ) } ) ?;
234
+
235
+ Layout :: from_size_align ( new_size, self . align ( ) )
236
+ }
237
+
221
238
/// Creates a layout describing the record for `n` instances of
222
239
/// `self`, with a suitable amount of padding between each to
223
240
/// ensure that each instance is given its requested size and
You can’t perform that action at this time.
0 commit comments