Skip to content

Commit 14315f9

Browse files
committed
Migrate libraries from ptr::slice_from_raw_parts to .cast_slice
1 parent 6769f69 commit 14315f9

25 files changed

Lines changed: 57 additions & 70 deletions

File tree

library/alloc/src/alloc.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -204,12 +204,12 @@ impl Global {
204204
#[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces
205205
fn alloc_impl_runtime(layout: Layout, zeroed: bool) -> Result<NonNull<[u8]>, AllocError> {
206206
match layout.size() {
207-
0 => Ok(NonNull::slice_from_raw_parts(layout.dangling_ptr(), 0)),
207+
0 => Ok(layout.dangling_ptr().cast_slice(0)),
208208
// SAFETY: `layout` is non-zero in size,
209209
size => unsafe {
210210
let raw_ptr = if zeroed { alloc_zeroed(layout) } else { alloc(layout) };
211211
let ptr = NonNull::new(raw_ptr).ok_or(AllocError)?;
212-
Ok(NonNull::slice_from_raw_parts(ptr, size))
212+
Ok(ptr.cast_slice(size))
213213
},
214214
}
215215
}
@@ -261,7 +261,7 @@ impl Global {
261261
if zeroed {
262262
raw_ptr.add(old_size).write_bytes(0, new_size - old_size);
263263
}
264-
Ok(NonNull::slice_from_raw_parts(ptr, new_size))
264+
Ok(ptr.cast_slice(new_size))
265265
},
266266

267267
// SAFETY: because `new_layout.size()` must be greater than or equal to `old_size`,
@@ -297,7 +297,7 @@ impl Global {
297297
// SAFETY: conditions must be upheld by the caller
298298
0 => unsafe {
299299
self.deallocate(ptr, old_layout);
300-
Ok(NonNull::slice_from_raw_parts(new_layout.dangling_ptr(), 0))
300+
Ok(new_layout.dangling_ptr().cast_slice(0))
301301
},
302302

303303
// SAFETY: `new_size` is non-zero. Other conditions must be upheld by the caller
@@ -307,7 +307,7 @@ impl Global {
307307

308308
let raw_ptr = realloc_nonnull(ptr, old_layout, new_size);
309309
let ptr = NonNull::new(raw_ptr).ok_or(AllocError)?;
310-
Ok(NonNull::slice_from_raw_parts(ptr, new_size))
310+
Ok(ptr.cast_slice(new_size))
311311
},
312312

313313
// SAFETY: because `new_size` must be smaller than or equal to `old_layout.size()`,
@@ -388,7 +388,7 @@ impl Global {
388388
#[rustc_const_unstable(feature = "const_heap", issue = "79597")]
389389
const fn alloc_impl_const(layout: Layout, zeroed: bool) -> Result<NonNull<[u8]>, AllocError> {
390390
match layout.size() {
391-
0 => Ok(NonNull::slice_from_raw_parts(layout.dangling_ptr(), 0)),
391+
0 => Ok(layout.dangling_ptr().cast_slice(0)),
392392
// SAFETY: `layout` is non-zero in size,
393393
size => unsafe {
394394
let raw_ptr = core::intrinsics::const_allocate(layout.size(), layout.align());
@@ -397,7 +397,7 @@ impl Global {
397397
// SAFETY: the pointer returned by `const_allocate` is valid to write to.
398398
ptr.write_bytes(0, size);
399399
}
400-
Ok(NonNull::slice_from_raw_parts(ptr, size))
400+
Ok(ptr.cast_slice(size))
401401
},
402402
}
403403
}

library/alloc/src/collections/vec_deque/mod.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -226,9 +226,7 @@ impl<T, A: Allocator> VecDeque<T, A> {
226226
/// `range` must lie inside `0..self.capacity()`.
227227
#[inline]
228228
unsafe fn buffer_range(&self, range: Range<usize>) -> *mut [T] {
229-
unsafe {
230-
ptr::slice_from_raw_parts_mut(self.ptr().add(range.start), range.end - range.start)
231-
}
229+
unsafe { self.ptr().add(range.start).cast_slice(range.end - range.start) }
232230
}
233231

234232
/// Returns `true` if the buffer is at full capacity.

library/alloc/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@
139139
#![feature(pattern)]
140140
#![feature(pin_coerce_unsized_trait)]
141141
#![feature(ptr_alignment_type)]
142+
#![feature(ptr_cast_slice)]
142143
#![feature(ptr_internals)]
143144
#![feature(ptr_metadata)]
144145
#![feature(rev_into_inner)]

library/alloc/src/raw_vec/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ impl<T, A: Allocator> RawVec<T, A> {
244244

245245
let me = ManuallyDrop::new(self);
246246
unsafe {
247-
let slice = ptr::slice_from_raw_parts_mut(me.ptr() as *mut MaybeUninit<T>, len);
247+
let slice = me.ptr().cast::<MaybeUninit<T>>().cast_slice(len);
248248
Box::from_raw_in(slice, ptr::read(&me.inner.alloc))
249249
}
250250
}

library/alloc/src/rc.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1160,10 +1160,7 @@ impl<T> Rc<[T]> {
11601160
Rc::from_ptr(Rc::allocate_for_layout(
11611161
Layout::array::<T>(len).unwrap(),
11621162
|layout| Global.allocate_zeroed(layout),
1163-
|mem| {
1164-
ptr::slice_from_raw_parts_mut(mem.cast::<T>(), len)
1165-
as *mut RcInner<[mem::MaybeUninit<T>]>
1166-
},
1163+
|mem| mem.cast::<T>().cast_slice(len) as *mut RcInner<[mem::MaybeUninit<T>]>,
11671164
))
11681165
}
11691166
}
@@ -1231,10 +1228,7 @@ impl<T, A: Allocator> Rc<[T], A> {
12311228
Rc::allocate_for_layout(
12321229
Layout::array::<T>(len).unwrap(),
12331230
|layout| alloc.allocate_zeroed(layout),
1234-
|mem| {
1235-
ptr::slice_from_raw_parts_mut(mem.cast::<T>(), len)
1236-
as *mut RcInner<[mem::MaybeUninit<T>]>
1237-
},
1231+
|mem| mem.cast::<T>().cast_slice(len) as *mut RcInner<[mem::MaybeUninit<T>]>,
12381232
),
12391233
alloc,
12401234
)
@@ -2325,7 +2319,7 @@ impl<T> Rc<[T]> {
23252319
Self::allocate_for_layout(
23262320
Layout::array::<T>(len).unwrap(),
23272321
|layout| Global.allocate(layout),
2328-
|mem| ptr::slice_from_raw_parts_mut(mem.cast::<T>(), len) as *mut RcInner<[T]>,
2322+
|mem| mem.cast::<T>().cast_slice(len) as *mut RcInner<[T]>,
23292323
)
23302324
}
23312325
}
@@ -2402,7 +2396,7 @@ impl<T, A: Allocator> Rc<[T], A> {
24022396
Rc::<[T]>::allocate_for_layout(
24032397
Layout::array::<T>(len).unwrap(),
24042398
|layout| alloc.allocate(layout),
2405-
|mem| ptr::slice_from_raw_parts_mut(mem.cast::<T>(), len) as *mut RcInner<[T]>,
2399+
|mem| mem.cast::<T>().cast_slice(len) as *mut RcInner<[T]>,
24062400
)
24072401
}
24082402
}

library/alloc/src/sync.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1306,10 +1306,7 @@ impl<T> Arc<[T]> {
13061306
Arc::from_ptr(Arc::allocate_for_layout(
13071307
Layout::array::<T>(len).unwrap(),
13081308
|layout| Global.allocate_zeroed(layout),
1309-
|mem| {
1310-
ptr::slice_from_raw_parts_mut(mem as *mut T, len)
1311-
as *mut ArcInner<[mem::MaybeUninit<T>]>
1312-
},
1309+
|mem| mem.cast::<T>().cast_slice(len) as *mut ArcInner<[mem::MaybeUninit<T>]>,
13131310
))
13141311
}
13151312
}
@@ -1378,10 +1375,7 @@ impl<T, A: Allocator> Arc<[T], A> {
13781375
Arc::allocate_for_layout(
13791376
Layout::array::<T>(len).unwrap(),
13801377
|layout| alloc.allocate_zeroed(layout),
1381-
|mem| {
1382-
ptr::slice_from_raw_parts_mut(mem.cast::<T>(), len)
1383-
as *mut ArcInner<[mem::MaybeUninit<T>]>
1384-
},
1378+
|mem| mem.cast::<T>().cast_slice(len) as *mut ArcInner<[mem::MaybeUninit<T>]>,
13851379
),
13861380
alloc,
13871381
)
@@ -2270,7 +2264,7 @@ impl<T> Arc<[T]> {
22702264
Self::allocate_for_layout(
22712265
Layout::array::<T>(len).unwrap(),
22722266
|layout| Global.allocate(layout),
2273-
|mem| ptr::slice_from_raw_parts_mut(mem.cast::<T>(), len) as *mut ArcInner<[T]>,
2267+
|mem| mem.cast::<T>().cast_slice(len) as *mut ArcInner<[T]>,
22742268
)
22752269
}
22762270
}
@@ -2349,7 +2343,7 @@ impl<T, A: Allocator> Arc<[T], A> {
23492343
Arc::allocate_for_layout(
23502344
Layout::array::<T>(len).unwrap(),
23512345
|layout| alloc.allocate(layout),
2352-
|mem| ptr::slice_from_raw_parts_mut(mem.cast::<T>(), len) as *mut ArcInner<[T]>,
2346+
|mem| mem.cast::<T>().cast_slice(len) as *mut ArcInner<[T]>,
23532347
)
23542348
}
23552349
}

library/alloc/src/vec/drain.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ impl<T, A: Allocator> Drop for Drain<'_, T, A> {
232232
// invalidate raw pointers to it which some unsafe code might rely on.
233233
let vec_ptr = vec.as_mut().as_mut_ptr();
234234
let drop_offset = drop_ptr.offset_from_unsigned(vec_ptr);
235-
let to_drop = ptr::slice_from_raw_parts_mut(vec_ptr.add(drop_offset), drop_len);
235+
let to_drop = vec_ptr.add(drop_offset).cast_slice(drop_len);
236236
ptr::drop_in_place(to_drop);
237237
}
238238
}

library/alloc/src/vec/in_place_drop.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use core::marker::PhantomData;
2-
use core::ptr::{self, NonNull, drop_in_place};
2+
use core::ptr::NonNull;
33

44
use crate::alloc::Global;
55
use crate::raw_vec::RawVec;
@@ -20,9 +20,7 @@ impl<T> InPlaceDrop<T> {
2020
impl<T> Drop for InPlaceDrop<T> {
2121
#[inline]
2222
fn drop(&mut self) {
23-
unsafe {
24-
ptr::drop_in_place(ptr::slice_from_raw_parts_mut(self.inner, self.len()));
25-
}
23+
unsafe { self.inner.cast_slice(self.len()).drop_in_place() }
2624
}
2725
}
2826

@@ -42,7 +40,7 @@ impl<Src, Dest> Drop for InPlaceDstDataSrcBufDrop<Src, Dest> {
4240
unsafe {
4341
let _drop_allocation =
4442
RawVec::<Src>::from_nonnull_in(self.ptr.cast::<Src>(), self.src_cap, Global);
45-
drop_in_place(core::ptr::slice_from_raw_parts_mut::<Dest>(self.ptr.as_ptr(), self.len));
43+
self.ptr.as_ptr().cast_slice(self.len).drop_in_place();
4644
};
4745
}
4846
}

library/alloc/src/vec/into_iter.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ impl<T, A: Allocator> IntoIter<T, A> {
115115
}
116116

117117
fn as_raw_mut_slice(&mut self) -> *mut [T] {
118-
ptr::slice_from_raw_parts_mut(self.ptr.as_ptr(), self.len())
118+
self.ptr.as_ptr().cast_slice(self.len())
119119
}
120120

121121
/// Drops remaining elements and relinquishes the backing allocation.
@@ -282,7 +282,7 @@ impl<T, A: Allocator> Iterator for IntoIter<T, A> {
282282
#[inline]
283283
fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>> {
284284
let step_size = self.len().min(n);
285-
let to_drop = ptr::slice_from_raw_parts_mut(self.ptr.as_ptr(), step_size);
285+
let to_drop = self.ptr.as_ptr().cast_slice(step_size);
286286
if T::IS_ZST {
287287
// See `next` for why we sub `end` here.
288288
self.end = self.end.wrapping_byte_sub(step_size);
@@ -457,9 +457,9 @@ impl<T, A: Allocator> DoubleEndedIterator for IntoIter<T, A> {
457457
}
458458
let to_drop = if T::IS_ZST {
459459
// ZST may cause unalignment
460-
ptr::slice_from_raw_parts_mut(ptr::NonNull::<T>::dangling().as_ptr(), step_size)
460+
ptr::NonNull::<T>::dangling().as_ptr().cast_slice(step_size)
461461
} else {
462-
ptr::slice_from_raw_parts_mut(self.end as *mut T, step_size)
462+
self.end.cast::<T>().cast_mut().cast_slice(step_size)
463463
};
464464
// SAFETY: same as for advance_by()
465465
unsafe {

library/alloc/src/vec/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1799,7 +1799,7 @@ impl<T, A: Allocator> Vec<T, A> {
17991799
return;
18001800
}
18011801
let remaining_len = self.len - len;
1802-
let s = ptr::slice_from_raw_parts_mut(self.as_mut_ptr().add(len), remaining_len);
1802+
let s = self.as_mut_ptr().add(len).cast_slice(remaining_len);
18031803
self.len = len;
18041804
ptr::drop_in_place(s);
18051805
}
@@ -4251,7 +4251,7 @@ unsafe impl<#[may_dangle] T, A: Allocator> Drop for Vec<T, A> {
42514251
// use drop for [T]
42524252
// use a raw slice to refer to the elements of the vector as weakest necessary type;
42534253
// could avoid questions of validity in certain cases
4254-
ptr::drop_in_place(ptr::slice_from_raw_parts_mut(self.as_mut_ptr(), self.len))
4254+
self.as_mut_ptr().cast_slice(self.len).drop_in_place()
42554255
}
42564256
// RawVec handles deallocation
42574257
}

0 commit comments

Comments
 (0)