diff --git a/src/rustc/middle/ty.rs b/src/rustc/middle/ty.rs index d78f2cd359d1..5e60baffa679 100644 --- a/src/rustc/middle/ty.rs +++ b/src/rustc/middle/ty.rs @@ -227,7 +227,8 @@ type ctxt = iface_method_cache: hashmap, ty_param_bounds: hashmap, inferred_modes: hashmap, - borrowings: hashmap}; + borrowings: hashmap, + normalized_cache: hashmap}; type t_box = @{struct: sty, 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(), ty_param_bounds: 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. "] 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 { ty_enum(did, 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 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: