diff options
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/alloc.rs | 4 | ||||
| -rw-r--r-- | src/libstd/future.rs | 5 | ||||
| -rw-r--r-- | src/libstd/io/buffered.rs | 45 | ||||
| -rw-r--r-- | src/libstd/io/mod.rs | 2 | ||||
| -rw-r--r-- | src/libstd/lib.rs | 12 | ||||
| -rw-r--r-- | src/libstd/macros.rs | 21 | ||||
| -rw-r--r-- | src/libstd/net/ip.rs | 72 | ||||
| -rw-r--r-- | src/libstd/panicking.rs | 4 | ||||
| -rw-r--r-- | src/libstd/sys/sgx/os.rs | 2 | ||||
| -rw-r--r-- | src/libstd/sys/unix/thread.rs | 4 | ||||
| -rw-r--r-- | src/libstd/sys/unix/time.rs | 1 | ||||
| -rw-r--r-- | src/libstd/tests/run-time-detect.rs | 1 | ||||
| -rw-r--r-- | src/libstd/time.rs | 4 |
13 files changed, 135 insertions, 42 deletions
diff --git a/src/libstd/alloc.rs b/src/libstd/alloc.rs index 7fd55af1694..8965c6860c4 100644 --- a/src/libstd/alloc.rs +++ b/src/libstd/alloc.rs @@ -133,9 +133,9 @@ pub use alloc_crate::alloc::*; #[derive(Debug, Default, Copy, Clone)] pub struct System; -// The Alloc impl just forwards to the GlobalAlloc impl, which is in `std::sys::*::alloc`. +// The AllocRef impl just forwards to the GlobalAlloc impl, which is in `std::sys::*::alloc`. #[unstable(feature = "allocator_api", issue = "32838")] -unsafe impl Alloc for System { +unsafe impl AllocRef for System { #[inline] unsafe fn alloc(&mut self, layout: Layout) -> Result<NonNull<u8>, AllocErr> { NonNull::new(GlobalAlloc::alloc(self, layout)).ok_or(AllocErr) diff --git a/src/libstd/future.rs b/src/libstd/future.rs index 9c7422c2b20..f74c84e6dfd 100644 --- a/src/libstd/future.rs +++ b/src/libstd/future.rs @@ -40,7 +40,10 @@ impl<T: Generator<Yield = ()>> Future for GenFuture<T> { // Safe because we're !Unpin + !Drop mapping to a ?Unpin value let gen = unsafe { Pin::map_unchecked_mut(self, |s| &mut s.0) }; let _guard = unsafe { set_task_context(cx) }; - match gen.resume() { + match gen.resume( + #[cfg(not(bootstrap))] + (), + ) { GeneratorState::Yielded(()) => Poll::Pending, GeneratorState::Complete(x) => Poll::Ready(x), } diff --git a/src/libstd/io/buffered.rs b/src/libstd/io/buffered.rs index 9e6849ba5bc..8862226adbb 100644 --- a/src/libstd/io/buffered.rs +++ b/src/libstd/io/buffered.rs @@ -179,6 +179,30 @@ impl<R> BufReader<R> { &self.buf[self.pos..self.cap] } + /// Returns the number of bytes the internal buffer can hold at once. + /// + /// # Examples + /// + /// ```no_run + /// #![feature(buffered_io_capacity)] + /// use std::io::{BufReader, BufRead}; + /// use std::fs::File; + /// + /// fn main() -> std::io::Result<()> { + /// let f = File::open("log.txt")?; + /// let mut reader = BufReader::new(f); + /// + /// let capacity = reader.capacity(); + /// let buffer = reader.fill_buf()?; + /// assert!(buffer.len() <= capacity); + /// Ok(()) + /// } + /// ``` + #[unstable(feature = "buffered_io_capacity", issue = "68833")] + pub fn capacity(&self) -> usize { + self.buf.len() + } + /// Unwraps this `BufReader<R>`, returning the underlying reader. /// /// Note that any leftover data in the internal buffer is lost. Therefore, @@ -576,6 +600,27 @@ impl<W: Write> BufWriter<W> { &self.buf } + /// Returns the number of bytes the internal buffer can hold without flushing. + /// + /// # Examples + /// + /// ```no_run + /// #![feature(buffered_io_capacity)] + /// use std::io::BufWriter; + /// use std::net::TcpStream; + /// + /// let buf_writer = BufWriter::new(TcpStream::connect("127.0.0.1:34254").unwrap()); + /// + /// // Check the capacity of the inner buffer + /// let capacity = buf_writer.capacity(); + /// // Calculate how many bytes can be written without flushing + /// let without_flush = capacity - buf_writer.buffer().len(); + /// ``` + #[unstable(feature = "buffered_io_capacity", issue = "68833")] + pub fn capacity(&self) -> usize { + self.buf.capacity() + } + /// Unwraps this `BufWriter<W>`, returning the underlying writer. /// /// The buffer is written out before returning the writer. diff --git a/src/libstd/io/mod.rs b/src/libstd/io/mod.rs index 95c8934b3d6..67b382c7a84 100644 --- a/src/libstd/io/mod.rs +++ b/src/libstd/io/mod.rs @@ -1327,6 +1327,8 @@ pub trait Write { /// not of [`ErrorKind::Interrupted`] kind generated from this method will be /// returned. /// + /// If the buffer contains no data, this will never call [`write`]. + /// /// # Errors /// /// This function will return the first error of diff --git a/src/libstd/lib.rs b/src/libstd/lib.rs index dc93ac90482..f9c9f224730 100644 --- a/src/libstd/lib.rs +++ b/src/libstd/lib.rs @@ -163,11 +163,11 @@ //! [`Iterator`]: iter/trait.Iterator.html //! [`Mutex`]: sync/struct.Mutex.html //! [`Option<T>`]: option/enum.Option.html -//! [`Rc`]: rc/index.html +//! [`Rc`]: rc/struct.Rc.html //! [`RefCell`]: cell/struct.RefCell.html //! [`Result<T, E>`]: result/enum.Result.html //! [`String`]: string/struct.String.html -//! [`Vec<T>`]: vec/index.html +//! [`Vec<T>`]: vec/struct.Vec.html //! [array]: primitive.array.html //! [slice]: primitive.slice.html //! [`atomic`]: sync/atomic/index.html @@ -237,6 +237,7 @@ #![feature(arbitrary_self_types)] #![feature(array_error_internals)] #![feature(asm)] +#![feature(assoc_int_consts)] #![feature(associated_type_bounds)] #![feature(box_syntax)] #![feature(c_variadic)] @@ -293,7 +294,6 @@ #![feature(shrink_to)] #![feature(slice_concat_ext)] #![feature(slice_internals)] -#![cfg_attr(bootstrap, feature(slice_patterns))] #![feature(specialization)] #![feature(staged_api)] #![feature(std_internals)] @@ -334,12 +334,6 @@ extern crate libc; #[allow(unused_extern_crates)] extern crate unwind; -// Only needed for now for the `std_detect` module until that crate changes to -// use `cfg_if::cfg_if!` -#[macro_use] -#[cfg(not(test))] -extern crate cfg_if; - // During testing, this crate is not actually the "real" std library, but rather // it links to the real std library, which was compiled from this same source // code. So any lang items std defines are conditionally excluded (or else they diff --git a/src/libstd/macros.rs b/src/libstd/macros.rs index 18fb0f87688..9e1ac8754d9 100644 --- a/src/libstd/macros.rs +++ b/src/libstd/macros.rs @@ -4,27 +4,6 @@ //! library. Each macro is available for use when linking against the standard //! library. -#[cfg(bootstrap)] -#[doc(include = "../libcore/macros/panic.md")] -#[macro_export] -#[stable(feature = "rust1", since = "1.0.0")] -#[allow_internal_unstable(libstd_sys_internals)] -macro_rules! panic { - () => ({ - $crate::panic!("explicit panic") - }); - ($msg:expr) => ({ - $crate::rt::begin_panic($msg, &($crate::file!(), $crate::line!(), $crate::column!())) - }); - ($msg:expr,) => ({ - $crate::panic!($msg) - }); - ($fmt:expr, $($arg:tt)+) => ({ - $crate::rt::begin_panic_fmt(&$crate::format_args!($fmt, $($arg)+)) - }); -} - -#[cfg(not(bootstrap))] #[doc(include = "../libcore/macros/panic.md")] #[macro_export] #[stable(feature = "rust1", since = "1.0.0")] diff --git a/src/libstd/net/ip.rs b/src/libstd/net/ip.rs index 6410a4f2b65..200b00b1195 100644 --- a/src/libstd/net/ip.rs +++ b/src/libstd/net/ip.rs @@ -813,6 +813,20 @@ impl fmt::Display for IpAddr { #[stable(feature = "ip_from_ip", since = "1.16.0")] impl From<Ipv4Addr> for IpAddr { + /// Copies this address to a new `IpAddr::V4`. + /// + /// # Examples + /// + /// ``` + /// use std::net::{IpAddr, Ipv4Addr}; + /// + /// let addr = Ipv4Addr::new(127, 0, 0, 1); + /// + /// assert_eq!( + /// IpAddr::V4(addr), + /// IpAddr::from(addr) + /// ) + /// ``` fn from(ipv4: Ipv4Addr) -> IpAddr { IpAddr::V4(ipv4) } @@ -820,6 +834,20 @@ impl From<Ipv4Addr> for IpAddr { #[stable(feature = "ip_from_ip", since = "1.16.0")] impl From<Ipv6Addr> for IpAddr { + /// Copies this address to a new `IpAddr::V6`. + /// + /// # Examples + /// + /// ``` + /// use std::net::{IpAddr, Ipv6Addr}; + /// + /// let addr = Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff); + /// + /// assert_eq!( + /// IpAddr::V6(addr), + /// IpAddr::from(addr) + /// ); + /// ``` fn from(ipv6: Ipv6Addr) -> IpAddr { IpAddr::V6(ipv6) } @@ -975,6 +1003,8 @@ impl From<u32> for Ipv4Addr { #[stable(feature = "from_slice_v4", since = "1.9.0")] impl From<[u8; 4]> for Ipv4Addr { + /// Creates an `Ipv4Addr` from a four element byte array. + /// /// # Examples /// /// ``` @@ -1734,6 +1764,27 @@ impl From<u128> for Ipv6Addr { #[stable(feature = "ipv6_from_octets", since = "1.9.0")] impl From<[u8; 16]> for Ipv6Addr { + /// Creates an `Ipv6Addr` from a sixteen element byte array. + /// + /// # Examples + /// + /// ``` + /// use std::net::Ipv6Addr; + /// + /// let addr = Ipv6Addr::from([ + /// 25u8, 24u8, 23u8, 22u8, 21u8, 20u8, 19u8, 18u8, + /// 17u8, 16u8, 15u8, 14u8, 13u8, 12u8, 11u8, 10u8, + /// ]); + /// assert_eq!( + /// Ipv6Addr::new( + /// 0x1918, 0x1716, + /// 0x1514, 0x1312, + /// 0x1110, 0x0f0e, + /// 0x0d0c, 0x0b0a + /// ), + /// addr + /// ); + /// ``` fn from(octets: [u8; 16]) -> Ipv6Addr { let inner = c::in6_addr { s6_addr: octets }; Ipv6Addr::from_inner(inner) @@ -1742,6 +1793,27 @@ impl From<[u8; 16]> for Ipv6Addr { #[stable(feature = "ipv6_from_segments", since = "1.16.0")] impl From<[u16; 8]> for Ipv6Addr { + /// Creates an `Ipv6Addr` from an eight element 16-bit array. + /// + /// # Examples + /// + /// ``` + /// use std::net::Ipv6Addr; + /// + /// let addr = Ipv6Addr::from([ + /// 525u16, 524u16, 523u16, 522u16, + /// 521u16, 520u16, 519u16, 518u16, + /// ]); + /// assert_eq!( + /// Ipv6Addr::new( + /// 0x20d, 0x20c, + /// 0x20b, 0x20a, + /// 0x209, 0x208, + /// 0x207, 0x206 + /// ), + /// addr + /// ); + /// ``` fn from(segments: [u16; 8]) -> Ipv6Addr { let [a, b, c, d, e, f, g, h] = segments; Ipv6Addr::new(a, b, c, d, e, f, g, h) diff --git a/src/libstd/panicking.rs b/src/libstd/panicking.rs index fee7ace92ea..8b12aaaa7e2 100644 --- a/src/libstd/panicking.rs +++ b/src/libstd/panicking.rs @@ -286,11 +286,9 @@ pub unsafe fn r#try<R, F: FnOnce() -> R>(f: F) -> Result<R, Box<dyn Any + Send>> ); return if r == 0 { - debug_assert!(update_panic_count(0) == 0); Ok(ManuallyDrop::into_inner(data.r)) } else { update_panic_count(-1); - debug_assert!(update_panic_count(0) == 0); Err(mem::transmute(raw::TraitObject { data: any_data as *mut _, vtable: any_vtable as *mut _, @@ -391,7 +389,7 @@ pub fn begin_panic_handler(info: &PanicInfo<'_>) -> ! { #[cfg_attr(not(feature = "panic_immediate_abort"), inline(never))] #[cold] #[track_caller] -pub fn begin_panic<M: Any + Send>(msg: M, #[cfg(bootstrap)] _: &(&str, u32, u32)) -> ! { +pub fn begin_panic<M: Any + Send>(msg: M) -> ! { if cfg!(feature = "panic_immediate_abort") { unsafe { intrinsics::abort() } } diff --git a/src/libstd/sys/sgx/os.rs b/src/libstd/sys/sgx/os.rs index 6ed7a2f2044..56fc84b4a3f 100644 --- a/src/libstd/sys/sgx/os.rs +++ b/src/libstd/sys/sgx/os.rs @@ -19,7 +19,7 @@ pub fn errno() -> i32 { pub fn error_string(errno: i32) -> String { if errno == RESULT_SUCCESS { - "operation succesful".into() + "operation successful".into() } else if ((Error::UserRangeStart as _)..=(Error::UserRangeEnd as _)).contains(&errno) { format!("user-specified error {:08x}", errno) } else { diff --git a/src/libstd/sys/unix/thread.rs b/src/libstd/sys/unix/thread.rs index a5b34eeec28..3ca778354e4 100644 --- a/src/libstd/sys/unix/thread.rs +++ b/src/libstd/sys/unix/thread.rs @@ -426,8 +426,8 @@ pub mod guard { } // glibc >= 2.15 has a __pthread_get_minstack() function that returns -// PTHREAD_STACK_MIN plus however many bytes are needed for thread-local -// storage. We need that information to avoid blowing up when a small stack +// PTHREAD_STACK_MIN plus bytes needed for thread-local storage. +// We need that information to avoid blowing up when a small stack // is created in an application with big thread-local storage requirements. // See #6233 for rationale and details. #[cfg(target_os = "linux")] diff --git a/src/libstd/sys/unix/time.rs b/src/libstd/sys/unix/time.rs index 23104419978..6707f790cab 100644 --- a/src/libstd/sys/unix/time.rs +++ b/src/libstd/sys/unix/time.rs @@ -282,7 +282,6 @@ mod inner { (cfg!(target_os = "linux") && cfg!(target_arch = "x86_64")) || (cfg!(target_os = "linux") && cfg!(target_arch = "x86")) || cfg!(target_os = "fuchsia") - || false // last clause, used so `||` is always trailing above } pub fn checked_sub_instant(&self, other: &Instant) -> Option<Duration> { diff --git a/src/libstd/tests/run-time-detect.rs b/src/libstd/tests/run-time-detect.rs index e39cc1eed5e..2e6d1bc8efd 100644 --- a/src/libstd/tests/run-time-detect.rs +++ b/src/libstd/tests/run-time-detect.rs @@ -6,6 +6,7 @@ all(target_arch = "aarch64", any(target_os = "linux", target_os = "android")), all(target_arch = "powerpc", target_os = "linux"), all(target_arch = "powerpc64", target_os = "linux"), + any(target_arch = "x86", target_arch = "x86_64"), ), feature(stdsimd) )] diff --git a/src/libstd/time.rs b/src/libstd/time.rs index 5bc8fe5ae6d..68a54915873 100644 --- a/src/libstd/time.rs +++ b/src/libstd/time.rs @@ -76,7 +76,7 @@ pub use core::time::Duration; /// [QueryPerformanceCounter]: https://docs.microsoft.com/en-us/windows/win32/api/profileapi/nf-profileapi-queryperformancecounter /// [`insecure_time` usercall]: https://edp.fortanix.com/docs/api/fortanix_sgx_abi/struct.Usercalls.html#method.insecure_time /// [timekeeping in SGX]: https://edp.fortanix.com/docs/concepts/rust-std/#codestdtimecode -/// [__wasi_clock_time_get (Monotonic Clock)]: https://github.com/CraneStation/wasmtime/blob/master/docs/WASI-api.md#clock_time_get +/// [__wasi_clock_time_get (Monotonic Clock)]: https://github.com/WebAssembly/WASI/blob/master/phases/snapshot/docs.md#clock_time_get /// [clock_gettime (Monotonic Clock)]: https://linux.die.net/man/3/clock_gettime /// [mach_absolute_time]: https://developer.apple.com/library/archive/documentation/Darwin/Conceptual/KernelProgramming/services/services.html /// [clock_time_get (Monotonic Clock)]: https://nuxi.nl/cloudabi/#clock_time_get @@ -157,7 +157,7 @@ pub struct Instant(time::Instant); /// [timekeeping in SGX]: https://edp.fortanix.com/docs/concepts/rust-std/#codestdtimecode /// [gettimeofday]: http://man7.org/linux/man-pages/man2/gettimeofday.2.html /// [clock_gettime (Realtime Clock)]: https://linux.die.net/man/3/clock_gettime -/// [__wasi_clock_time_get (Realtime Clock)]: https://github.com/CraneStation/wasmtime/blob/master/docs/WASI-api.md#clock_time_get +/// [__wasi_clock_time_get (Realtime Clock)]: https://github.com/WebAssembly/WASI/blob/master/phases/snapshot/docs.md#clock_time_get /// [GetSystemTimeAsFileTime]: https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsystemtimeasfiletime /// /// **Disclaimer:** These system calls might change over time. |
