@@ -35,9 +35,9 @@ pub enum LoadResult<T> {
35
35
LoadDepGraph ( PathBuf , std:: io:: Error ) ,
36
36
}
37
37
38
- impl < T : Default > LoadResult < T > {
38
+ impl < T > LoadResult < T > {
39
39
/// Accesses the data returned in [`LoadResult::Ok`].
40
- pub fn open ( self , sess : & Session ) -> T {
40
+ pub fn open ( self , sess : & Session , fallback : impl FnOnce ( ) -> T ) -> T {
41
41
// Check for errors when using `-Zassert-incremental-state`
42
42
match ( sess. opts . assert_incr_state , & self ) {
43
43
( Some ( IncrementalStateAssertion :: NotLoaded ) , LoadResult :: Ok { .. } ) => {
@@ -55,14 +55,14 @@ impl<T: Default> LoadResult<T> {
55
55
match self {
56
56
LoadResult :: LoadDepGraph ( path, err) => {
57
57
sess. dcx ( ) . emit_warn ( errors:: LoadDepGraph { path, err } ) ;
58
- Default :: default ( )
58
+ fallback ( )
59
59
}
60
60
LoadResult :: DataOutOfDate => {
61
61
if let Err ( err) = delete_all_session_dir_contents ( sess) {
62
62
sess. dcx ( )
63
63
. emit_err ( errors:: DeleteIncompatible { path : dep_graph_path ( sess) , err } ) ;
64
64
}
65
- Default :: default ( )
65
+ fallback ( )
66
66
}
67
67
LoadResult :: Ok { data } => data,
68
68
}
@@ -93,13 +93,15 @@ fn delete_dirty_work_product(sess: &Session, swp: SerializedWorkProduct) {
93
93
94
94
fn load_dep_graph (
95
95
sess : & Session ,
96
- deps : & DepsType ,
97
- ) -> LoadResult < ( Arc < SerializedDepGraph > , WorkProductMap ) > {
96
+ deps : & Arc < DepsType > ,
97
+ ) -> LoadResult < ( Arc < SerializedDepGraph < DepsType > > , WorkProductMap ) > {
98
98
let prof = sess. prof . clone ( ) ;
99
99
100
100
if sess. opts . incremental . is_none ( ) {
101
101
// No incremental compilation.
102
- return LoadResult :: Ok { data : Default :: default ( ) } ;
102
+ return LoadResult :: Ok {
103
+ data : ( Arc :: new ( SerializedDepGraph :: empty ( deps, sess) ) , Default :: default ( ) ) ,
104
+ } ;
103
105
}
104
106
105
107
let _timer = sess. prof . generic_activity ( "incr_comp_prepare_load_dep_graph" ) ;
@@ -174,7 +176,7 @@ fn load_dep_graph(
174
176
return LoadResult :: DataOutOfDate ;
175
177
}
176
178
177
- let dep_graph = SerializedDepGraph :: decode :: < DepsType > ( & mut decoder, deps) ;
179
+ let dep_graph = SerializedDepGraph :: decode ( & mut decoder, deps, sess ) ;
178
180
179
181
LoadResult :: Ok { data : ( dep_graph, prev_work_products) }
180
182
}
@@ -208,7 +210,7 @@ pub fn load_query_result_cache(sess: &Session) -> Option<OnDiskCache> {
208
210
209
211
/// Setups the dependency graph by loading an existing graph from disk and set up streaming of a
210
212
/// new graph to an incremental session directory.
211
- pub fn setup_dep_graph ( sess : & Session , crate_name : Symbol , deps : & DepsType ) -> DepGraph {
213
+ pub fn setup_dep_graph ( sess : & Session , crate_name : Symbol , deps : & Arc < DepsType > ) -> DepGraph {
212
214
// `load_dep_graph` can only be called after `prepare_session_directory`.
213
215
prepare_session_directory ( sess, crate_name) ;
214
216
@@ -227,7 +229,8 @@ pub fn setup_dep_graph(sess: &Session, crate_name: Symbol, deps: &DepsType) -> D
227
229
}
228
230
229
231
res. and_then ( |result| {
230
- let ( prev_graph, prev_work_products) = result. open ( sess) ;
232
+ let ( prev_graph, prev_work_products) = result
233
+ . open ( sess, || ( Arc :: new ( SerializedDepGraph :: empty ( deps, sess) ) , Default :: default ( ) ) ) ;
231
234
build_dep_graph ( sess, prev_graph, prev_work_products)
232
235
} )
233
236
. unwrap_or_else ( DepGraph :: new_disabled)
0 commit comments