@@ -201,14 +201,22 @@ pub trait Write {
201201 impl < W : Write + ?Sized > SpecWriteFmt for & mut W {
202202 #[ inline]
203203 default fn spec_write_fmt ( mut self , args : Arguments < ' _ > ) -> Result {
204- write ( & mut self , args)
204+ if let Some ( s) = args. as_const_str ( ) {
205+ self . write_str ( s)
206+ } else {
207+ write ( & mut self , args)
208+ }
205209 }
206210 }
207211
208212 impl < W : Write > SpecWriteFmt for & mut W {
209213 #[ inline]
210214 fn spec_write_fmt ( self , args : Arguments < ' _ > ) -> Result {
211- write ( self , args)
215+ if let Some ( s) = args. as_const_str ( ) {
216+ self . write_str ( s)
217+ } else {
218+ write ( self , args)
219+ }
212220 }
213221 }
214222
@@ -430,6 +438,14 @@ impl<'a> Arguments<'a> {
430438 _ => None ,
431439 }
432440 }
441+
442+ /// Same as [`Arguments::as_str`], but will only return `Some(s)` if it can be determined at compile time.
443+ #[ must_use]
444+ #[ inline]
445+ fn as_const_str ( & self ) -> Option < & ' static str > {
446+ let s = self . as_str ( ) ;
447+ if core:: intrinsics:: is_val_statically_known ( s. is_some ( ) ) { s } else { None }
448+ }
433449}
434450
435451#[ stable( feature = "rust1" , since = "1.0.0" ) ]
@@ -1119,14 +1135,8 @@ pub trait UpperExp {
11191135/// ```
11201136///
11211137/// [`write!`]: crate::write!
1122- #[ inline]
11231138#[ stable( feature = "rust1" , since = "1.0.0" ) ]
11241139pub fn write ( output : & mut dyn Write , args : Arguments < ' _ > ) -> Result {
1125- if let Some ( s) = args. as_str ( ) { output. write_str ( s) } else { write_internal ( output, args) }
1126- }
1127-
1128- /// Actual implementation of the [`write()`], but without the simple string optimization.
1129- fn write_internal ( output : & mut dyn Write , args : Arguments < ' _ > ) -> Result {
11301140 let mut formatter = Formatter :: new ( output) ;
11311141 let mut idx = 0 ;
11321142
@@ -1605,8 +1615,9 @@ impl<'a> Formatter<'a> {
16051615 /// assert_eq!(format!("{:0>8}", Foo(2)), "Foo 2");
16061616 /// ```
16071617 #[ stable( feature = "rust1" , since = "1.0.0" ) ]
1618+ #[ inline]
16081619 pub fn write_fmt ( & mut self , fmt : Arguments < ' _ > ) -> Result {
1609- write ( self . buf , fmt)
1620+ if let Some ( s ) = fmt . as_const_str ( ) { self . buf . write_str ( s ) } else { write ( self . buf , fmt) }
16101621 }
16111622
16121623 /// Flags for formatting
@@ -2295,8 +2306,13 @@ impl Write for Formatter<'_> {
22952306 self . buf . write_char ( c)
22962307 }
22972308
2309+ #[ inline]
22982310 fn write_fmt ( & mut self , args : Arguments < ' _ > ) -> Result {
2299- write ( self . buf , args)
2311+ if let Some ( s) = args. as_const_str ( ) {
2312+ self . buf . write_str ( s)
2313+ } else {
2314+ write ( self . buf , args)
2315+ }
23002316 }
23012317}
23022318
0 commit comments