about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-08-24 22:13:16 -0700
committerBrian Anderson <banderson@mozilla.com>2011-08-27 15:54:43 -0700
commitb2408d57f034c0a448b60bf03254d8f73c0882db (patch)
tree91a357adc8eb380341861196f0782be05a1c3824 /src/comp
parentfcc031c5b4dc8f64c497b8dd1e066068e862bd72 (diff)
downloadrust-b2408d57f034c0a448b60bf03254d8f73c0882db.tar.gz
rust-b2408d57f034c0a448b60bf03254d8f73c0882db.zip
Convert portions of rustc to istrs. Recover a lot of performance.
Issue #855
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/back/link.rs4
-rw-r--r--src/comp/metadata/common.rs6
-rw-r--r--src/comp/metadata/decoder.rs3
-rw-r--r--src/comp/metadata/encoder.rs90
-rw-r--r--src/comp/metadata/tyencode.rs12
-rw-r--r--src/comp/middle/trans.rs3
-rw-r--r--src/comp/middle/ty.rs2
-rw-r--r--src/comp/util/ppaux.rs6
8 files changed, 66 insertions, 60 deletions
diff --git a/src/comp/back/link.rs b/src/comp/back/link.rs
index 29eb74e41eb..2a4da724fba 100644
--- a/src/comp/back/link.rs
+++ b/src/comp/back/link.rs
@@ -412,7 +412,7 @@ fn symbol_hash(tcx: ty::ctxt, sha: sha1, t: ty::t, link_meta: &link_meta) ->
     // FIXME: This wants to be link_meta.meta_hash
     sha.input_str(istr::from_estr(link_meta.name));
     sha.input_str(~"-");
-    sha.input_str(istr::from_estr(encoder::encoded_ty(tcx, t)));
+    sha.input_str(encoder::encoded_ty(tcx, t));
     let hash = truncated_sha1_result(sha);
     // Prefix with _ so that it never blends into adjacent digits
 
@@ -458,7 +458,7 @@ fn mangle_internal_name_by_type_only(ccx: &@crate_ctxt, t: ty::t, name: &str)
    -> str {
     let s = util::ppaux::ty_to_short_str(ccx.tcx, t);
     let hash = get_symbol_hash(ccx, t);
-    ret mangle([name, s, hash]);
+    ret mangle([name, istr::to_estr(s), hash]);
 }
 
 fn mangle_internal_name_by_path_and_seq(ccx: &@crate_ctxt, path: &[str],
diff --git a/src/comp/metadata/common.rs b/src/comp/metadata/common.rs
index 9d6a2c745f8..02f434c5c50 100644
--- a/src/comp/metadata/common.rs
+++ b/src/comp/metadata/common.rs
@@ -1,6 +1,6 @@
 // EBML tag definitions and utils shared by the encoder and decoder
 
-import std::str;
+import std::istr;
 
 const tag_paths: uint = 0x01u;
 
@@ -67,9 +67,9 @@ const tag_items_data_item_inlineness: uint = 0x27u;
 // djb's cdb hashes.
 fn hash_node_id(node_id: &int) -> uint { ret 177573u ^ (node_id as uint); }
 
-fn hash_path(s: &str) -> uint {
+fn hash_path(s: &istr) -> uint {
     let h = 5381u;
-    for ch: u8 in str::bytes(s) { h = (h << 5u) + h ^ (ch as uint); }
+    for ch: u8 in istr::bytes(s) { h = (h << 5u) + h ^ (ch as uint); }
     ret h;
 }
 
diff --git a/src/comp/metadata/decoder.rs b/src/comp/metadata/decoder.rs
index 522aba23b6f..97010e0d521 100644
--- a/src/comp/metadata/decoder.rs
+++ b/src/comp/metadata/decoder.rs
@@ -158,7 +158,8 @@ fn resolve_path(path: &[ast::ident], data: @[u8]) -> [ast::def_id] {
     let paths = ebml::get_doc(md, tag_paths);
     let eqer = bind eq_item(_, s);
     let result: [ast::def_id] = [];
-    for doc: ebml::doc in lookup_hash(paths, eqer, hash_path(s)) {
+    for doc: ebml::doc in lookup_hash(paths, eqer,
+                                      hash_path(istr::from_estr(s))) {
         let did_doc = ebml::get_doc(doc, tag_def_id);
         result += [parse_def_id(ebml::doc_data(did_doc))];
     }
diff --git a/src/comp/metadata/encoder.rs b/src/comp/metadata/encoder.rs
index 12db17936dd..1aa89d9a914 100644
--- a/src/comp/metadata/encoder.rs
+++ b/src/comp/metadata/encoder.rs
@@ -27,9 +27,9 @@ type abbrev_map = map::hashmap<ty::t, tyencode::ty_abbrev>;
 type encode_ctxt = {ccx: @crate_ctxt, type_abbrevs: abbrev_map};
 
 // Path table encoding
-fn encode_name(ebml_w: &ebml::writer, name: &str) {
+fn encode_name(ebml_w: &ebml::writer, name: &istr) {
     ebml::start_tag(ebml_w, tag_paths_data_name);
-    ebml_w.writer.write(str::bytes(name));
+    ebml_w.writer.write(istr::bytes(name));
     ebml::end_tag(ebml_w);
 }
 
@@ -42,107 +42,111 @@ fn encode_def_id(ebml_w: &ebml::writer, id: &def_id) {
 type entry<T> = {val: T, pos: uint};
 
 fn encode_tag_variant_paths(ebml_w: &ebml::writer, variants: &[variant],
-                            path: &[str], index: &mutable [entry<str>]) {
+                            path: &[istr], index: &mutable [entry<istr>]) {
     for variant: variant in variants {
-        add_to_index(ebml_w, path, index, variant.node.name);
+        add_to_index(ebml_w, path, index, istr::from_estr(variant.node.name));
         ebml::start_tag(ebml_w, tag_paths_data_item);
-        encode_name(ebml_w, variant.node.name);
+        encode_name(ebml_w, istr::from_estr(variant.node.name));
         encode_def_id(ebml_w, local_def(variant.node.id));
         ebml::end_tag(ebml_w);
     }
 }
 
-fn add_to_index(ebml_w: &ebml::writer, path: &[str],
-                index: &mutable [entry<str>], name: &str) {
+fn add_to_index(ebml_w: &ebml::writer, path: &[istr],
+                index: &mutable [entry<istr>], name: &istr) {
     let full_path = path + [name];
     index +=
-        [{val: str::connect(full_path, "::"), pos: ebml_w.writer.tell()}];
+        [{val: istr::connect(full_path, ~"::"), pos: ebml_w.writer.tell()}];
 }
 
 fn encode_native_module_item_paths(ebml_w: &ebml::writer, nmod: &native_mod,
-                                   path: &[str],
-                                   index: &mutable [entry<str>]) {
+                                   path: &[istr],
+                                   index: &mutable [entry<istr>]) {
     for nitem: @native_item in nmod.items {
-        add_to_index(ebml_w, path, index, nitem.ident);
+        add_to_index(ebml_w, path, index, istr::from_estr(nitem.ident));
         ebml::start_tag(ebml_w, tag_paths_data_item);
-        encode_name(ebml_w, nitem.ident);
+        encode_name(ebml_w, istr::from_estr(nitem.ident));
         encode_def_id(ebml_w, local_def(nitem.id));
         ebml::end_tag(ebml_w);
     }
 }
 
 fn encode_module_item_paths(ebml_w: &ebml::writer, module: &_mod,
-                            path: &[str], index: &mutable [entry<str>]) {
+                            path: &[istr], index: &mutable [entry<istr>]) {
     for it: @item in module.items {
         if !ast_util::is_exported(it.ident, module) { cont; }
         alt it.node {
           item_const(_, _) {
-            add_to_index(ebml_w, path, index, it.ident);
+            add_to_index(ebml_w, path, index, istr::from_estr(it.ident));
             ebml::start_tag(ebml_w, tag_paths_data_item);
-            encode_name(ebml_w, it.ident);
+            encode_name(ebml_w, istr::from_estr(it.ident));
             encode_def_id(ebml_w, local_def(it.id));
             ebml::end_tag(ebml_w);
           }
           item_fn(_, tps) {
-            add_to_index(ebml_w, path, index, it.ident);
+            add_to_index(ebml_w, path, index, istr::from_estr(it.ident));
             ebml::start_tag(ebml_w, tag_paths_data_item);
-            encode_name(ebml_w, it.ident);
+            encode_name(ebml_w, istr::from_estr(it.ident));
             encode_def_id(ebml_w, local_def(it.id));
             ebml::end_tag(ebml_w);
           }
           item_mod(_mod) {
-            add_to_index(ebml_w, path, index, it.ident);
+            add_to_index(ebml_w, path, index, istr::from_estr(it.ident));
             ebml::start_tag(ebml_w, tag_paths_data_mod);
-            encode_name(ebml_w, it.ident);
+            encode_name(ebml_w, istr::from_estr(it.ident));
             encode_def_id(ebml_w, local_def(it.id));
-            encode_module_item_paths(ebml_w, _mod, path + [it.ident], index);
+            encode_module_item_paths(ebml_w, _mod,
+                                     path + [istr::from_estr(it.ident)],
+                                     index);
             ebml::end_tag(ebml_w);
           }
           item_native_mod(nmod) {
-            add_to_index(ebml_w, path, index, it.ident);
+            add_to_index(ebml_w, path, index, istr::from_estr(it.ident));
             ebml::start_tag(ebml_w, tag_paths_data_mod);
-            encode_name(ebml_w, it.ident);
+            encode_name(ebml_w, istr::from_estr(it.ident));
             encode_def_id(ebml_w, local_def(it.id));
-            encode_native_module_item_paths(ebml_w, nmod, path + [it.ident],
-                                            index);
+            encode_native_module_item_paths(
+                ebml_w, nmod,
+                path + [istr::from_estr(it.ident)],
+                index);
             ebml::end_tag(ebml_w);
           }
           item_ty(_, tps) {
-            add_to_index(ebml_w, path, index, it.ident);
+            add_to_index(ebml_w, path, index, istr::from_estr(it.ident));
             ebml::start_tag(ebml_w, tag_paths_data_item);
-            encode_name(ebml_w, it.ident);
+            encode_name(ebml_w, istr::from_estr(it.ident));
             encode_def_id(ebml_w, local_def(it.id));
             ebml::end_tag(ebml_w);
           }
           item_res(_, _, tps, ctor_id) {
-            add_to_index(ebml_w, path, index, it.ident);
+            add_to_index(ebml_w, path, index, istr::from_estr(it.ident));
             ebml::start_tag(ebml_w, tag_paths_data_item);
-            encode_name(ebml_w, it.ident);
+            encode_name(ebml_w, istr::from_estr(it.ident));
             encode_def_id(ebml_w, local_def(ctor_id));
             ebml::end_tag(ebml_w);
-            add_to_index(ebml_w, path, index, it.ident);
+            add_to_index(ebml_w, path, index, istr::from_estr(it.ident));
             ebml::start_tag(ebml_w, tag_paths_data_item);
-            encode_name(ebml_w, it.ident);
+            encode_name(ebml_w, istr::from_estr(it.ident));
             encode_def_id(ebml_w, local_def(it.id));
             ebml::end_tag(ebml_w);
           }
           item_tag(variants, tps) {
-            add_to_index(ebml_w, path, index, it.ident);
+            add_to_index(ebml_w, path, index, istr::from_estr(it.ident));
             ebml::start_tag(ebml_w, tag_paths_data_item);
-            encode_name(ebml_w, it.ident);
+            encode_name(ebml_w, istr::from_estr(it.ident));
             encode_def_id(ebml_w, local_def(it.id));
             ebml::end_tag(ebml_w);
             encode_tag_variant_paths(ebml_w, variants, path, index);
           }
           item_obj(_, tps, ctor_id) {
-            add_to_index(ebml_w, path, index, it.ident);
+            add_to_index(ebml_w, path, index, istr::from_estr(it.ident));
             ebml::start_tag(ebml_w, tag_paths_data_item);
-            encode_name(ebml_w, it.ident);
+            encode_name(ebml_w, istr::from_estr(it.ident));
             encode_def_id(ebml_w, local_def(ctor_id));
             ebml::end_tag(ebml_w);
-            add_to_index(ebml_w, path, index, it.ident);
+            add_to_index(ebml_w, path, index, istr::from_estr(it.ident));
             ebml::start_tag(ebml_w, tag_paths_data_item);
-            encode_name(ebml_w, it.ident);
+            encode_name(ebml_w, istr::from_estr(it.ident));
             encode_def_id(ebml_w, local_def(it.id));
             ebml::end_tag(ebml_w);
           }
@@ -150,9 +154,9 @@ fn encode_module_item_paths(ebml_w: &ebml::writer, module: &_mod,
     }
 }
 
-fn encode_item_paths(ebml_w: &ebml::writer, crate: &@crate) -> [entry<str>] {
-    let index: [entry<str>] = [];
-    let path: [str] = [];
+fn encode_item_paths(ebml_w: &ebml::writer, crate: &@crate) -> [entry<istr>] {
+    let index: [entry<istr>] = [];
+    let path: [istr] = [];
     ebml::start_tag(ebml_w, tag_paths);
     encode_module_item_paths(ebml_w, crate.node.module, path, index);
     ebml::end_tag(ebml_w);
@@ -436,8 +440,8 @@ fn encode_index<T>(ebml_w: &ebml::writer, buckets: &[@[entry<T>]],
     ebml::end_tag(ebml_w);
 }
 
-fn write_str(writer: &io::writer, s: &str) {
-    writer.write_str(istr::from_estr(s));
+fn write_str(writer: &io::writer, s: &istr) {
+    writer.write_str(s);
 }
 
 fn write_int(writer: &io::writer, n: &int) {
@@ -623,11 +627,11 @@ fn encode_metadata(cx: &@crate_ctxt, crate: &@crate) -> str {
 }
 
 // Get the encoded string for a type
-fn encoded_ty(tcx: &ty::ctxt, t: ty::t) -> str {
+fn encoded_ty(tcx: &ty::ctxt, t: ty::t) -> istr {
     let cx = @{ds: def_to_str, tcx: tcx, abbrevs: tyencode::ac_no_abbrevs};
     let sw = io::string_writer();
     tyencode::enc_ty(sw.get_writer(), cx, t);
-    ret istr::to_estr(sw.get_str());
+    ret sw.get_str();
 }
 
 
diff --git a/src/comp/metadata/tyencode.rs b/src/comp/metadata/tyencode.rs
index 399ab85fd30..bdb5db6758d 100644
--- a/src/comp/metadata/tyencode.rs
+++ b/src/comp/metadata/tyencode.rs
@@ -26,7 +26,7 @@ type ctxt =
 // Compact string representation for ty.t values. API ty_str & parse_from_str.
 // Extra parameters are for converting to/from def_ids in the string rep.
 // Whatever format you choose should not contain pipe characters.
-type ty_abbrev = {pos: uint, len: uint, s: str};
+type ty_abbrev = {pos: uint, len: uint, s: @istr};
 
 tag abbrev_ctxt { ac_no_abbrevs; ac_use_abbrevs(hashmap<ty::t, ty_abbrev>); }
 
@@ -40,21 +40,21 @@ fn cx_uses_abbrevs(cx: &@ctxt) -> bool {
 fn enc_ty(w: &io::writer, cx: &@ctxt, t: ty::t) {
     alt cx.abbrevs {
       ac_no_abbrevs. {
-        let result_str;
+        let result_str: @istr;
         alt cx.tcx.short_names_cache.find(t) {
           some(s) { result_str = s; }
           none. {
             let sw = io::string_writer();
             enc_sty(sw.get_writer(), cx, ty::struct(cx.tcx, t));
-            result_str = istr::to_estr(sw.get_str());
+            result_str = @sw.get_str();
             cx.tcx.short_names_cache.insert(t, result_str);
           }
         }
-        w.write_str(istr::from_estr(result_str));
+        w.write_str(*result_str);
       }
       ac_use_abbrevs(abbrevs) {
         alt abbrevs.find(t) {
-          some(a) { w.write_str(istr::from_estr(a.s)); ret; }
+          some(a) { w.write_str(*a.s); ret; }
           none. {
             let pos = w.get_buf_writer().tell();
             enc_sty(w, cx, ty::struct(cx.tcx, t));
@@ -73,7 +73,7 @@ fn enc_ty(w: &io::writer, cx: &@ctxt, t: ty::t) {
                 let s =
                     ~"#" + uint::to_str(pos, 16u) + ~":" +
                     uint::to_str(len, 16u) + ~"#";
-                let a = {pos: pos, len: len, s: istr::to_estr(s)};
+                let a = {pos: pos, len: len, s: @s};
                 abbrevs.insert(t, a);
             }
             ret;
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 13cd2c76e09..649d3a7eb53 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -1232,7 +1232,8 @@ fn make_generic_glue(cx: &@local_ctxt, sp: &span, t: ty::t, llfn: ValueRef,
     let start = time::get_time();
     let llval = make_generic_glue_inner(cx, sp, t, llfn, helper, ty_params);
     let end = time::get_time();
-    log_fn_time(cx.ccx, "glue " + name + " " + ty_to_short_str(cx.ccx.tcx, t),
+    log_fn_time(cx.ccx, "glue " + name + " " +
+                istr::to_estr(ty_to_short_str(cx.ccx.tcx, t)),
                 start, end);
     ret llval;
 }
diff --git a/src/comp/middle/ty.rs b/src/comp/middle/ty.rs
index 1617dea99c0..b6ce008b0c7 100644
--- a/src/comp/middle/ty.rs
+++ b/src/comp/middle/ty.rs
@@ -223,7 +223,7 @@ type ctxt =
       freevars: freevars::freevar_map,
       tcache: type_cache,
       rcache: creader_cache,
-      short_names_cache: hashmap<t, str>,
+      short_names_cache: hashmap<t, @istr>,
       has_pointer_cache: hashmap<t, bool>,
       kind_cache: hashmap<t, ast::kind>,
       owns_heap_mem_cache: hashmap<t, bool>,
diff --git a/src/comp/util/ppaux.rs b/src/comp/util/ppaux.rs
index 610b1a54b62..259482bc9b3 100644
--- a/src/comp/util/ppaux.rs
+++ b/src/comp/util/ppaux.rs
@@ -147,13 +147,13 @@ fn ty_to_str(cx: &ctxt, typ: &t) -> str {
           ty_param(id, _) {
             "'" + str::unsafe_from_bytes([('a' as u8) + (id as u8)])
           }
-          _ { ty_to_short_str(cx, typ) }
+          _ { istr::to_estr(ty_to_short_str(cx, typ)) }
         }
 }
 
-fn ty_to_short_str(cx: &ctxt, typ: t) -> str {
+fn ty_to_short_str(cx: &ctxt, typ: t) -> istr {
     let s = encoder::encoded_ty(cx, typ);
-    if str::byte_len(s) >= 32u { s = str::substr(s, 0u, 32u); }
+    if istr::byte_len(s) >= 32u { s = istr::substr(s, 0u, 32u); }
     ret s;
 }