Skip to content

Commit 5aa5220

Browse files
committed
Encode crate dependencies' hash and version data
1 parent 5300662 commit 5aa5220

File tree

4 files changed

+57
-26
lines changed

4 files changed

+57
-26
lines changed

src/rustc/metadata/common.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ const tag_crate_hash: uint = 0x28u;
6464

6565
const tag_parent_item: uint = 0x29u;
6666

67+
const tag_crate_dep_name: uint = 0x2au;
68+
const tag_crate_dep_hash: uint = 0x2bu;
69+
const tag_crate_dep_vers: uint = 0x2cu;
70+
6771
const tag_mod_impl: uint = 0x30u;
6872

6973
const tag_item_method: uint = 0x31u;

src/rustc/metadata/cstore.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,7 @@ fn get_crate_hash(cstore: cstore, cnum: ast::crate_num) -> str {
8888

8989
fn get_crate_vers(cstore: cstore, cnum: ast::crate_num) -> str {
9090
let cdata = get_crate_data(cstore, cnum);
91-
let attrs = decoder::get_crate_attributes(cdata.data);
92-
ret option::get(attr::meta_item_value_from_list(
93-
attr::find_linkage_metas(attrs), "vers"));
91+
ret decoder::get_crate_vers(cdata.data);
9492
}
9593

9694
fn set_crate_data(cstore: cstore, cnum: ast::crate_num,

src/rustc/metadata/decoder.rs

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export list_crate_metadata;
3333
export crate_dep;
3434
export get_crate_deps;
3535
export get_crate_hash;
36+
export get_crate_vers;
3637
export get_impls_for_mod;
3738
export get_iface_methods;
3839
export get_crate_module_paths;
@@ -579,16 +580,22 @@ fn get_crate_attributes(data: @[u8]) -> [ast::attribute] {
579580
ret get_attributes(ebml::doc(data));
580581
}
581582

582-
type crate_dep = {cnum: ast::crate_num, ident: str};
583+
type crate_dep = {cnum: ast::crate_num, name: ast::ident,
584+
vers: str, hash: str};
583585

584586
fn get_crate_deps(data: @[u8]) -> [crate_dep] {
585587
let mut deps: [crate_dep] = [];
586588
let cratedoc = ebml::doc(data);
587589
let depsdoc = ebml::get_doc(cratedoc, tag_crate_deps);
588590
let mut crate_num = 1;
591+
fn docstr(doc: ebml::doc, tag_: uint) -> str {
592+
str::from_bytes(ebml::doc_data(ebml::get_doc(doc, tag_)))
593+
}
589594
ebml::tagged_docs(depsdoc, tag_crate_dep) {|depdoc|
590-
let depname = str::from_bytes(ebml::doc_data(depdoc));
591-
deps += [{cnum: crate_num, ident: depname}];
595+
deps += [{cnum: crate_num,
596+
name: docstr(depdoc, tag_crate_dep_name),
597+
vers: docstr(depdoc, tag_crate_dep_vers),
598+
hash: docstr(depdoc, tag_crate_dep_hash)}];
592599
crate_num += 1;
593600
};
594601
ret deps;
@@ -598,7 +605,8 @@ fn list_crate_deps(data: @[u8], out: io::writer) {
598605
out.write_str("=External Dependencies=\n");
599606

600607
for get_crate_deps(data).each {|dep|
601-
out.write_str(#fmt["%d %s\n", dep.cnum, dep.ident]);
608+
out.write_str(#fmt["%d %s-%s-%s\n",
609+
dep.cnum, dep.name, dep.hash, dep.vers]);
602610
}
603611

604612
out.write_str("\n");
@@ -610,6 +618,15 @@ fn get_crate_hash(data: @[u8]) -> str {
610618
ret str::from_bytes(ebml::doc_data(hashdoc));
611619
}
612620

621+
fn get_crate_vers(data: @[u8]) -> str {
622+
let attrs = decoder::get_crate_attributes(data);
623+
ret alt attr::meta_item_value_from_list(
624+
attr::find_linkage_metas(attrs), "vers") {
625+
some(ver) { ver }
626+
none { "0.0" }
627+
};
628+
}
629+
613630
fn list_crate_items(bytes: @[u8], md: ebml::doc, out: io::writer) {
614631
out.write_str("=Items=\n");
615632
let items = ebml::get_doc(md, tag_items);

src/rustc/metadata/encoder.rs

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -907,47 +907,59 @@ fn synthesize_crate_attrs(ecx: @encode_ctxt, crate: @crate) -> [attribute] {
907907

908908
fn encode_crate_deps(ebml_w: ebml::writer, cstore: cstore::cstore) {
909909

910-
fn get_ordered_names(cstore: cstore::cstore) -> [str] {
910+
fn get_ordered_deps(cstore: cstore::cstore) -> [decoder::crate_dep] {
911911
type hashkv = @{key: crate_num, val: cstore::crate_metadata};
912-
type numname = {crate: crate_num, ident: str};
912+
type numdep = decoder::crate_dep;
913913

914-
// Pull the cnums and names out of cstore
915-
let mut pairs: [mut numname] = [mut];
914+
// Pull the cnums and name,vers,hash out of cstore
915+
let mut deps: [mut numdep] = [mut];
916916
cstore::iter_crate_data(cstore) {|key, val|
917-
pairs += [mut {crate: key, ident: val.name}];
917+
let dep = {cnum: key, name: val.name,
918+
vers: decoder::get_crate_vers(val.data),
919+
hash: decoder::get_crate_hash(val.data)};
920+
deps += [mut dep];
918921
};
919922

920923
// Sort by cnum
921-
fn lteq(kv1: numname, kv2: numname) -> bool { kv1.crate <= kv2.crate }
922-
std::sort::quick_sort(lteq, pairs);
924+
fn lteq(kv1: numdep, kv2: numdep) -> bool { kv1.cnum <= kv2.cnum }
925+
std::sort::quick_sort(lteq, deps);
923926

924927
// Sanity-check the crate numbers
925928
let mut expected_cnum = 1;
926-
for pairs.each {|n|
927-
assert (n.crate == expected_cnum);
929+
for deps.each {|n|
930+
assert (n.cnum == expected_cnum);
928931
expected_cnum += 1;
929932
}
930933

931-
// Return just the names
932-
fn name(kv: numname) -> str { kv.ident }
933934
// mut -> immutable hack for vec::map
934-
let immpairs = vec::slice(pairs, 0u, vec::len(pairs));
935-
ret vec::map(immpairs, name);
935+
ret vec::slice(deps, 0u, vec::len(deps));
936936
}
937937

938-
// We're just going to write a list of crate names, with the assumption
939-
// that they are numbered 1 to n.
938+
// We're just going to write a list of crate 'name-hash-version's, with
939+
// the assumption that they are numbered 1 to n.
940940
// FIXME: This is not nearly enough to support correct versioning
941941
// but is enough to get transitive crate dependencies working.
942942
ebml_w.start_tag(tag_crate_deps);
943-
for get_ordered_names(cstore).each {|cname|
944-
ebml_w.start_tag(tag_crate_dep);
945-
ebml_w.writer.write(str::bytes(cname));
946-
ebml_w.end_tag();
943+
for get_ordered_deps(cstore).each {|dep|
944+
encode_crate_dep(ebml_w, dep);
947945
}
948946
ebml_w.end_tag();
949947
}
950948

949+
fn encode_crate_dep(ebml_w: ebml::writer, dep: decoder::crate_dep) {
950+
ebml_w.start_tag(tag_crate_dep);
951+
ebml_w.start_tag(tag_crate_dep_name);
952+
ebml_w.writer.write(str::bytes(dep.name));
953+
ebml_w.end_tag();
954+
ebml_w.start_tag(tag_crate_dep_vers);
955+
ebml_w.writer.write(str::bytes(dep.vers));
956+
ebml_w.end_tag();
957+
ebml_w.start_tag(tag_crate_dep_hash);
958+
ebml_w.writer.write(str::bytes(dep.hash));
959+
ebml_w.end_tag();
960+
ebml_w.end_tag();
961+
}
962+
951963
fn encode_hash(ebml_w: ebml::writer, hash: str) {
952964
ebml_w.start_tag(tag_crate_hash);
953965
ebml_w.writer.write(str::bytes(hash));

0 commit comments

Comments
 (0)