Skip to content

Commit f3c206c

Browse files
lhtgraydon
authored andcommitted
rustc: Encode crate hash into metadata
1 parent 2ba317d commit f3c206c

File tree

3 files changed

+21
-3
lines changed

3 files changed

+21
-3
lines changed

src/comp/metadata/common.rs

+2
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ const tag_crate_dep: uint = 0x26u;
6464

6565
const tag_items_data_item_inlineness: uint = 0x27u;
6666

67+
const tag_crate_hash: uint = 0x28u;
68+
6769
// djb's cdb hashes.
6870
fn hash_node_id(&&node_id: int) -> uint { ret 177573u ^ (node_id as uint); }
6971

src/comp/metadata/decoder.rs

+11-3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export get_crate_attributes;
1919
export list_crate_metadata;
2020
export crate_dep;
2121
export get_crate_deps;
22+
export get_crate_hash;
2223
export external_resolver;
2324

2425
// 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) {
347348
}
348349
}
349350

350-
fn list_crate_attributes(md: ebml::doc, out: io::writer) {
351-
out.write_str("=Crate Attributes=\n");
351+
fn list_crate_attributes(md: ebml::doc, hash: str, out: io::writer) {
352+
out.write_str(#fmt("=Crate Attributes (%s)=\n", hash));
352353

353354
for attr: ast::attribute in get_attributes(md) {
354355
out.write_str(#fmt["%s\n", pprust::attribute_to_str(attr)]);
@@ -386,6 +387,12 @@ fn list_crate_deps(data: @[u8], out: io::writer) {
386387
out.write_str("\n");
387388
}
388389

390+
fn get_crate_hash(data: @[u8]) -> str {
391+
let cratedoc = ebml::new_doc(data);
392+
let hashdoc = ebml::get_doc(cratedoc, tag_crate_hash);
393+
ret str::unsafe_from_bytes(ebml::doc_data(hashdoc));
394+
}
395+
389396
fn list_crate_items(bytes: @[u8], md: ebml::doc, out: io::writer) {
390397
out.write_str("=Items=\n");
391398
let paths = ebml::get_doc(md, tag_paths);
@@ -407,8 +414,9 @@ fn list_crate_items(bytes: @[u8], md: ebml::doc, out: io::writer) {
407414
}
408415

409416
fn list_crate_metadata(bytes: @[u8], out: io::writer) {
417+
let hash = get_crate_hash(bytes);
410418
let md = ebml::new_doc(bytes);
411-
list_crate_attributes(md, out);
419+
list_crate_attributes(md, hash, out);
412420
list_crate_deps(bytes, out);
413421
list_crate_items(bytes, md, out);
414422
}

src/comp/metadata/encoder.rs

+8
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,12 @@ fn encode_crate_deps(ebml_w: ebml::writer, cstore: cstore::cstore) {
576576
ebml::end_tag(ebml_w);
577577
}
578578

579+
fn encode_hash(ebml_w: ebml::writer, hash: str) {
580+
ebml::start_tag(ebml_w, tag_crate_hash);
581+
ebml_w.writer.write(str::bytes(hash));
582+
ebml::end_tag(ebml_w);
583+
}
584+
579585
fn encode_metadata(cx: @crate_ctxt, crate: @crate) -> str {
580586

581587
let abbrevs = map::mk_hashmap(ty::hash_ty, ty::eq_ty);
@@ -585,6 +591,8 @@ fn encode_metadata(cx: @crate_ctxt, crate: @crate) -> str {
585591
let buf_w = string_w.get_writer().get_buf_writer();
586592
let ebml_w = ebml::create_writer(buf_w);
587593

594+
encode_hash(ebml_w, cx.link_meta.extras_hash);
595+
588596
let crate_attrs = synthesize_crate_attrs(ecx, crate);
589597
encode_attributes(ebml_w, crate_attrs);
590598

0 commit comments

Comments
 (0)