aboutsummaryrefslogtreecommitdiff
path: root/src/comp/middle/metadata.rs
diff options
context:
space:
mode:
authorPatrick Walton <[email protected]>2011-05-10 14:47:28 -0700
committerPatrick Walton <[email protected]>2011-05-10 14:48:24 -0700
commit17daf1f9bf4e78c9f3ed8be24ef4bc15d60c744e (patch)
treeec00fbd2224c19c7009dae0fbc555d50ca8a368e /src/comp/middle/metadata.rs
parentSwitch memcpy to memmove since we're willing to compile x = x and such. (diff)
downloadrust-17daf1f9bf4e78c9f3ed8be24ef4bc15d60c744e.tar.xz
rust-17daf1f9bf4e78c9f3ed8be24ef4bc15d60c744e.zip
rustc: Cache intermediate results of metadata.Encode.ty_str. Shaves 30% off translation time.
Diffstat (limited to 'src/comp/middle/metadata.rs')
-rw-r--r--src/comp/middle/metadata.rs14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/comp/middle/metadata.rs b/src/comp/middle/metadata.rs
index dee9046d..dfc441a9 100644
--- a/src/comp/middle/metadata.rs
+++ b/src/comp/middle/metadata.rs
@@ -82,7 +82,19 @@ mod Encode {
fn enc_ty(&IO.writer w, &@ctxt cx, &ty.t t) {
alt (cx.abbrevs) {
- case (ac_no_abbrevs) { enc_sty(w, cx, ty.struct(cx.tcx, t)); }
+ case (ac_no_abbrevs) {
+ auto result_str;
+ alt (cx.tcx.short_names_cache.find(t)) {
+ case (some[str](?s)) { result_str = s; }
+ case (none[str]) {
+ auto sw = IO.string_writer();
+ enc_sty(sw.get_writer(), cx, ty.struct(cx.tcx, t));
+ result_str = sw.get_str();
+ cx.tcx.short_names_cache.insert(t, result_str);
+ }
+ }
+ w.write_str(result_str);
+ }
case (ac_use_abbrevs(?abbrevs)) {
alt (abbrevs.find(t)) {
case (some[ty_abbrev](?a)) {