Skip to content

Commit 53478c6

Browse files
committed
Eliminate use of super let
1 parent ca025d8 commit 53478c6

File tree

5 files changed

+58
-47
lines changed

5 files changed

+58
-47
lines changed

library/std/src/io/mod.rs

Lines changed: 44 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1631,27 +1631,33 @@ impl<'a> Deref for IoSlice<'a> {
16311631
///
16321632
/// When the slice contains over `n` buffers, ensure that at least one non-empty
16331633
/// buffer is in the truncated slice, if there is one.
1634+
///
1635+
/// For example, [POSIX writev] requires that `bufs.len()` is in `1..=IOV_MAX`.
1636+
///
1637+
/// [POSIX writev]: https://pubs.opengroup.org/onlinepubs/9799919799/functions/writev.html
16341638
#[allow(unused_macros)] // Not used on all platforms
1635-
pub(crate) macro limit_slices($bufs:expr, $n:expr) {
1636-
'slices: {
1637-
let bufs: &[IoSlice<'_>] = $bufs;
1638-
let n: usize = $n;
1639-
super let empty = &[IoSlice::new(&[])];
1640-
if bufs.len() > n || bufs.is_empty() {
1641-
crate::hint::cold_path();
1642-
for (i, buf) in bufs.iter().enumerate() {
1639+
pub(crate) macro limit_slices(&mut $bufs:ident, $n:expr) {
1640+
// Rebind $bufs, so the lifetime does not need to live as long as the
1641+
// function parameter, and shadow it so the macro caller gets the result.
1642+
let mut $bufs: &[IoSlice<'_>] = $bufs;
1643+
let n: usize = $n;
1644+
1645+
let empty = &[IoSlice::new(&[])];
1646+
1647+
if $bufs.len() > n || $bufs.is_empty() {
1648+
crate::hint::cold_path();
1649+
'fixup: {
1650+
// Find the first non-empty buffer and take up to `n` buffers after it.
1651+
for (i, buf) in $bufs.iter().enumerate() {
16431652
if !buf.is_empty() {
1644-
// Take all buffers after the first non-empty buffer,
1645-
// clamped to `n`.
1646-
let len = cmp::min(bufs.len() - i, n);
1647-
break 'slices &bufs[i..i + len];
1653+
let len = cmp::min($bufs.len() - i, n);
1654+
$bufs = &$bufs[i..i + len];
1655+
break 'fixup;
16481656
}
16491657
}
1650-
// POSIX requires at least one buffer for writev.
1651-
// https://pubs.opengroup.org/onlinepubs/9799919799/functions/writev.html
1652-
break 'slices empty;
1658+
// If no non-empty buffer is found, use a single empty buffer.
1659+
$bufs = empty;
16531660
}
1654-
bufs
16551661
}
16561662
}
16571663

@@ -1660,27 +1666,33 @@ pub(crate) macro limit_slices($bufs:expr, $n:expr) {
16601666
///
16611667
/// When the slice contains over `n` buffers, ensure that at least one non-empty
16621668
/// buffer is in the truncated slice, if there is one.
1669+
///
1670+
/// For example, [POSIX readv] requires that `bufs.len()` is in `1..=IOV_MAX`.
1671+
///
1672+
/// [POSIX readv]: https://pubs.opengroup.org/onlinepubs/9799919799/functions/readv.html
16631673
#[allow(unused_macros)] // Not used on all platforms
1664-
pub(crate) macro limit_slices_mut($bufs:expr, $n:expr) {
1665-
'slices: {
1666-
let bufs: &mut [IoSliceMut<'_>] = $bufs;
1667-
let n: usize = $n;
1668-
super let empty = &mut [IoSliceMut::new(&mut [])];
1669-
if bufs.len() > n || bufs.is_empty() {
1670-
crate::hint::cold_path();
1671-
for (i, buf) in bufs.iter().enumerate() {
1674+
pub(crate) macro limit_slices_mut(&mut $bufs:ident, $n:expr) {
1675+
// Rebind $bufs, so the lifetime does not need to live as long as the
1676+
// function parameter, and shadow it so the macro caller gets the result.
1677+
let mut $bufs: &mut [IoSliceMut<'_>] = $bufs;
1678+
let n: usize = $n;
1679+
1680+
let empty = &mut [IoSliceMut::new(&mut [])];
1681+
1682+
if $bufs.len() > n || $bufs.is_empty() {
1683+
crate::hint::cold_path();
1684+
'fixup: {
1685+
// Find the first non-empty buffer and take up to `n` buffers after it.
1686+
for (i, buf) in $bufs.iter().enumerate() {
16721687
if !buf.is_empty() {
1673-
// Take all buffers after the first non-empty buffer,
1674-
// clamped to `n`.
1675-
let len = cmp::min(bufs.len() - i, n);
1676-
break 'slices &mut bufs[i..i + len];
1688+
let len = cmp::min($bufs.len() - i, n);
1689+
$bufs = &mut $bufs[i..i + len];
1690+
break 'fixup;
16771691
}
16781692
}
1679-
// POSIX requires at least one buffer for readv.
1680-
// https://pubs.opengroup.org/onlinepubs/9799919799/functions/readv.html
1681-
break 'slices empty;
1693+
// If no non-empty buffer is found, use a single empty buffer.
1694+
$bufs = empty;
16821695
}
1683-
bufs
16841696
}
16851697
}
16861698

library/std/src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,6 @@
319319
#![feature(staged_api)]
320320
#![feature(stmt_expr_attributes)]
321321
#![feature(strict_provenance_lints)]
322-
#![feature(super_let)]
323322
#![feature(thread_local)]
324323
#![feature(try_blocks)]
325324
#![feature(try_trait_v2)]

library/std/src/sys/fd/hermit.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ impl FileDesc {
3838
}
3939

4040
pub fn read_vectored(&self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
41-
let bufs = io::limit_slices_mut!(bufs, max_iov());
41+
io::limit_slices_mut!(&mut bufs, max_iov());
4242
let ret = cvt(unsafe {
4343
hermit_abi::readv(
4444
self.as_raw_fd(),
@@ -66,7 +66,7 @@ impl FileDesc {
6666
}
6767

6868
pub fn write_vectored(&self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
69-
let bufs = io::limit_slices!(bufs, max_iov());
69+
io::limit_slices!(&mut bufs, max_iov());
7070
let ret = cvt(unsafe {
7171
hermit_abi::writev(
7272
self.as_raw_fd(),

library/std/src/sys/fd/unix.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ impl FileDesc {
126126
target_os = "nuttx"
127127
)))]
128128
pub fn read_vectored(&self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
129-
let bufs = io::limit_slices_mut!(bufs, max_iov());
129+
io::limit_slices_mut!(&mut bufs, max_iov());
130130
let ret = cvt(unsafe {
131131
libc::readv(
132132
self.as_raw_fd(),
@@ -222,7 +222,7 @@ impl FileDesc {
222222
target_os = "openbsd", // OpenBSD 2.7
223223
))]
224224
pub fn read_vectored_at(&self, bufs: &mut [IoSliceMut<'_>], offset: u64) -> io::Result<usize> {
225-
let bufs = io::limit_slices_mut!(bufs, max_iov());
225+
io::limit_slices_mut!(&mut bufs, max_iov());
226226
let ret = cvt(unsafe {
227227
libc::preadv(
228228
self.as_raw_fd(),
@@ -269,7 +269,7 @@ impl FileDesc {
269269
) -> isize;
270270
);
271271

272-
let bufs = io::limit_slices_mut!(bufs, max_iov());
272+
io::limit_slices_mut!(&mut bufs, max_iov());
273273
let ret = cvt(unsafe {
274274
preadv(
275275
self.as_raw_fd(),
@@ -294,7 +294,7 @@ impl FileDesc {
294294

295295
match preadv64.get() {
296296
Some(preadv) => {
297-
let bufs = io::limit_slices_mut!(bufs, max_iov());
297+
io::limit_slices_mut!(&mut bufs, max_iov());
298298
let ret = cvt(unsafe {
299299
preadv(
300300
self.as_raw_fd(),
@@ -331,7 +331,7 @@ impl FileDesc {
331331

332332
match preadv.get() {
333333
Some(preadv) => {
334-
let bufs = io::limit_slices_mut!(bufs, max_iov());
334+
io::limit_slices_mut!(&mut bufs, max_iov());
335335
let ret = cvt(unsafe {
336336
preadv(
337337
self.as_raw_fd(),
@@ -364,7 +364,7 @@ impl FileDesc {
364364
target_os = "nuttx"
365365
)))]
366366
pub fn write_vectored(&self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
367-
let bufs = io::limit_slices!(bufs, max_iov());
367+
io::limit_slices!(&mut bufs, max_iov());
368368
let ret = cvt(unsafe {
369369
libc::writev(
370370
self.as_raw_fd(),
@@ -433,7 +433,7 @@ impl FileDesc {
433433
target_os = "openbsd", // OpenBSD 2.7
434434
))]
435435
pub fn write_vectored_at(&self, bufs: &[IoSlice<'_>], offset: u64) -> io::Result<usize> {
436-
let bufs = io::limit_slices!(bufs, max_iov());
436+
io::limit_slices!(&mut bufs, max_iov());
437437
let ret = cvt(unsafe {
438438
libc::pwritev(
439439
self.as_raw_fd(),
@@ -480,7 +480,7 @@ impl FileDesc {
480480
) -> isize;
481481
);
482482

483-
let bufs = io::limit_slices!(bufs, max_iov());
483+
io::limit_slices!(&mut bufs, max_iov());
484484
let ret = cvt(unsafe {
485485
pwritev(
486486
self.as_raw_fd(),
@@ -505,7 +505,7 @@ impl FileDesc {
505505

506506
match pwritev64.get() {
507507
Some(pwritev) => {
508-
let bufs = io::limit_slices!(bufs, max_iov());
508+
io::limit_slices!(&mut bufs, max_iov());
509509
let ret = cvt(unsafe {
510510
pwritev(
511511
self.as_raw_fd(),
@@ -542,7 +542,7 @@ impl FileDesc {
542542

543543
match pwritev.get() {
544544
Some(pwritev) => {
545-
let bufs = io::limit_slices!(bufs, max_iov());
545+
io::limit_slices!(&mut bufs, max_iov());
546546
let ret = cvt(unsafe {
547547
pwritev(
548548
self.as_raw_fd(),

library/std/src/sys/net/connection/socket/solid.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ impl Socket {
223223
}
224224

225225
pub fn read_vectored(&self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
226-
let bufs = io::limit_slices_mut!(bufs, max_iov());
226+
io::limit_slices_mut!(&mut bufs, max_iov());
227227
let ret = cvt(unsafe {
228228
netc::readv(self.as_raw_fd(), bufs.as_ptr() as *const netc::iovec, bufs.len() as c_int)
229229
})?;
@@ -265,7 +265,7 @@ impl Socket {
265265
}
266266

267267
pub fn write_vectored(&self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
268-
let bufs = io::limit_slices!(bufs, max_iov());
268+
io::limit_slices!(&mut bufs, max_iov());
269269
let ret = cvt(unsafe {
270270
netc::writev(self.as_raw_fd(), bufs.as_ptr() as *const netc::iovec, bufs.len() as c_int)
271271
})?;

0 commit comments

Comments
 (0)