From 986937425636c3174dfe11bb6309865e8a1e0350 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Fri, 31 Jan 2014 12:17:03 -0800 Subject: [PATCH] librustc: Remove a bunch of `@str` from the compiler around metadata handling --- src/librustc/back/link.rs | 8 +-- src/librustc/back/lto.rs | 2 +- src/librustc/metadata/common.rs | 2 +- src/librustc/metadata/creader.rs | 75 +++++++++++++++----------- src/librustc/metadata/cstore.rs | 26 +++++---- src/librustc/metadata/decoder.rs | 18 +++---- src/librustc/metadata/encoder.rs | 2 +- src/librustc/metadata/loader.rs | 27 +++++----- src/librustc/middle/trans/expr.rs | 4 +- src/librustc/middle/trans/intrinsic.rs | 6 ++- src/librustc/middle/ty.rs | 4 +- 11 files changed, 101 insertions(+), 73 deletions(-) diff --git a/src/librustc/back/link.rs b/src/librustc/back/link.rs index a81302035ee1..669c3248a1fd 100644 --- a/src/librustc/back/link.rs +++ b/src/librustc/back/link.rs @@ -473,10 +473,10 @@ pub fn build_link_meta(sess: Session, symbol_hasher: &mut Sha256) -> LinkMeta { // This calculates CMH as defined above - fn crate_hash(symbol_hasher: &mut Sha256, crateid: &CrateId) -> @str { + fn crate_hash(symbol_hasher: &mut Sha256, crateid: &CrateId) -> ~str { symbol_hasher.reset(); symbol_hasher.input_str(crateid.to_str()); - truncated_hash_result(symbol_hasher).to_managed() + truncated_hash_result(symbol_hasher) } let crateid = match attr::find_crateid(attrs) { @@ -963,7 +963,7 @@ fn link_staticlib(sess: Session, obj_filename: &Path, out_filename: &Path) { let crates = sess.cstore.get_used_crates(cstore::RequireStatic); for &(cnum, ref path) in crates.iter() { - let name = sess.cstore.get_crate_data(cnum).name; + let name = sess.cstore.get_crate_data(cnum).name.clone(); let p = match *path { Some(ref p) => p.clone(), None => { sess.err(format!("could not find rlib for: `{}`", name)); @@ -1221,7 +1221,7 @@ fn add_upstream_rust_crates(args: &mut ~[~str], sess: Session, // If we're not doing LTO, then our job is simply to just link // against the archive. if sess.lto() { - let name = sess.cstore.get_crate_data(cnum).name; + let name = sess.cstore.get_crate_data(cnum).name.clone(); time(sess.time_passes(), format!("altering {}.rlib", name), (), |()| { let dst = tmpdir.join(cratepath.filename().unwrap()); diff --git a/src/librustc/back/lto.rs b/src/librustc/back/lto.rs index ced8fa68f59c..3fbcd377b8b1 100644 --- a/src/librustc/back/lto.rs +++ b/src/librustc/back/lto.rs @@ -42,7 +42,7 @@ pub fn run(sess: session::Session, llmod: ModuleRef, // module that we've got. let crates = sess.cstore.get_used_crates(cstore::RequireStatic); for (cnum, path) in crates.move_iter() { - let name = sess.cstore.get_crate_data(cnum).name; + let name = sess.cstore.get_crate_data(cnum).name.clone(); let path = match path { Some(p) => p, None => { diff --git a/src/librustc/metadata/common.rs b/src/librustc/metadata/common.rs index e8cfa97c0e1c..e9732f5c9960 100644 --- a/src/librustc/metadata/common.rs +++ b/src/librustc/metadata/common.rs @@ -210,5 +210,5 @@ pub static tag_macro_def: uint = 0x112; #[deriving(Clone)] pub struct LinkMeta { crateid: CrateId, - crate_hash: @str, + crate_hash: ~str, } diff --git a/src/librustc/metadata/creader.rs b/src/librustc/metadata/creader.rs index 2a30ca51584e..9c2c5a574584 100644 --- a/src/librustc/metadata/creader.rs +++ b/src/librustc/metadata/creader.rs @@ -76,7 +76,7 @@ impl<'a> visit::Visitor<()> for ReadCrateVisitor<'a> { struct cache_entry { cnum: ast::CrateNum, span: Span, - hash: @str, + hash: ~str, crateid: CrateId, } @@ -146,8 +146,12 @@ fn visit_view_item(e: &mut Env, i: &ast::ViewItem) { match extract_crate_info(i) { Some(info) => { - let cnum = resolve_crate(e, info.ident, info.name, info.version, - @"", i.span); + let cnum = resolve_crate(e, + info.ident.clone(), + info.name.clone(), + info.version.clone(), + ~"", + i.span); e.sess.cstore.add_extern_mod_stmt_cnum(info.id, cnum); } None => () @@ -155,36 +159,36 @@ fn visit_view_item(e: &mut Env, i: &ast::ViewItem) { } struct CrateInfo { - ident: @str, - name: @str, - version: @str, + ident: ~str, + name: ~str, + version: ~str, id: ast::NodeId, } fn extract_crate_info(i: &ast::ViewItem) -> Option { match i.node { ast::ViewItemExternMod(ref ident, ref path_opt, id) => { - let ident = token::ident_to_str(ident); + let ident = token::get_ident(ident.name); debug!("resolving extern mod stmt. ident: {:?} path_opt: {:?}", - ident, path_opt); + ident.get(), path_opt); let (name, version) = match *path_opt { Some((ref path_str, _)) => { let crateid: Option = from_str(path_str.get()); match crateid { - None => (@"", @""), + None => (~"", ~""), Some(crateid) => { let version = match crateid.version { - None => @"", - Some(ref ver) => ver.to_managed(), + None => ~"", + Some(ref ver) => ver.to_str(), }; - (crateid.name.to_managed(), version) + (crateid.name.to_str(), version) } } } - None => (ident, @""), + None => (ident.get().to_str(), ~""), }; Some(CrateInfo { - ident: ident, + ident: ident.get().to_str(), name: name, version: version, id: id, @@ -278,14 +282,14 @@ fn visit_item(e: &Env, i: &ast::Item) { } } -fn existing_match(e: &Env, name: @str, version: @str, hash: &str) -> Option { +fn existing_match(e: &Env, name: ~str, version: ~str, hash: &str) -> Option { let crate_cache = e.crate_cache.borrow(); for c in crate_cache.get().iter() { let crateid_version = match c.crateid.version { - None => @"0.0", - Some(ref ver) => ver.to_managed(), + None => ~"0.0", + Some(ref ver) => ver.to_str(), }; - if (name.is_empty() || c.crateid.name.to_managed() == name) && + if (name.is_empty() || c.crateid.name == name) && (version.is_empty() || crateid_version == version) && (hash.is_empty() || c.hash.as_slice() == hash) { return Some(c.cnum); @@ -295,19 +299,19 @@ fn existing_match(e: &Env, name: @str, version: @str, hash: &str) -> Option ast::CrateNum { - match existing_match(e, name, version, hash) { + match existing_match(e, name.clone(), version.clone(), hash.clone()) { None => { let load_ctxt = loader::Context { sess: e.sess, span: span, ident: ident, - name: name, + name: name.clone(), version: version, hash: hash, os: e.os, @@ -368,10 +372,13 @@ fn resolve_crate_deps(e: &mut Env, cdata: &[u8]) -> cstore::cnum_map { let r = decoder::get_crate_deps(cdata); for dep in r.iter() { let extrn_cnum = dep.cnum; - let cname_str = token::ident_to_str(&dep.name); + let cname_str = token::get_ident(dep.name.name); debug!("resolving dep crate {} ver: {} hash: {}", cname_str, dep.vers, dep.hash); - match existing_match(e, cname_str, dep.vers, dep.hash) { + match existing_match(e, + cname_str.get().to_str(), + dep.vers.clone(), + dep.hash.clone()) { Some(local_cnum) => { debug!("already have it"); // We've already seen this crate @@ -383,8 +390,12 @@ fn resolve_crate_deps(e: &mut Env, cdata: &[u8]) -> cstore::cnum_map { // FIXME (#2404): Need better error reporting than just a bogus // span. let fake_span = DUMMY_SP; - let local_cnum = resolve_crate(e, cname_str, cname_str, dep.vers, - dep.hash, fake_span); + let local_cnum = resolve_crate(e, + cname_str.get().to_str(), + cname_str.get().to_str(), + dep.vers.clone(), + dep.hash.clone(), + fake_span); cnum_map.insert(extrn_cnum, local_cnum); } } @@ -415,8 +426,12 @@ impl Loader { impl CrateLoader for Loader { fn load_crate(&mut self, crate: &ast::ViewItem) -> MacroCrate { let info = extract_crate_info(crate).unwrap(); - let cnum = resolve_crate(&mut self.env, info.ident, info.name, - info.version, @"", crate.span); + let cnum = resolve_crate(&mut self.env, + info.ident.clone(), + info.name.clone(), + info.version.clone(), + ~"", + crate.span); let library = self.env.sess.cstore.get_used_crate_source(cnum).unwrap(); MacroCrate { lib: library.dylib, diff --git a/src/librustc/metadata/cstore.rs b/src/librustc/metadata/cstore.rs index 024e214a2fe7..45eccc94ed80 100644 --- a/src/librustc/metadata/cstore.rs +++ b/src/librustc/metadata/cstore.rs @@ -32,7 +32,7 @@ pub enum MetadataBlob { } pub struct crate_metadata { - name: @str, + name: ~str, data: MetadataBlob, cnum_map: cnum_map, cnum: ast::CrateNum @@ -89,12 +89,12 @@ impl CStore { *metas.get().get(&cnum) } - pub fn get_crate_hash(&self, cnum: ast::CrateNum) -> @str { + pub fn get_crate_hash(&self, cnum: ast::CrateNum) -> ~str { let cdata = self.get_crate_data(cnum); decoder::get_crate_hash(cdata.data()) } - pub fn get_crate_vers(&self, cnum: ast::CrateNum) -> @str { + pub fn get_crate_vers(&self, cnum: ast::CrateNum) -> ~str { let cdata = self.get_crate_data(cnum); decoder::get_crate_vers(cdata.data()) } @@ -192,7 +192,7 @@ impl CStore { // returns hashes of crates directly used by this crate. Hashes are sorted by // (crate name, crate version, crate hash) in lexicographic order (not semver) - pub fn get_dep_hashes(&self) -> ~[@str] { + pub fn get_dep_hashes(&self) -> ~[~str] { let mut result = ~[]; let extern_mod_crate_map = self.extern_mod_crate_map.borrow(); @@ -202,7 +202,7 @@ impl CStore { let vers = decoder::get_crate_vers(cdata.data()); debug!("Add hash[{}]: {} {}", cdata.name, vers, hash); result.push(crate_hash { - name: cdata.name, + name: cdata.name.clone(), vers: vers, hash: hash }); @@ -215,15 +215,23 @@ impl CStore { debug!(" hash[{}]: {}", x.name, x.hash); } - result.map(|ch| ch.hash) + let mut hashes = ~[]; + for ch in result.move_iter() { + let crate_hash { + hash, + .. + } = ch; + hashes.push(hash) + } + hashes } } #[deriving(Clone, TotalEq, TotalOrd)] struct crate_hash { - name: @str, - vers: @str, - hash: @str, + name: ~str, + vers: ~str, + hash: ~str, } impl crate_metadata { diff --git a/src/librustc/metadata/decoder.rs b/src/librustc/metadata/decoder.rs index 65eb273b9b88..edaa2208a1ff 100644 --- a/src/librustc/metadata/decoder.rs +++ b/src/librustc/metadata/decoder.rs @@ -1113,8 +1113,8 @@ pub fn get_crate_attributes(data: &[u8]) -> ~[ast::Attribute] { pub struct CrateDep { cnum: ast::CrateNum, name: ast::Ident, - vers: @str, - hash: @str + vers: ~str, + hash: ~str } pub fn get_crate_deps(data: &[u8]) -> ~[CrateDep] { @@ -1122,9 +1122,9 @@ pub fn get_crate_deps(data: &[u8]) -> ~[CrateDep] { let cratedoc = reader::Doc(data); let depsdoc = reader::get_doc(cratedoc, tag_crate_deps); let mut crate_num = 1; - fn docstr(doc: ebml::Doc, tag_: uint) -> @str { + fn docstr(doc: ebml::Doc, tag_: uint) -> ~str { let d = reader::get_doc(doc, tag_); - d.as_str_slice().to_managed() + d.as_str_slice().to_str() } reader::tagged_docs(depsdoc, tag_crate_dep, |depdoc| { deps.push(CrateDep {cnum: crate_num, @@ -1149,17 +1149,17 @@ fn list_crate_deps(data: &[u8], out: &mut io::Writer) { write!(out, "\n"); } -pub fn get_crate_hash(data: &[u8]) -> @str { +pub fn get_crate_hash(data: &[u8]) -> ~str { let cratedoc = reader::Doc(data); let hashdoc = reader::get_doc(cratedoc, tag_crate_hash); - hashdoc.as_str_slice().to_managed() + hashdoc.as_str_slice().to_str() } -pub fn get_crate_vers(data: &[u8]) -> @str { +pub fn get_crate_vers(data: &[u8]) -> ~str { let attrs = decoder::get_crate_attributes(data); match attr::find_crateid(attrs) { - None => @"0.0", - Some(crateid) => crateid.version_or_default().to_managed(), + None => ~"0.0", + Some(crateid) => crateid.version_or_default().to_str(), } } diff --git a/src/librustc/metadata/encoder.rs b/src/librustc/metadata/encoder.rs index d58187641dbd..8e0f4dc9cd8a 100644 --- a/src/librustc/metadata/encoder.rs +++ b/src/librustc/metadata/encoder.rs @@ -1614,7 +1614,7 @@ fn encode_crate_deps(ecx: &EncodeContext, ebml_w.start_tag(tag_crate_deps); let r = get_ordered_deps(ecx, cstore); for dep in r.iter() { - encode_crate_dep(ecx, ebml_w, *dep); + encode_crate_dep(ecx, ebml_w, (*dep).clone()); } ebml_w.end_tag(); } diff --git a/src/librustc/metadata/loader.rs b/src/librustc/metadata/loader.rs index 046184bef58b..8e557560b95f 100644 --- a/src/librustc/metadata/loader.rs +++ b/src/librustc/metadata/loader.rs @@ -46,10 +46,10 @@ pub enum Os { pub struct Context { sess: Session, span: Span, - ident: @str, - name: @str, - version: @str, - hash: @str, + ident: ~str, + name: ~str, + version: ~str, + hash: ~str, os: Os, intr: @IdentInterner } @@ -80,7 +80,7 @@ impl Context { fn find_library_crate(&self) -> Option { let filesearch = self.sess.filesearch; - let crate_name = self.name; + let crate_name = self.name.clone(); let (dyprefix, dysuffix) = self.dylibname(); // want: crate_name.dir_part() + prefix + crate_name.file_part + "-" @@ -109,8 +109,10 @@ impl Context { } else if candidate { match get_metadata_section(self.os, path) { Some(cvec) => - if crate_matches(cvec.as_slice(), self.name, - self.version, self.hash) { + if crate_matches(cvec.as_slice(), + self.name.clone(), + self.version.clone(), + self.hash.clone()) { debug!("found {} with matching crate_id", path.display()); let (rlib, dylib) = if file.ends_with(".rlib") { @@ -235,9 +237,9 @@ pub fn note_crateid_attr(diag: @SpanHandler, crateid: &CrateId) { } fn crate_matches(crate_data: &[u8], - name: @str, - version: @str, - hash: @str) -> bool { + name: ~str, + version: ~str, + hash: ~str) -> bool { let attrs = decoder::get_crate_attributes(crate_data); match attr::find_crateid(attrs) { None => false, @@ -246,8 +248,9 @@ fn crate_matches(crate_data: &[u8], let chash = decoder::get_crate_hash(crate_data); if chash != hash { return false; } } - name == crateid.name.to_managed() && - (version.is_empty() || version == crateid.version_or_default().to_managed()) + name == crateid.name && + (version.is_empty() || + crateid.version_or_default() == version) } } } diff --git a/src/librustc/middle/trans/expr.rs b/src/librustc/middle/trans/expr.rs index b5c7284dca52..bbe5bdc967bb 100644 --- a/src/librustc/middle/trans/expr.rs +++ b/src/librustc/middle/trans/expr.rs @@ -1797,9 +1797,9 @@ fn trans_log_level<'a>(bcx: &'a Block<'a>) let external_srcs = ccx.external_srcs.borrow(); srccrate = match external_srcs.get().find(&bcx.fcx.id) { Some(&src) => { - ccx.sess.cstore.get_crate_data(src.crate).name + ccx.sess.cstore.get_crate_data(src.crate).name.clone() } - None => ccx.link_meta.crateid.name.to_managed(), + None => ccx.link_meta.crateid.name.to_str(), }; }; let mut modpath = ~[PathMod(ccx.sess.ident_of(srccrate))]; diff --git a/src/librustc/middle/trans/intrinsic.rs b/src/librustc/middle/trans/intrinsic.rs index da3b9202d921..49f1b073f873 100644 --- a/src/librustc/middle/trans/intrinsic.rs +++ b/src/librustc/middle/trans/intrinsic.rs @@ -337,8 +337,10 @@ pub fn trans_intrinsic(ccx: @CrateContext, Ret(bcx, td); } "type_id" => { - let hash = ty::hash_crate_independent(ccx.tcx, substs.tys[0], - ccx.link_meta.crate_hash); + let hash = ty::hash_crate_independent( + ccx.tcx, + substs.tys[0], + ccx.link_meta.crate_hash.clone()); // NB: This needs to be kept in lockstep with the TypeId struct in // libstd/unstable/intrinsics.rs let val = C_named_struct(type_of::type_of(ccx, output_type), [C_u64(hash)]); diff --git a/src/librustc/middle/ty.rs b/src/librustc/middle/ty.rs index ba9dea28cbc9..681eabb797dc 100644 --- a/src/librustc/middle/ty.rs +++ b/src/librustc/middle/ty.rs @@ -4834,7 +4834,7 @@ pub fn trait_method_of_method(tcx: ctxt, /// Creates a hash of the type `t` which will be the same no matter what crate /// context it's calculated within. This is used by the `type_id` intrinsic. -pub fn hash_crate_independent(tcx: ctxt, t: t, local_hash: @str) -> u64 { +pub fn hash_crate_independent(tcx: ctxt, t: t, local_hash: ~str) -> u64 { use std::hash::{SipState, Streaming}; let mut hash = SipState::new(0, 0); @@ -4865,7 +4865,7 @@ pub fn hash_crate_independent(tcx: ctxt, t: t, local_hash: @str) -> u64 { }; let did = |hash: &mut SipState, did: DefId| { let h = if ast_util::is_local(did) { - local_hash + local_hash.clone() } else { tcx.sess.cstore.get_crate_hash(did.crate) };