aboutsummaryrefslogtreecommitdiff
path: root/src/comp
diff options
context:
space:
mode:
authorPatrick Walton <[email protected]>2011-04-19 16:40:46 -0700
committerPatrick Walton <[email protected]>2011-04-19 16:41:08 -0700
commit6651826677842083c59725903a856eb39d8e5051 (patch)
treeb1ffc8f3bf31b7c1432ef9c600849b6b5cb56bd2 /src/comp
parentrustc: Use marijnh's stringifier for type hash and equality, since it's not s... (diff)
downloadrust-6651826677842083c59725903a856eb39d8e5051.tar.xz
rust-6651826677842083c59725903a856eb39d8e5051.zip
rustc: Cache the results of type_of()
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/middle/trans.rs9
-rw-r--r--src/comp/rustc.rc32
2 files changed, 25 insertions, 16 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index d9b58c11..d3ccd909 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -110,6 +110,7 @@ state type crate_ctxt = rec(session.session sess,
hashmap[ast.def_id,()] obj_methods,
hashmap[@ty.t, @tydesc_info] tydescs,
hashmap[str, ValueRef] module_data,
+ hashmap[@ty.t, TypeRef] lltypes,
@glue_fns glues,
namegen names,
vec[str] path,
@@ -676,6 +677,11 @@ fn type_of_native_fn(@crate_ctxt cx, ast.native_abi abi,
}
fn type_of_inner(@crate_ctxt cx, @ty.t t) -> TypeRef {
+ // Check the cache.
+ if (cx.lltypes.contains_key(t)) {
+ ret cx.lltypes.get(t);
+ }
+
let TypeRef llty = 0 as TypeRef;
alt (t.struct) {
@@ -779,6 +785,7 @@ fn type_of_inner(@crate_ctxt cx, @ty.t t) -> TypeRef {
check (llty as int != 0);
llvm.LLVMAddTypeName(cx.llmod, _str.buf(ty.ty_to_str(t)), llty);
+ cx.lltypes.insert(t, llty);
ret llty;
}
@@ -7476,6 +7483,7 @@ fn trans_crate(session.session sess, @ast.crate crate,
auto eqer = ty.eq_ty;
auto tag_sizes = map.mk_hashmap[@ty.t,uint](hasher, eqer);
auto tydescs = map.mk_hashmap[@ty.t,@tydesc_info](hasher, eqer);
+ auto lltypes = map.mk_hashmap[@ty.t,TypeRef](hasher, eqer);
let vec[ast.ty_param] obj_typarams = vec();
let vec[ast.obj_field] obj_fields = vec();
@@ -7500,6 +7508,7 @@ fn trans_crate(session.session sess, @ast.crate crate,
obj_methods = new_def_hash[()](),
tydescs = tydescs,
module_data = new_str_hash[ValueRef](),
+ lltypes = lltypes,
glues = glues,
names = namegen(0),
path = pth,
diff --git a/src/comp/rustc.rc b/src/comp/rustc.rc
index f580edea..950b43b0 100644
--- a/src/comp/rustc.rc
+++ b/src/comp/rustc.rc
@@ -3,6 +3,22 @@
use std;
+mod middle {
+ mod trans;
+ mod ty;
+ mod fold;
+ mod metadata;
+ mod resolve;
+ mod capture;
+ mod typeck;
+ mod typestate_check;
+}
+
+mod pretty {
+ mod pprust;
+ mod pp;
+}
+
mod front {
mod ast;
mod creader;
@@ -14,17 +30,6 @@ mod front {
mod eval;
}
-mod middle {
- mod fold;
- mod metadata;
- mod resolve;
- mod capture;
- mod trans;
- mod ty;
- mod typeck;
- mod typestate_check;
-}
-
mod back {
mod abi;
mod x86;
@@ -35,11 +40,6 @@ mod driver {
mod session;
}
-mod pretty {
- mod pp;
- mod pprust;
-}
-
mod util {
mod common;
mod typestate_ann;