@@ -54,6 +54,7 @@ mod unit;
5454pub mod unit_dependencies;
5555pub mod unit_graph;
5656
57+ use std:: borrow:: Cow ;
5758use std:: collections:: { HashMap , HashSet } ;
5859use std:: env;
5960use std:: ffi:: { OsStr , OsString } ;
@@ -1756,10 +1757,15 @@ fn on_stderr_line_inner(
17561757 ..
17571758 } => {
17581759 #[ derive( serde:: Deserialize ) ]
1759- struct CompilerMessage {
1760+ struct CompilerMessage < ' a > {
1761+ // `rendered` contains escape sequences, which can't be
1762+ // zero-copy deserialized by serde_json.
1763+ // See https://github.com/serde-rs/json/issues/742
17601764 rendered : String ,
1761- message : String ,
1762- level : String ,
1765+ #[ serde( borrow) ]
1766+ message : Cow < ' a , str > ,
1767+ #[ serde( borrow) ]
1768+ level : Cow < ' a , str > ,
17631769 children : Vec < PartialDiagnostic > ,
17641770 }
17651771
@@ -1782,7 +1788,8 @@ fn on_stderr_line_inner(
17821788 suggestion_applicability : Option < Applicability > ,
17831789 }
17841790
1785- if let Ok ( mut msg) = serde_json:: from_str :: < CompilerMessage > ( compiler_message. get ( ) ) {
1791+ if let Ok ( mut msg) = serde_json:: from_str :: < CompilerMessage < ' _ > > ( compiler_message. get ( ) )
1792+ {
17861793 if msg. message . starts_with ( "aborting due to" )
17871794 || msg. message . ends_with ( "warning emitted" )
17881795 || msg. message . ends_with ( "warnings emitted" )
@@ -1808,7 +1815,7 @@ fn on_stderr_line_inner(
18081815 } )
18091816 . any ( |b| b) ;
18101817 count_diagnostic ( & msg. level , options) ;
1811- state. emit_diag ( msg. level , rendered, machine_applicable) ?;
1818+ state. emit_diag ( & msg. level , rendered, machine_applicable) ?;
18121819 }
18131820 return Ok ( true ) ;
18141821 }
@@ -1819,16 +1826,17 @@ fn on_stderr_line_inner(
18191826 // cached replay to enable/disable colors without re-invoking rustc.
18201827 MessageFormat :: Json { ansi : false , .. } => {
18211828 #[ derive( serde:: Deserialize , serde:: Serialize ) ]
1822- struct CompilerMessage {
1829+ struct CompilerMessage < ' a > {
18231830 rendered : String ,
1824- #[ serde( flatten) ]
1825- other : std:: collections:: BTreeMap < String , serde_json:: Value > ,
1831+ #[ serde( flatten, borrow ) ]
1832+ other : std:: collections:: BTreeMap < Cow < ' a , str > , serde_json:: Value > ,
18261833 }
1827- if let Ok ( mut error) = serde_json:: from_str :: < CompilerMessage > ( compiler_message. get ( ) ) {
1834+ if let Ok ( mut error) =
1835+ serde_json:: from_str :: < CompilerMessage < ' _ > > ( compiler_message. get ( ) )
1836+ {
18281837 error. rendered = anstream:: adapter:: strip_str ( & error. rendered ) . to_string ( ) ;
18291838 let new_line = serde_json:: to_string ( & error) ?;
1830- let new_msg: Box < serde_json:: value:: RawValue > = serde_json:: from_str ( & new_line) ?;
1831- compiler_message = new_msg;
1839+ compiler_message = serde_json:: value:: RawValue :: from_string ( new_line) ?;
18321840 }
18331841 }
18341842
@@ -1844,11 +1852,12 @@ fn on_stderr_line_inner(
18441852 // Look for a matching directive and inform Cargo internally that a
18451853 // metadata file has been produced.
18461854 #[ derive( serde:: Deserialize ) ]
1847- struct ArtifactNotification {
1848- artifact : String ,
1855+ struct ArtifactNotification < ' a > {
1856+ #[ serde( borrow) ]
1857+ artifact : Cow < ' a , str > ,
18491858 }
18501859
1851- if let Ok ( artifact) = serde_json:: from_str :: < ArtifactNotification > ( compiler_message. get ( ) ) {
1860+ if let Ok ( artifact) = serde_json:: from_str :: < ArtifactNotification < ' _ > > ( compiler_message. get ( ) ) {
18521861 trace ! ( "found directive from rustc: `{}`" , artifact. artifact) ;
18531862 if artifact. artifact . ends_with ( ".rmeta" ) {
18541863 debug ! ( "looks like metadata finished early!" ) ;
@@ -1866,12 +1875,14 @@ fn on_stderr_line_inner(
18661875 }
18671876
18681877 #[ derive( serde:: Deserialize ) ]
1869- struct CompilerMessage {
1870- message : String ,
1871- level : String ,
1878+ struct CompilerMessage < ' a > {
1879+ #[ serde( borrow) ]
1880+ message : Cow < ' a , str > ,
1881+ #[ serde( borrow) ]
1882+ level : Cow < ' a , str > ,
18721883 }
18731884
1874- if let Ok ( msg) = serde_json:: from_str :: < CompilerMessage > ( compiler_message. get ( ) ) {
1885+ if let Ok ( msg) = serde_json:: from_str :: < CompilerMessage < ' _ > > ( compiler_message. get ( ) ) {
18751886 if msg. message . starts_with ( "aborting due to" )
18761887 || msg. message . ends_with ( "warning emitted" )
18771888 || msg. message . ends_with ( "warnings emitted" )
0 commit comments