@@ -54,6 +54,7 @@ mod unit;
54
54
pub mod unit_dependencies;
55
55
pub mod unit_graph;
56
56
57
+ use std:: borrow:: Cow ;
57
58
use std:: collections:: { HashMap , HashSet } ;
58
59
use std:: env;
59
60
use std:: ffi:: { OsStr , OsString } ;
@@ -1756,10 +1757,15 @@ fn on_stderr_line_inner(
1756
1757
..
1757
1758
} => {
1758
1759
#[ 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
1760
1764
rendered : String ,
1761
- message : String ,
1762
- level : String ,
1765
+ #[ serde( borrow) ]
1766
+ message : Cow < ' a , str > ,
1767
+ #[ serde( borrow) ]
1768
+ level : Cow < ' a , str > ,
1763
1769
children : Vec < PartialDiagnostic > ,
1764
1770
}
1765
1771
@@ -1782,7 +1788,8 @@ fn on_stderr_line_inner(
1782
1788
suggestion_applicability : Option < Applicability > ,
1783
1789
}
1784
1790
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
+ {
1786
1793
if msg. message . starts_with ( "aborting due to" )
1787
1794
|| msg. message . ends_with ( "warning emitted" )
1788
1795
|| msg. message . ends_with ( "warnings emitted" )
@@ -1808,7 +1815,7 @@ fn on_stderr_line_inner(
1808
1815
} )
1809
1816
. any ( |b| b) ;
1810
1817
count_diagnostic ( & msg. level , options) ;
1811
- state. emit_diag ( msg. level , rendered, machine_applicable) ?;
1818
+ state. emit_diag ( & msg. level , rendered, machine_applicable) ?;
1812
1819
}
1813
1820
return Ok ( true ) ;
1814
1821
}
@@ -1819,16 +1826,17 @@ fn on_stderr_line_inner(
1819
1826
// cached replay to enable/disable colors without re-invoking rustc.
1820
1827
MessageFormat :: Json { ansi : false , .. } => {
1821
1828
#[ derive( serde:: Deserialize , serde:: Serialize ) ]
1822
- struct CompilerMessage {
1829
+ struct CompilerMessage < ' a > {
1823
1830
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 > ,
1826
1833
}
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
+ {
1828
1837
error. rendered = anstream:: adapter:: strip_str ( & error. rendered ) . to_string ( ) ;
1829
1838
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) ?;
1832
1840
}
1833
1841
}
1834
1842
@@ -1844,11 +1852,12 @@ fn on_stderr_line_inner(
1844
1852
// Look for a matching directive and inform Cargo internally that a
1845
1853
// metadata file has been produced.
1846
1854
#[ derive( serde:: Deserialize ) ]
1847
- struct ArtifactNotification {
1848
- artifact : String ,
1855
+ struct ArtifactNotification < ' a > {
1856
+ #[ serde( borrow) ]
1857
+ artifact : Cow < ' a , str > ,
1849
1858
}
1850
1859
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 ( ) ) {
1852
1861
trace ! ( "found directive from rustc: `{}`" , artifact. artifact) ;
1853
1862
if artifact. artifact . ends_with ( ".rmeta" ) {
1854
1863
debug ! ( "looks like metadata finished early!" ) ;
@@ -1866,12 +1875,14 @@ fn on_stderr_line_inner(
1866
1875
}
1867
1876
1868
1877
#[ 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 > ,
1872
1883
}
1873
1884
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 ( ) ) {
1875
1886
if msg. message . starts_with ( "aborting due to" )
1876
1887
|| msg. message . ends_with ( "warning emitted" )
1877
1888
|| msg. message . ends_with ( "warnings emitted" )
0 commit comments