Skip to content

Commit 8bcb3cb

Browse files
committed
rustc::metadata: use u64 for DefId's instead of strings.
1 parent 7129b25 commit 8bcb3cb

File tree

2 files changed

+71
-85
lines changed

2 files changed

+71
-85
lines changed

src/librustc/metadata/decoder.rs

Lines changed: 40 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ use metadata::common::*;
2121
use metadata::csearch::MethodInfo;
2222
use metadata::csearch;
2323
use metadata::cstore;
24-
use metadata::tydecode::{parse_ty_data, parse_region_data, parse_def_id,
24+
use metadata::encoder::def_to_u64;
25+
use metadata::tydecode::{parse_ty_data, parse_region_data,
2526
parse_type_param_def_data, parse_bare_fn_ty_data,
2627
parse_trait_ref_data, parse_predicate_data};
2728
use middle::def;
@@ -190,29 +191,32 @@ fn item_symbol(item: rbml::Doc) -> String {
190191
reader::get_doc(item, tag_items_data_item_symbol).as_str().to_string()
191192
}
192193

193-
fn item_parent_item(d: rbml::Doc) -> Option<ast::DefId> {
194+
fn translated_def_id(cdata: Cmd, d: rbml::Doc) -> ast::DefId {
195+
let id = reader::doc_as_u64(d);
196+
let def_id = ast::DefId { krate: (id >> 32) as u32, node: id as u32 };
197+
translate_def_id(cdata, def_id)
198+
}
199+
200+
fn item_parent_item(cdata: Cmd, d: rbml::Doc) -> Option<ast::DefId> {
194201
let mut ret = None;
195202
reader::tagged_docs(d, tag_items_data_parent_item, |did| {
196-
ret = Some(reader::with_doc_data(did, parse_def_id));
203+
ret = Some(translated_def_id(cdata, did));
197204
false
198205
});
199206
ret
200207
}
201208

202-
fn item_reqd_and_translated_parent_item(cnum: ast::CrateNum,
203-
d: rbml::Doc) -> ast::DefId {
204-
let trait_did = item_parent_item(d).expect("item without parent");
205-
ast::DefId { krate: cnum, node: trait_did.node }
209+
fn item_require_parent_item(cdata: Cmd, d: rbml::Doc) -> ast::DefId {
210+
translated_def_id(cdata, reader::get_doc(d, tag_items_data_parent_item))
206211
}
207212

208213
fn item_def_id(d: rbml::Doc, cdata: Cmd) -> ast::DefId {
209-
let tagdoc = reader::get_doc(d, tag_def_id);
210-
return translate_def_id(cdata, reader::with_doc_data(tagdoc, parse_def_id));
214+
translated_def_id(cdata, reader::get_doc(d, tag_def_id))
211215
}
212216

213217
fn get_provided_source(d: rbml::Doc, cdata: Cmd) -> Option<ast::DefId> {
214218
reader::maybe_get_doc(d, tag_item_method_provided_source).map(|doc| {
215-
translate_def_id(cdata, reader::with_doc_data(doc, parse_def_id))
219+
translated_def_id(cdata, doc)
216220
})
217221
}
218222

@@ -261,14 +265,12 @@ fn item_trait_ref<'tcx>(doc: rbml::Doc, tcx: &ty::ctxt<'tcx>, cdata: Cmd)
261265
}
262266

263267
fn enum_variant_ids(item: rbml::Doc, cdata: Cmd) -> Vec<ast::DefId> {
264-
let mut ids: Vec<ast::DefId> = Vec::new();
265-
let v = tag_items_data_item_variant;
266-
reader::tagged_docs(item, v, |p| {
267-
let ext = reader::with_doc_data(p, parse_def_id);
268-
ids.push(ast::DefId { krate: cdata.cnum, node: ext.node });
268+
let mut ids = vec![];
269+
reader::tagged_docs(item, tag_items_data_item_variant, |p| {
270+
ids.push(translated_def_id(cdata, p));
269271
true
270272
});
271-
return ids;
273+
ids
272274
}
273275

274276
fn item_path(item_doc: rbml::Doc) -> Vec<ast_map::PathElem> {
@@ -303,8 +305,7 @@ fn item_name(intr: &IdentInterner, item: rbml::Doc) -> ast::Name {
303305
}
304306
}
305307

306-
fn item_to_def_like(item: rbml::Doc, did: ast::DefId, cnum: ast::CrateNum)
307-
-> DefLike {
308+
fn item_to_def_like(cdata: Cmd, item: rbml::Doc, did: ast::DefId) -> DefLike {
308309
let fam = item_family(item);
309310
match fam {
310311
Constant => {
@@ -314,11 +315,9 @@ fn item_to_def_like(item: rbml::Doc, did: ast::DefId, cnum: ast::CrateNum)
314315
// See the comment for methods below.
315316
let provenance = if reader::maybe_get_doc(
316317
item, tag_item_trait_parent_sort).is_some() {
317-
def::FromTrait(item_reqd_and_translated_parent_item(cnum,
318-
item))
318+
def::FromTrait(item_require_parent_item(cdata, item))
319319
} else {
320-
def::FromImpl(item_reqd_and_translated_parent_item(cnum,
321-
item))
320+
def::FromImpl(item_require_parent_item(cdata, item))
322321
};
323322
DlDef(def::DefAssociatedConst(did, provenance))
324323
} else {
@@ -339,17 +338,15 @@ fn item_to_def_like(item: rbml::Doc, did: ast::DefId, cnum: ast::CrateNum)
339338
// a trait_parent_sort.
340339
let provenance = if reader::maybe_get_doc(
341340
item, tag_item_trait_parent_sort).is_some() {
342-
def::FromTrait(item_reqd_and_translated_parent_item(cnum,
343-
item))
341+
def::FromTrait(item_require_parent_item(cdata, item))
344342
} else {
345-
def::FromImpl(item_reqd_and_translated_parent_item(cnum,
346-
item))
343+
def::FromImpl(item_require_parent_item(cdata, item))
347344
};
348345
DlDef(def::DefMethod(did, provenance))
349346
}
350347
Type => {
351348
if item_sort(item) == Some('t') {
352-
let trait_did = item_reqd_and_translated_parent_item(cnum, item);
349+
let trait_did = item_require_parent_item(cdata, item);
353350
DlDef(def::DefAssociatedTy(trait_did, did))
354351
} else {
355352
DlDef(def::DefTy(did, false))
@@ -358,11 +355,11 @@ fn item_to_def_like(item: rbml::Doc, did: ast::DefId, cnum: ast::CrateNum)
358355
Mod => DlDef(def::DefMod(did)),
359356
ForeignMod => DlDef(def::DefForeignMod(did)),
360357
StructVariant => {
361-
let enum_did = item_reqd_and_translated_parent_item(cnum, item);
358+
let enum_did = item_require_parent_item(cdata, item);
362359
DlDef(def::DefVariant(enum_did, did, true))
363360
}
364361
TupleVariant => {
365-
let enum_did = item_reqd_and_translated_parent_item(cnum, item);
362+
let enum_did = item_require_parent_item(cdata, item);
366363
DlDef(def::DefVariant(enum_did, did, false))
367364
}
368365
Trait => DlDef(def::DefTrait(did)),
@@ -560,9 +557,7 @@ fn each_child_of_item_or_crate<F, G>(intr: Rc<IdentInterner>,
560557
{
561558
// Iterate over all children.
562559
let _ = reader::tagged_docs(item_doc, tag_mod_child, |child_info_doc| {
563-
let child_def_id = reader::with_doc_data(child_info_doc,
564-
parse_def_id);
565-
let child_def_id = translate_def_id(cdata, child_def_id);
560+
let child_def_id = translated_def_id(cdata, child_info_doc);
566561

567562
// This item may be in yet another crate if it was the child of a
568563
// reexport.
@@ -584,9 +579,7 @@ fn each_child_of_item_or_crate<F, G>(intr: Rc<IdentInterner>,
584579
Some(child_item_doc) => {
585580
// Hand off the item to the callback.
586581
let child_name = item_name(&*intr, child_item_doc);
587-
let def_like = item_to_def_like(child_item_doc,
588-
child_def_id,
589-
cdata.cnum);
582+
let def_like = item_to_def_like(crate_data, child_item_doc, child_def_id);
590583
let visibility = item_visibility(child_item_doc);
591584
callback(def_like, child_name, visibility);
592585

@@ -615,9 +608,8 @@ fn each_child_of_item_or_crate<F, G>(intr: Rc<IdentInterner>,
615608
if let StaticMethod = item_family(impl_method_doc) {
616609
// Hand off the static method to the callback.
617610
let static_method_name = item_name(&*intr, impl_method_doc);
618-
let static_method_def_like = item_to_def_like(impl_method_doc,
619-
impl_item_def_id,
620-
cdata.cnum);
611+
let static_method_def_like = item_to_def_like(cdata, impl_method_doc,
612+
impl_item_def_id);
621613
callback(static_method_def_like,
622614
static_method_name,
623615
item_visibility(impl_method_doc));
@@ -633,9 +625,7 @@ fn each_child_of_item_or_crate<F, G>(intr: Rc<IdentInterner>,
633625
let _ = each_reexport(item_doc, |reexport_doc| {
634626
let def_id_doc = reader::get_doc(reexport_doc,
635627
tag_items_data_item_reexport_def_id);
636-
let child_def_id = reader::with_doc_data(def_id_doc,
637-
parse_def_id);
638-
let child_def_id = translate_def_id(cdata, child_def_id);
628+
let child_def_id = translated_def_id(cdata, def_id_doc);
639629

640630
let name_doc = reader::get_doc(reexport_doc,
641631
tag_items_data_item_reexport_name);
@@ -657,9 +647,7 @@ fn each_child_of_item_or_crate<F, G>(intr: Rc<IdentInterner>,
657647
// Get the item.
658648
if let Some(child_item_doc) = maybe_find_item(child_def_id.node, other_crates_items) {
659649
// Hand off the item to the callback.
660-
let def_like = item_to_def_like(child_item_doc,
661-
child_def_id,
662-
child_def_id.krate);
650+
let def_like = item_to_def_like(crate_data, child_item_doc, child_def_id);
663651
// These items have a public visibility because they're part of
664652
// a public re-export.
665653
callback(def_like, token::intern(name), ast::Public);
@@ -733,9 +721,8 @@ pub fn maybe_get_item_ast<'tcx>(cdata: Cmd, tcx: &ty::ctxt<'tcx>, id: ast::NodeI
733721
match decode_inlined_item(cdata, tcx, path, item_doc) {
734722
Ok(ii) => csearch::FoundAst::Found(ii),
735723
Err(path) => {
736-
match item_parent_item(item_doc) {
724+
match item_parent_item(cdata, item_doc) {
737725
Some(did) => {
738-
let did = translate_def_id(cdata, did);
739726
let parent_item = lookup_item(did.node, cdata.data());
740727
match decode_inlined_item(cdata, tcx, path, parent_item) {
741728
Ok(ii) => csearch::FoundAst::FoundParent(did, ii),
@@ -759,7 +746,7 @@ pub fn get_enum_variant_defs(intr: &IdentInterner,
759746
let item = find_item(did.node, items);
760747
let name = item_name(intr, item);
761748
let visibility = item_visibility(item);
762-
match item_to_def_like(item, *did, cdata.cnum) {
749+
match item_to_def_like(cdata, item, *did) {
763750
DlDef(def @ def::DefVariant(..)) => (def, name, visibility),
764751
_ => unreachable!()
765752
}
@@ -889,8 +876,7 @@ pub fn get_impl_or_trait_item<'tcx>(intr: Rc<IdentInterner>,
889876

890877
let def_id = item_def_id(method_doc, cdata);
891878

892-
let container_id = item_reqd_and_translated_parent_item(cdata.cnum,
893-
method_doc);
879+
let container_id = item_require_parent_item(cdata, method_doc);
894880
let container_doc = lookup_item(container_id.node, cdata.data());
895881
let container = match item_family(container_doc) {
896882
Trait => TraitContainer(container_id),
@@ -1094,7 +1080,7 @@ pub fn get_tuple_struct_definition_if_ctor(cdata: Cmd,
10941080
let item = lookup_item(node_id, cdata.data());
10951081
let mut ret = None;
10961082
reader::tagged_docs(item, tag_items_data_item_is_tuple_struct_ctor, |_| {
1097-
ret = Some(item_reqd_and_translated_parent_item(cdata.cnum, item));
1083+
ret = Some(item_require_parent_item(cdata, item));
10981084
false
10991085
});
11001086
ret
@@ -1144,7 +1130,7 @@ pub fn get_struct_fields(intr: Rc<IdentInterner>, cdata: Cmd, id: ast::NodeId)
11441130
let name = item_name(&*intr, an_item);
11451131
let did = item_def_id(an_item, cdata);
11461132
let tagdoc = reader::get_doc(an_item, tag_item_field_origin);
1147-
let origin_id = translate_def_id(cdata, reader::with_doc_data(tagdoc, parse_def_id));
1133+
let origin_id = translated_def_id(cdata, tagdoc);
11481134
result.push(ty::field_ty {
11491135
name: name,
11501136
id: did,
@@ -1158,7 +1144,7 @@ pub fn get_struct_fields(intr: Rc<IdentInterner>, cdata: Cmd, id: ast::NodeId)
11581144
let did = item_def_id(an_item, cdata);
11591145
let tagdoc = reader::get_doc(an_item, tag_item_field_origin);
11601146
let f = item_family(an_item);
1161-
let origin_id = translate_def_id(cdata, reader::with_doc_data(tagdoc, parse_def_id));
1147+
let origin_id = translated_def_id(cdata, tagdoc);
11621148
result.push(ty::field_ty {
11631149
name: special_idents::unnamed_field.name,
11641150
id: did,
@@ -1386,11 +1372,10 @@ pub fn each_implementation_for_trait<F>(cdata: Cmd,
13861372
pub fn get_trait_of_item(cdata: Cmd, id: ast::NodeId, tcx: &ty::ctxt)
13871373
-> Option<ast::DefId> {
13881374
let item_doc = lookup_item(id, cdata.data());
1389-
let parent_item_id = match item_parent_item(item_doc) {
1375+
let parent_item_id = match item_parent_item(cdata, item_doc) {
13901376
None => return None,
13911377
Some(item_id) => item_id,
13921378
};
1393-
let parent_item_id = translate_def_id(cdata, parent_item_id);
13941379
let parent_item_doc = lookup_item(parent_item_id.node, cdata.data());
13951380
match item_family(parent_item_doc) {
13961381
Trait => Some(item_def_id(parent_item_doc, cdata)),
@@ -1538,8 +1523,7 @@ fn doc_generics<'tcx>(base_doc: rbml::Doc,
15381523
let name = item_name(&*token::get_ident_interner(), ident_str_doc);
15391524
let def_id_doc = reader::get_doc(rp_doc,
15401525
tag_region_param_def_def_id);
1541-
let def_id = reader::with_doc_data(def_id_doc, parse_def_id);
1542-
let def_id = translate_def_id(cdata, def_id);
1526+
let def_id = translated_def_id(cdata, def_id_doc);
15431527

15441528
let doc = reader::get_doc(rp_doc, tag_region_param_def_space);
15451529
let space = subst::ParamSpace::from_uint(reader::doc_as_u64(doc) as usize);

0 commit comments

Comments
 (0)