@@ -1261,49 +1261,6 @@ impl<T> Arc<[T]> {
12611261 }
12621262 }
12631263
1264- /// Create an `Arc<[T]>` by reusing the underlying memory
1265- /// of a `Vec<T>`. This will return the vector if the existing allocation
1266- /// is not large enough.
1267- #[ cfg( not( no_global_oom_handling) ) ]
1268- fn try_from_vec_in_place ( mut v : Vec < T > ) -> Result < Arc < [ T ] > , Vec < T > > {
1269- let layout_elements = Layout :: array :: < T > ( v. len ( ) ) . unwrap ( ) ;
1270- let layout_allocation = Layout :: array :: < T > ( v. capacity ( ) ) . unwrap ( ) ;
1271- let layout_arcinner = arcinner_layout_for_value_layout ( layout_elements) ;
1272- let mut ptr = NonNull :: new ( v. as_mut_ptr ( ) ) . expect ( "`Vec<T>` stores `NonNull<T>`" ) ;
1273- if layout_arcinner. size ( ) > layout_allocation. size ( )
1274- || layout_arcinner. align ( ) > layout_allocation. align ( )
1275- {
1276- // Can't fit - calling `grow` would involve `realloc`
1277- // (which copies the elements), followed by copying again.
1278- return Err ( v) ;
1279- }
1280- if layout_arcinner. size ( ) < layout_allocation. size ( )
1281- || layout_arcinner. align ( ) < layout_allocation. align ( )
1282- {
1283- // We need to shrink the allocation so that it fits
1284- // https://doc.rust-lang.org/nightly/std/alloc/trait.Allocator.html#memory-fitting
1285- // SAFETY:
1286- // - Vec allocates by requesting `Layout::array::<T>(capacity)`, so this capacity matches
1287- // - `layout_arcinner` is smaller
1288- // If this fails, the ownership has not been transferred
1289- if let Ok ( p) = unsafe { Global . shrink ( ptr. cast ( ) , layout_allocation, layout_arcinner) }
1290- {
1291- ptr = p. cast ( ) ;
1292- } else {
1293- return Err ( v) ;
1294- }
1295- }
1296- // Make sure the vec's memory isn't deallocated now
1297- let v = mem:: ManuallyDrop :: new ( v) ;
1298- let ptr: * mut ArcInner < [ T ] > = ptr:: slice_from_raw_parts_mut ( ptr. as_ptr ( ) , v. len ( ) ) as _ ;
1299- unsafe {
1300- ptr:: copy ( ptr. cast :: < T > ( ) , & mut ( * ptr) . data as * mut [ T ] as * mut T , v. len ( ) ) ;
1301- ptr:: write ( & mut ( * ptr) . strong , atomic:: AtomicUsize :: new ( 1 ) ) ;
1302- ptr:: write ( & mut ( * ptr) . weak , atomic:: AtomicUsize :: new ( 1 ) ) ;
1303- Ok ( Self :: from_ptr ( ptr) )
1304- }
1305- }
1306-
13071264 /// Constructs an `Arc<[T]>` from an iterator known to be of a certain size.
13081265 ///
13091266 /// Behavior is undefined should the size be wrong.
@@ -2615,17 +2572,12 @@ impl<T> From<Vec<T>> for Arc<[T]> {
26152572 /// assert_eq!(&[1, 2, 3], &shared[..]);
26162573 /// ```
26172574 #[ inline]
2618- fn from ( v : Vec < T > ) -> Arc < [ T ] > {
2619- match Arc :: try_from_vec_in_place ( v) {
2620- Ok ( rc) => rc,
2621- Err ( mut v) => {
2622- unsafe {
2623- let rc = Arc :: copy_from_slice ( & v) ;
2624- // Allow the Vec to free its memory, but not destroy its contents
2625- v. set_len ( 0 ) ;
2626- rc
2627- }
2628- }
2575+ fn from ( mut v : Vec < T > ) -> Arc < [ T ] > {
2576+ unsafe {
2577+ let rc = Arc :: copy_from_slice ( & v) ;
2578+ // Allow the Vec to free its memory, but not destroy its contents
2579+ v. set_len ( 0 ) ;
2580+ rc
26292581 }
26302582 }
26312583}
0 commit comments