]> git.lizzy.rs Git - rust.git/commitdiff
rustc: Encode crate hash into metadata
authorHaitao Li <lihaitao@gmail.com>
Sun, 11 Dec 2011 15:23:38 +0000 (23:23 +0800)
committerGraydon Hoare <graydon@mozilla.com>
Tue, 13 Dec 2011 00:15:29 +0000 (16:15 -0800)
src/comp/metadata/common.rs
src/comp/metadata/decoder.rs
src/comp/metadata/encoder.rs

index fdb2d72da6f3f9015c040d5bc395305828c18084..8002fddf3c9a9cfb67317de054498b50f8de2163 100644 (file)
@@ -64,6 +64,8 @@
 
 const tag_items_data_item_inlineness: uint = 0x27u;
 
+const tag_crate_hash: uint = 0x28u;
+
 // djb's cdb hashes.
 fn hash_node_id(&&node_id: int) -> uint { ret 177573u ^ (node_id as uint); }
 
index b5c32efe66f1ff41146772fce688ca2c838e1495..541b7c3263523a33f8b868da1564a6b0ae15b7a6 100644 (file)
@@ -19,6 +19,7 @@
 export list_crate_metadata;
 export crate_dep;
 export get_crate_deps;
+export get_crate_hash;
 export external_resolver;
 
 // A function that takes a def_id relative to the crate being searched and
@@ -347,8 +348,8 @@ fn list_meta_items(meta_items: ebml::doc, out: io::writer) {
     }
 }
 
-fn list_crate_attributes(md: ebml::doc, out: io::writer) {
-    out.write_str("=Crate Attributes=\n");
+fn list_crate_attributes(md: ebml::doc, hash: str, out: io::writer) {
+    out.write_str(#fmt("=Crate Attributes (%s)=\n", hash));
 
     for attr: ast::attribute in get_attributes(md) {
         out.write_str(#fmt["%s\n", pprust::attribute_to_str(attr)]);
@@ -386,6 +387,12 @@ fn list_crate_deps(data: @[u8], out: io::writer) {
     out.write_str("\n");
 }
 
+fn get_crate_hash(data: @[u8]) -> str {
+    let cratedoc = ebml::new_doc(data);
+    let hashdoc = ebml::get_doc(cratedoc, tag_crate_hash);
+    ret str::unsafe_from_bytes(ebml::doc_data(hashdoc));
+}
+
 fn list_crate_items(bytes: @[u8], md: ebml::doc, out: io::writer) {
     out.write_str("=Items=\n");
     let paths = ebml::get_doc(md, tag_paths);
@@ -407,8 +414,9 @@ fn list_crate_items(bytes: @[u8], md: ebml::doc, out: io::writer) {
 }
 
 fn list_crate_metadata(bytes: @[u8], out: io::writer) {
+    let hash = get_crate_hash(bytes);
     let md = ebml::new_doc(bytes);
-    list_crate_attributes(md, out);
+    list_crate_attributes(md, hash, out);
     list_crate_deps(bytes, out);
     list_crate_items(bytes, md, out);
 }
index 8eb0ea64e49b0836d43c4574303d2f4c82e3d01d..646c016d97d7eda5bae9e8bc651b5cfb8811be44 100644 (file)
@@ -576,6 +576,12 @@ fn name(kv: numname) -> str { kv.ident }
     ebml::end_tag(ebml_w);
 }
 
+fn encode_hash(ebml_w: ebml::writer, hash: str) {
+    ebml::start_tag(ebml_w, tag_crate_hash);
+    ebml_w.writer.write(str::bytes(hash));
+    ebml::end_tag(ebml_w);
+}
+
 fn encode_metadata(cx: @crate_ctxt, crate: @crate) -> str {
 
     let abbrevs = map::mk_hashmap(ty::hash_ty, ty::eq_ty);
@@ -585,6 +591,8 @@ fn encode_metadata(cx: @crate_ctxt, crate: @crate) -> str {
     let buf_w = string_w.get_writer().get_buf_writer();
     let ebml_w = ebml::create_writer(buf_w);
 
+    encode_hash(ebml_w, cx.link_meta.extras_hash);
+
     let crate_attrs = synthesize_crate_attrs(ecx, crate);
     encode_attributes(ebml_w, crate_attrs);