Skip to content

Commit 6227357

Browse files
committed
std: Stabilize the std::fmt module
This commit performs a final stabilization pass over the std::fmt module, marking all necessary APIs as stable. One of the more interesting aspects of this module is that it exposes a good deal of its runtime representation to the outside world in order for `format_args!` to be able to construct the format strings. Instead of hacking the compiler to assume that these items are stable, this commit instead lays out a story for the stabilization and evolution of these APIs. There are three primary details used by the `format_args!` macro: 1. `Arguments` - an opaque package of a "compiled format string". This structure is passed around and the `write` function is the source of truth for transforming a compiled format string into a string at runtime. This must be able to be constructed in stable code. 2. `Argument` - an opaque structure representing an argument to a format string. This is *almost* a trait object as it's just a pointer/function pair, but due to the function originating from one of many traits, it's not actually a trait object. Like `Arguments`, this must be constructed from stable code. 3. `fmt::rt` - this module contains the runtime type definitions primarily for the `rt::Argument` structure. Whenever an argument is formatted with nonstandard flags, a corresponding `rt::Argument` is generated describing how the argument is being formatted. This can be used to construct an `Arguments`. The primary interface to `std::fmt` is the `Arguments` structure, and as such this type name is stabilize as-is today. It is expected for libraries to pass around an `Arguments` structure to represent a pending formatted computation. The remaining portions are largely "cruft" which would rather not be stabilized, but due to the stability checks they must be. As a result, almost all pieces have been renamed to represent that they are "version 1" of the formatting representation. The theory is that at a later date if we change the representation of these types we can add new definitions called "version 2" and corresponding constructors for `Arguments`. One of the other remaining large questions about the fmt module were how the pending I/O reform would affect the signatures of methods in the module. Due to [RFC 526][rfc], however, the writers of fmt are now incompatible with the writers of io, so this question has largely been solved. As a result the interfaces are largely stabilized as-is today. [rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0526-fmt-text-writer.md Specifically, the following changes were made: * The contents of `fmt::rt` were all moved under `fmt::rt::v1` * `fmt::rt` is stable * `fmt::rt::v1` is stable * `Error` is stable * `Writer` is stable * `Writer::write_str` is stable * `Writer::write_fmt` is stable * `Formatter` is stable * `Argument` has been renamed to `ArgumentV1` and is stable * `ArgumentV1::new` is stable * `ArgumentV1::from_uint` is stable * `Arguments::new_v1` is stable (renamed from `new`) * `Arguments::new_v1_formatted` is stable (renamed from `with_placeholders`) * All formatting traits are now stable, as well as the `fmt` method. * `fmt::write` is stable * `fmt::format` is stable * `Formatter::pad_integral` is stable * `Formatter::pad` is stable * `Formatter::write_str` is stable * `Formatter::write_fmt` is stable * Some assorted top level items which were only used by `format_args!` were removed in favor of static functions on `ArgumentV1` as well. * The formatting-flag-accessing methods remain unstable Within the contents of the `fmt::rt::v1` module, the following actions were taken: * Reexports of all enum variants were removed * All prefixes on enum variants were removed * A few miscellaneous enum variants were renamed * Otherwise all structs, fields, and variants were marked stable. In addition to these actions in the `std::fmt` module, many implementations of `Show` and `String` were stabilized as well. In some other modules: * `ToString` is now stable * `ToString::to_string` is now stable * `Vec` no longer implements `fmt::Writer` (this has moved to `String`) This is a breaking change due to all of the changes to the `fmt::rt` module, but this likely will not have much impact on existing programs. Closes #20661 [breaking-change]
1 parent 52c74e6 commit 6227357

File tree

21 files changed

+379
-349
lines changed

21 files changed

+379
-349
lines changed

src/liballoc/arc.rs

+16-13
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,22 @@
1212

1313
//! Threadsafe reference-counted boxes (the `Arc<T>` type).
1414
//!
15-
//! The `Arc<T>` type provides shared ownership of an immutable value. Destruction is
16-
//! deterministic, and will occur as soon as the last owner is gone. It is marked as `Send` because
17-
//! it uses atomic reference counting.
15+
//! The `Arc<T>` type provides shared ownership of an immutable value.
16+
//! Destruction is deterministic, and will occur as soon as the last owner is
17+
//! gone. It is marked as `Send` because it uses atomic reference counting.
1818
//!
19-
//! If you do not need thread-safety, and just need shared ownership, consider the [`Rc<T>`
20-
//! type](../rc/struct.Rc.html). It is the same as `Arc<T>`, but does not use atomics, making it
21-
//! both thread-unsafe as well as significantly faster when updating the reference count.
19+
//! If you do not need thread-safety, and just need shared ownership, consider
20+
//! the [`Rc<T>` type](../rc/struct.Rc.html). It is the same as `Arc<T>`, but
21+
//! does not use atomics, making it both thread-unsafe as well as significantly
22+
//! faster when updating the reference count.
2223
//!
23-
//! The `downgrade` method can be used to create a non-owning `Weak<T>` pointer to the box. A
24-
//! `Weak<T>` pointer can be upgraded to an `Arc<T>` pointer, but will return `None` if the value
25-
//! has already been dropped.
24+
//! The `downgrade` method can be used to create a non-owning `Weak<T>` pointer
25+
//! to the box. A `Weak<T>` pointer can be upgraded to an `Arc<T>` pointer, but
26+
//! will return `None` if the value has already been dropped.
2627
//!
27-
//! For example, a tree with parent pointers can be represented by putting the nodes behind strong
28-
//! `Arc<T>` pointers, and then storing the parent pointers as `Weak<T>` pointers.
28+
//! For example, a tree with parent pointers can be represented by putting the
29+
//! nodes behind strong `Arc<T>` pointers, and then storing the parent pointers
30+
//! as `Weak<T>` pointers.
2931
//!
3032
//! # Examples
3133
//!
@@ -87,8 +89,9 @@ use heap::deallocate;
8789
///
8890
/// # Example
8991
///
90-
/// In this example, a large vector of floats is shared between several tasks. With simple pipes,
91-
/// without `Arc`, a copy would have to be made for each task.
92+
/// In this example, a large vector of floats is shared between several tasks.
93+
/// With simple pipes, without `Arc`, a copy would have to be made for each
94+
/// task.
9295
///
9396
/// ```rust
9497
/// use std::sync::Arc;

src/libcollections/bit.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1730,6 +1730,7 @@ impl BitvSet {
17301730
}
17311731
}
17321732

1733+
#[stable(feature = "rust1", since = "1.0.0")]
17331734
impl fmt::Debug for BitvSet {
17341735
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
17351736
try!(write!(fmt, "BitvSet {{"));

src/libcollections/enum_set.rs

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ pub struct EnumSet<E> {
3131

3232
impl<E> Copy for EnumSet<E> {}
3333

34+
#[stable(feature = "rust1", since = "1.0.0")]
3435
impl<E:CLike + fmt::Debug> fmt::Debug for EnumSet<E> {
3536
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
3637
try!(write!(fmt, "EnumSet {{"));

src/libcollections/string.rs

+4
Original file line numberDiff line numberDiff line change
@@ -938,11 +938,14 @@ impl FromStr for String {
938938
}
939939

940940
/// A generic trait for converting a value to a string
941+
#[stable(feature = "rust1", since = "1.0.0")]
941942
pub trait ToString {
942943
/// Converts the value of `self` to an owned string
944+
#[stable(feature = "rust1", since = "1.0.0")]
943945
fn to_string(&self) -> String;
944946
}
945947

948+
#[stable(feature = "rust1", since = "1.0.0")]
946949
impl<T: fmt::Display + ?Sized> ToString for T {
947950
#[inline]
948951
fn to_string(&self) -> String {
@@ -979,6 +982,7 @@ impl<'a> Str for CowString<'a> {
979982
}
980983
}
981984

985+
#[stable(feature = "rust1", since = "1.0.0")]
982986
impl fmt::Writer for String {
983987
#[inline]
984988
fn write_str(&mut self, s: &str) -> fmt::Result {

src/libcollections/vec.rs

-7
Original file line numberDiff line numberDiff line change
@@ -1546,13 +1546,6 @@ impl<T: fmt::Debug> fmt::Debug for Vec<T> {
15461546
}
15471547
}
15481548

1549-
impl<'a> fmt::Writer for Vec<u8> {
1550-
fn write_str(&mut self, s: &str) -> fmt::Result {
1551-
self.push_all(s.as_bytes());
1552-
Ok(())
1553-
}
1554-
}
1555-
15561549
////////////////////////////////////////////////////////////////////////////////
15571550
// Clone-on-write
15581551
////////////////////////////////////////////////////////////////////////////////

0 commit comments

Comments
 (0)