@@ -35,6 +35,7 @@ use std::cell::{Cell, RefCell};
3535use std:: io;
3636use std:: io:: fs;
3737use std:: io:: MemReader ;
38+ use std:: mem:: drop;
3839use std:: os;
3940use std:: vec_ng:: Vec ;
4041use std:: vec_ng;
@@ -357,17 +358,20 @@ pub fn phase_3_run_analysis_passes(sess: Session,
357358
358359 time ( time_passes, "match checking" , ( ) , |_|
359360 middle:: check_match:: check_crate ( & ty_cx, method_map,
360- moves_map, krate) ) ;
361+ & moves_map, krate) ) ;
361362
362363 time ( time_passes, "liveness checking" , ( ) , |_|
363364 middle:: liveness:: check_crate ( & ty_cx, method_map,
364- capture_map, krate) ) ;
365+ & capture_map, krate) ) ;
365366
366367 let root_map =
367368 time ( time_passes, "borrow checking" , ( ) , |_|
368369 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) ;
371375
372376 time ( time_passes, "kind checking" , ( ) , |_|
373377 kind:: check_crate ( & ty_cx, method_map, krate) ) ;
@@ -396,7 +400,7 @@ pub fn phase_3_run_analysis_passes(sess: Session,
396400 root_map : root_map,
397401 method_map : method_map,
398402 vtable_map : vtable_map,
399- capture_map : capture_map
403+ capture_map : RefCell :: new ( capture_map)
400404 } ,
401405 reachable : reachable_map
402406 }
@@ -414,10 +418,13 @@ pub struct CrateTranslation {
414418/// Run the translation phase to LLVM, after which the AST and analysis can
415419/// be discarded.
416420pub 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) )
421428}
422429
423430/// 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,
582589
583590 let analysis = phase_3_run_analysis_passes ( sess, & expanded_crate, ast_map) ;
584591 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 )
588595 } ;
589596 phase_5_run_llvm_passes ( & sess, & trans, & outputs) ;
590597 if stop_after_phase_5 ( & sess) { return ; }
0 commit comments