rustc: Cache normalized types

This commit is contained in:
Brian Anderson
2012-04-24 18:23:54 -07:00
parent df0ef528b9
commit 3a3a7fc426

View File

@@ -227,7 +227,8 @@ type ctxt =
iface_method_cache: hashmap<def_id, @[method]>, iface_method_cache: hashmap<def_id, @[method]>,
ty_param_bounds: hashmap<ast::node_id, param_bounds>, ty_param_bounds: hashmap<ast::node_id, param_bounds>,
inferred_modes: hashmap<ast::node_id, ast::mode>, inferred_modes: hashmap<ast::node_id, ast::mode>,
borrowings: hashmap<ast::node_id, ()>}; borrowings: hashmap<ast::node_id, ()>,
normalized_cache: hashmap<t, t>};
type t_box = @{struct: sty, type t_box = @{struct: sty,
id: uint, id: uint,
@@ -461,7 +462,8 @@ fn mk_ctxt(s: session::session, dm: resolve::def_map, amap: ast_map::map,
iface_method_cache: new_def_hash(), iface_method_cache: new_def_hash(),
ty_param_bounds: map::int_hash(), ty_param_bounds: map::int_hash(),
inferred_modes: map::int_hash(), inferred_modes: map::int_hash(),
borrowings: map::int_hash()} borrowings: map::int_hash(),
normalized_cache: new_ty_hash()}
} }
@@ -2680,6 +2682,11 @@ fn ty_params_to_tys(tcx: ty::ctxt, tps: [ast::ty_param]) -> [t] {
Returns an equivalent type with all the typedefs and self regions removed. Returns an equivalent type with all the typedefs and self regions removed.
"] "]
fn normalize_ty(cx: ctxt, t: t) -> t { fn normalize_ty(cx: ctxt, t: t) -> t {
alt cx.normalized_cache.find(t) {
some(t) { ret t; }
none { }
}
let t = alt get(t).struct { let t = alt get(t).struct {
ty_enum(did, r) { ty_enum(did, r) {
alt r.self_r { alt r.self_r {
@@ -2698,7 +2705,9 @@ fn normalize_ty(cx: ctxt, t: t) -> t {
let t = mk_t(cx, mach_sty(cx.sess.targ_cfg, t)); let t = mk_t(cx, mach_sty(cx.sess.targ_cfg, t));
let sty = fold_sty(get(t).struct) {|t| normalize_ty(cx, t) }; let sty = fold_sty(get(t).struct) {|t| normalize_ty(cx, t) };
mk_t(cx, sty) let t_norm = mk_t(cx, sty);
cx.normalized_cache.insert(t, t_norm);
ret t_norm;
} }
// Local Variables: // Local Variables: