diff --git a/src/librustc/driver/driver.rs b/src/librustc/driver/driver.rs index d46eecc1d63d..4c71c2df44d3 100644 --- a/src/librustc/driver/driver.rs +++ b/src/librustc/driver/driver.rs @@ -32,6 +32,7 @@ use serialize::{json, Encodable}; use std::io; use std::io::fs; +use arena::TypedArena; use syntax::ast; use syntax::attr; use syntax::attr::{AttrMetaMethods}; @@ -86,8 +87,9 @@ pub fn compile_input(sess: Session, if stop_after_phase_2(&sess) { return; } + let type_arena = TypedArena::new(); let analysis = phase_3_run_analysis_passes(sess, &expanded_crate, - ast_map, id); + ast_map, &type_arena, id); phase_save_analysis(&analysis.ty_cx.sess, &expanded_crate, &analysis, outdir); if stop_after_phase_3(&analysis.ty_cx.sess) { return; } let (tcx, trans) = phase_4_translate_to_llvm(expanded_crate, analysis); @@ -299,11 +301,11 @@ pub fn phase_2_configure_and_expand(sess: &Session, Some((krate, map)) } -pub struct CrateAnalysis { +pub struct CrateAnalysis<'tcx> { pub exp_map2: middle::resolve::ExportMap2, pub exported_items: middle::privacy::ExportedItems, pub public_items: middle::privacy::PublicItems, - pub ty_cx: ty::ctxt, + pub ty_cx: ty::ctxt<'tcx>, pub reachable: NodeSet, pub name: String, } @@ -312,10 +314,11 @@ pub struct CrateAnalysis { /// Run the resolution, typechecking, region checking and other /// miscellaneous analysis passes on the crate. Return various /// structures carrying the results of the analysis. -pub fn phase_3_run_analysis_passes(sess: Session, - krate: &ast::Crate, - ast_map: syntax::ast_map::Map, - name: String) -> CrateAnalysis { +pub fn phase_3_run_analysis_passes<'tcx>(sess: Session, + krate: &ast::Crate, + ast_map: syntax::ast_map::Map, + type_arena: &'tcx TypedArena, + name: String) -> CrateAnalysis<'tcx> { let time_passes = sess.time_passes(); time(time_passes, "external crate/lib resolution", (), |_| @@ -362,6 +365,7 @@ pub fn phase_3_run_analysis_passes(sess: Session, stability::Index::build(krate)); let ty_cx = ty::mk_ctxt(sess, + type_arena, def_map, named_region_map, ast_map, diff --git a/src/librustc/driver/pretty.rs b/src/librustc/driver/pretty.rs index 67dbc6f6a301..b535de692880 100644 --- a/src/librustc/driver/pretty.rs +++ b/src/librustc/driver/pretty.rs @@ -33,7 +33,7 @@ use graphviz as dot; use std::io::{mod, MemReader}; use std::from_str::FromStr; use std::option; - +use arena::TypedArena; #[deriving(PartialEq, Show)] pub enum PpSourceMode { @@ -114,7 +114,9 @@ impl PpSourceMode { } PpmTyped => { let ast_map = ast_map.expect("--pretty=typed missing ast_map"); - let analysis = driver::phase_3_run_analysis_passes(sess, krate, ast_map, id); + let type_arena = TypedArena::new(); + let analysis = driver::phase_3_run_analysis_passes(sess, krate, ast_map, + &type_arena, id); let annotation = TypedAnnotation { analysis: analysis }; f(&annotation, payload) } @@ -531,8 +533,9 @@ pub fn pretty_print_input(sess: Session, match code { Some(code) => { let variants = gather_flowgraph_variants(&sess); + let type_arena = TypedArena::new(); let analysis = driver::phase_3_run_analysis_passes(sess, &krate, - ast_map, id); + ast_map, &type_arena, id); print_flowgraph(variants, analysis, code, out) } None => { diff --git a/src/librustc/middle/ty.rs b/src/librustc/middle/ty.rs index 7f2f1151e30c..ff558ce5cffe 100644 --- a/src/librustc/middle/ty.rs +++ b/src/librustc/middle/ty.rs @@ -50,6 +50,7 @@ use std::mem; use std::ops; use std::rc::Rc; use std::collections::{HashMap, HashSet}; +use arena::TypedArena; use syntax::abi; use syntax::ast::{CrateNum, DefId, FnStyle, Ident, ItemTrait, LOCAL_CRATE}; use syntax::ast::{MutImmutable, MutMutable, Name, NamedField, NodeId}; @@ -418,10 +419,13 @@ pub struct TransmuteRestriction { /// The data structure to keep track of all the information that typechecker /// generates so that so that it can be reused and doesn't have to be redone /// later on. -pub struct ctxt { +pub struct ctxt<'tcx> { + /// The arena that types are allocated from. + type_arena: &'tcx TypedArena, + /// Specifically use a speedy hash algorithm for this hash map, it's used /// quite often. - pub interner: RefCell>>, + interner: RefCell>, pub next_id: Cell, pub sess: Session, pub def_map: resolve::DefMap, @@ -1373,21 +1377,22 @@ impl UnboxedClosureKind { } } -pub fn mk_ctxt(s: Session, - dm: resolve::DefMap, - named_region_map: resolve_lifetime::NamedRegionMap, - map: ast_map::Map, - freevars: freevars::freevar_map, - capture_modes: freevars::CaptureModeMap, - region_maps: middle::region::RegionMaps, - lang_items: middle::lang_items::LanguageItems, - stability: stability::Index) - -> ctxt { +pub fn mk_ctxt<'tcx>(s: Session, + type_arena: &'tcx TypedArena, + dm: resolve::DefMap, + named_region_map: resolve_lifetime::NamedRegionMap, + map: ast_map::Map, + freevars: freevars::freevar_map, + capture_modes: freevars::CaptureModeMap, + region_maps: middle::region::RegionMaps, + lang_items: middle::lang_items::LanguageItems, + stability: stability::Index) -> ctxt<'tcx> { ctxt { + type_arena: type_arena, + interner: RefCell::new(FnvHashMap::new()), named_region_map: named_region_map, item_variance_map: RefCell::new(DefIdMap::new()), variance_computed: Cell::new(false), - interner: RefCell::new(FnvHashMap::new()), next_id: Cell::new(primitives::LAST_PRIMITIVE_ID), sess: s, def_map: dm, @@ -1554,11 +1559,11 @@ pub fn mk_t(cx: &ctxt, st: sty) -> t { } } - let t = box t_box_ { + let t = cx.type_arena.alloc(t_box_ { sty: st, id: cx.next_id.get(), flags: flags, - }; + }); let sty_ptr = &t.sty as *const sty;