Skip to content

Commit ad30e9a

Browse files
committed
Auto merge of #57830 - Centril:rollup, r=Centril
Rollup of 9 pull requests Successful merges: - #57537 (Small perf improvement for fmt) - #57552 (Default images) - #57604 (Make `str` indexing generic on `SliceIndex`.) - #57667 (Fix memory leak in P::filter_map) - #57677 (const_eval: Predetermine the layout of all locals when pushing a stack frame) - #57791 (Add regression test for #54582) - #57798 (Corrected spelling inconsistency) - #57809 (Add powerpc64-unknown-freebsd) - #57813 (fix validation range printing when encountering undef) Failed merges: r? @ghost
2 parents 76c87a1 + dec7b7b commit ad30e9a

40 files changed

+494
-283
lines changed

src/libcore/benches/fmt.rs

+110
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
use std::io::{self, Write as IoWrite};
2+
use std::fmt::{self, Write as FmtWrite};
3+
use test::Bencher;
4+
5+
#[bench]
6+
fn write_vec_value(bh: &mut Bencher) {
7+
bh.iter(|| {
8+
let mut mem = Vec::new();
9+
for _ in 0..1000 {
10+
mem.write_all("abc".as_bytes()).unwrap();
11+
}
12+
});
13+
}
14+
15+
#[bench]
16+
fn write_vec_ref(bh: &mut Bencher) {
17+
bh.iter(|| {
18+
let mut mem = Vec::new();
19+
let wr = &mut mem as &mut dyn io::Write;
20+
for _ in 0..1000 {
21+
wr.write_all("abc".as_bytes()).unwrap();
22+
}
23+
});
24+
}
25+
26+
#[bench]
27+
fn write_vec_macro1(bh: &mut Bencher) {
28+
bh.iter(|| {
29+
let mut mem = Vec::new();
30+
let wr = &mut mem as &mut dyn io::Write;
31+
for _ in 0..1000 {
32+
write!(wr, "abc").unwrap();
33+
}
34+
});
35+
}
36+
37+
#[bench]
38+
fn write_vec_macro2(bh: &mut Bencher) {
39+
bh.iter(|| {
40+
let mut mem = Vec::new();
41+
let wr = &mut mem as &mut dyn io::Write;
42+
for _ in 0..1000 {
43+
write!(wr, "{}", "abc").unwrap();
44+
}
45+
});
46+
}
47+
48+
#[bench]
49+
fn write_vec_macro_debug(bh: &mut Bencher) {
50+
bh.iter(|| {
51+
let mut mem = Vec::new();
52+
let wr = &mut mem as &mut dyn io::Write;
53+
for _ in 0..1000 {
54+
write!(wr, "{:?}", "☃").unwrap();
55+
}
56+
});
57+
}
58+
59+
#[bench]
60+
fn write_str_value(bh: &mut Bencher) {
61+
bh.iter(|| {
62+
let mut mem = String::new();
63+
for _ in 0..1000 {
64+
mem.write_str("abc").unwrap();
65+
}
66+
});
67+
}
68+
69+
#[bench]
70+
fn write_str_ref(bh: &mut Bencher) {
71+
bh.iter(|| {
72+
let mut mem = String::new();
73+
let wr = &mut mem as &mut dyn fmt::Write;
74+
for _ in 0..1000 {
75+
wr.write_str("abc").unwrap();
76+
}
77+
});
78+
}
79+
80+
#[bench]
81+
fn write_str_macro1(bh: &mut Bencher) {
82+
bh.iter(|| {
83+
let mut mem = String::new();
84+
for _ in 0..1000 {
85+
write!(mem, "abc").unwrap();
86+
}
87+
});
88+
}
89+
90+
#[bench]
91+
fn write_str_macro2(bh: &mut Bencher) {
92+
bh.iter(|| {
93+
let mut mem = String::new();
94+
let wr = &mut mem as &mut dyn fmt::Write;
95+
for _ in 0..1000 {
96+
write!(wr, "{}", "abc").unwrap();
97+
}
98+
});
99+
}
100+
101+
#[bench]
102+
fn write_str_macro_debug(bh: &mut Bencher) {
103+
bh.iter(|| {
104+
let mut mem = String::new();
105+
let wr = &mut mem as &mut dyn fmt::Write;
106+
for _ in 0..1000 {
107+
write!(wr, "{:?}", "☃").unwrap();
108+
}
109+
});
110+
}

src/libcore/benches/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@ mod iter;
1111
mod num;
1212
mod ops;
1313
mod slice;
14+
mod fmt;

src/libcore/fmt/mod.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -1006,28 +1006,30 @@ pub fn write(output: &mut dyn Write, args: Arguments) -> Result {
10061006
curarg: args.args.iter(),
10071007
};
10081008

1009-
let mut pieces = args.pieces.iter();
1009+
let mut idx = 0;
10101010

10111011
match args.fmt {
10121012
None => {
10131013
// We can use default formatting parameters for all arguments.
1014-
for (arg, piece) in args.args.iter().zip(pieces.by_ref()) {
1014+
for (arg, piece) in args.args.iter().zip(args.pieces.iter()) {
10151015
formatter.buf.write_str(*piece)?;
10161016
(arg.formatter)(arg.value, &mut formatter)?;
1017+
idx += 1;
10171018
}
10181019
}
10191020
Some(fmt) => {
10201021
// Every spec has a corresponding argument that is preceded by
10211022
// a string piece.
1022-
for (arg, piece) in fmt.iter().zip(pieces.by_ref()) {
1023+
for (arg, piece) in fmt.iter().zip(args.pieces.iter()) {
10231024
formatter.buf.write_str(*piece)?;
10241025
formatter.run(arg)?;
1026+
idx += 1;
10251027
}
10261028
}
10271029
}
10281030

10291031
// There can be only one trailing string piece left.
1030-
if let Some(piece) = pieces.next() {
1032+
if let Some(piece) = args.pieces.get(idx) {
10311033
formatter.buf.write_str(*piece)?;
10321034
}
10331035

src/libcore/ops/index.rs

-15
Original file line numberDiff line numberDiff line change
@@ -51,21 +51,6 @@
5151
/// ```
5252
#[lang = "index"]
5353
#[rustc_on_unimplemented(
54-
on(
55-
_Self="&str",
56-
note="you can use `.chars().nth()` or `.bytes().nth()`
57-
see chapter in The Book <https://doc.rust-lang.org/book/ch08-02-strings.html#indexing-into-strings>"
58-
),
59-
on(
60-
_Self="str",
61-
note="you can use `.chars().nth()` or `.bytes().nth()`
62-
see chapter in The Book <https://doc.rust-lang.org/book/ch08-02-strings.html#indexing-into-strings>"
63-
),
64-
on(
65-
_Self="std::string::String",
66-
note="you can use `.chars().nth()` or `.bytes().nth()`
67-
see chapter in The Book <https://doc.rust-lang.org/book/ch08-02-strings.html#indexing-into-strings>"
68-
),
6954
message="the type `{Self}` cannot be indexed by `{Idx}`",
7055
label="`{Self}` cannot be indexed by `{Idx}`",
7156
)]

src/libcore/slice/mod.rs

+13-3
Original file line numberDiff line numberDiff line change
@@ -2383,7 +2383,6 @@ impl [u8] {
23832383
}
23842384

23852385
#[stable(feature = "rust1", since = "1.0.0")]
2386-
#[rustc_on_unimplemented = "slice indices are of type `usize` or ranges of `usize`"]
23872386
impl<T, I> ops::Index<I> for [T]
23882387
where I: SliceIndex<[T]>
23892388
{
@@ -2396,7 +2395,6 @@ impl<T, I> ops::Index<I> for [T]
23962395
}
23972396

23982397
#[stable(feature = "rust1", since = "1.0.0")]
2399-
#[rustc_on_unimplemented = "slice indices are of type `usize` or ranges of `usize`"]
24002398
impl<T, I> ops::IndexMut<I> for [T]
24012399
where I: SliceIndex<[T]>
24022400
{
@@ -2447,7 +2445,19 @@ mod private_slice_index {
24472445

24482446
/// A helper trait used for indexing operations.
24492447
#[stable(feature = "slice_get_slice", since = "1.28.0")]
2450-
#[rustc_on_unimplemented = "slice indices are of type `usize` or ranges of `usize`"]
2448+
#[rustc_on_unimplemented(
2449+
on(
2450+
T = "str",
2451+
label = "string indices are ranges of `usize`",
2452+
),
2453+
on(
2454+
all(any(T = "str", T = "&str", T = "std::string::String"), _Self="{integer}"),
2455+
note="you can use `.chars().nth()` or `.bytes().nth()`
2456+
see chapter in The Book <https://doc.rust-lang.org/book/ch08-02-strings.html#indexing-into-strings>"
2457+
),
2458+
message = "the type `{T}` cannot be indexed by `{Self}`",
2459+
label = "slice indices are of type `usize` or ranges of `usize`",
2460+
)]
24512461
pub trait SliceIndex<T: ?Sized>: private_slice_index::Sealed {
24522462
/// The output type returned by methods.
24532463
#[stable(feature = "slice_get_slice", since = "1.28.0")]

0 commit comments

Comments
 (0)