@@ -35,6 +35,7 @@ use std::cell::{Cell, RefCell};
35
35
use std:: io;
36
36
use std:: io:: fs;
37
37
use std:: io:: MemReader ;
38
+ use std:: mem:: drop;
38
39
use std:: os;
39
40
use std:: vec_ng:: Vec ;
40
41
use std:: vec_ng;
@@ -357,17 +358,20 @@ pub fn phase_3_run_analysis_passes(sess: Session,
357
358
358
359
time ( time_passes, "match checking" , ( ) , |_|
359
360
middle:: check_match:: check_crate ( & ty_cx, method_map,
360
- moves_map, krate) ) ;
361
+ & moves_map, krate) ) ;
361
362
362
363
time ( time_passes, "liveness checking" , ( ) , |_|
363
364
middle:: liveness:: check_crate ( & ty_cx, method_map,
364
- capture_map, krate) ) ;
365
+ & capture_map, krate) ) ;
365
366
366
367
let root_map =
367
368
time ( time_passes, "borrow checking" , ( ) , |_|
368
369
middle:: borrowck:: check_crate ( & ty_cx, method_map,
369
- moves_map, moved_variables_set,
370
- capture_map, krate) ) ;
370
+ & moves_map, & moved_variables_set,
371
+ & capture_map, krate) ) ;
372
+
373
+ drop ( moves_map) ;
374
+ drop ( moved_variables_set) ;
371
375
372
376
time ( time_passes, "kind checking" , ( ) , |_|
373
377
kind:: check_crate ( & ty_cx, method_map, krate) ) ;
@@ -396,7 +400,7 @@ pub fn phase_3_run_analysis_passes(sess: Session,
396
400
root_map : root_map,
397
401
method_map : method_map,
398
402
vtable_map : vtable_map,
399
- capture_map : capture_map
403
+ capture_map : RefCell :: new ( capture_map)
400
404
} ,
401
405
reachable : reachable_map
402
406
}
@@ -414,10 +418,13 @@ pub struct CrateTranslation {
414
418
/// Run the translation phase to LLVM, after which the AST and analysis can
415
419
/// be discarded.
416
420
pub fn phase_4_translate_to_llvm ( krate : ast:: Crate ,
417
- analysis : & CrateAnalysis ,
418
- outputs : & OutputFilenames ) -> CrateTranslation {
419
- time ( analysis. ty_cx . sess . time_passes ( ) , "translation" , krate, |krate|
420
- trans:: base:: trans_crate ( krate, analysis, outputs) )
421
+ analysis : CrateAnalysis ,
422
+ outputs : & OutputFilenames ) -> ( ty:: ctxt , CrateTranslation ) {
423
+ // Option dance to work around the lack of stack once closures.
424
+ let time_passes = analysis. ty_cx . sess . time_passes ( ) ;
425
+ let mut analysis = Some ( analysis) ;
426
+ time ( time_passes, "translation" , krate, |krate|
427
+ trans:: base:: trans_crate ( krate, analysis. take_unwrap ( ) , outputs) )
421
428
}
422
429
423
430
/// Run LLVM itself, producing a bitcode file, assembly file or object file
@@ -582,9 +589,9 @@ pub fn compile_input(sess: Session, cfg: ast::CrateConfig, input: &Input,
582
589
583
590
let analysis = phase_3_run_analysis_passes ( sess, & expanded_crate, ast_map) ;
584
591
if stop_after_phase_3 ( & analysis. ty_cx . sess ) { return ; }
585
- let trans = phase_4_translate_to_llvm ( expanded_crate,
586
- & analysis, & outputs) ;
587
- ( outputs, trans, analysis . ty_cx . sess )
592
+ let ( tcx , trans) = phase_4_translate_to_llvm ( expanded_crate,
593
+ analysis, & outputs) ;
594
+ ( outputs, trans, tcx . sess )
588
595
} ;
589
596
phase_5_run_llvm_passes ( & sess, & trans, & outputs) ;
590
597
if stop_after_phase_5 ( & sess) { return ; }
0 commit comments