Skip to content

Commit ca2d596

Browse files
committed
auto merge of #9614 : blake2-ppc/rust/lang-item-iter, r=alexcrichton
Cleanup in middle::lang_items Use static string keys in the lang item hashmap, and convert the traversal function to be an iterator.
2 parents 80b6056 + abcca1c commit ca2d596

File tree

2 files changed

+52
-51
lines changed

2 files changed

+52
-51
lines changed

src/librustc/metadata/encoder.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1574,7 +1574,7 @@ fn encode_crate_deps(ecx: &EncodeContext,
15741574
fn encode_lang_items(ecx: &EncodeContext, ebml_w: &mut writer::Encoder) {
15751575
ebml_w.start_tag(tag_lang_items);
15761576

1577-
do ecx.tcx.lang_items.each_item |def_id, i| {
1577+
for (i, def_id) in ecx.tcx.lang_items.items() {
15781578
for id in def_id.iter() {
15791579
if id.crate == LOCAL_CRATE {
15801580
ebml_w.start_tag(tag_lang_items_item);
@@ -1590,8 +1590,7 @@ fn encode_lang_items(ecx: &EncodeContext, ebml_w: &mut writer::Encoder) {
15901590
ebml_w.end_tag(); // tag_lang_items_item
15911591
}
15921592
}
1593-
true
1594-
};
1593+
}
15951594

15961595
ebml_w.end_tag(); // tag_lang_items
15971596
}

src/librustc/middle/lang_items.rs

Lines changed: 50 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ use syntax::visit;
3232
use syntax::visit::Visitor;
3333

3434
use std::hashmap::HashMap;
35+
use std::iter::Enumerate;
36+
use std::vec;
3537

3638
pub enum LangItem {
3739
FreezeTraitLangItem, // 0
@@ -92,8 +94,8 @@ impl LanguageItems {
9294
}
9395
}
9496

95-
pub fn each_item(&self, f: &fn(Option<DefId>, uint) -> bool) -> bool {
96-
self.items.iter().enumerate().advance(|(i, &item)| f(item, i))
97+
pub fn items<'a>(&'a self) -> Enumerate<vec::VecIterator<'a, Option<DefId>>> {
98+
self.items.iter().enumerate()
9799
}
98100

99101
pub fn item_name(index: uint) -> &'static str {
@@ -298,7 +300,7 @@ struct LanguageItemCollector<'self> {
298300
crate: &'self Crate,
299301
session: Session,
300302

301-
item_refs: HashMap<@str, uint>,
303+
item_refs: HashMap<&'static str, uint>,
302304
}
303305

304306
struct LanguageItemVisitor<'self> {
@@ -327,51 +329,51 @@ impl<'self> LanguageItemCollector<'self> {
327329
-> LanguageItemCollector<'a> {
328330
let mut item_refs = HashMap::new();
329331

330-
item_refs.insert(@"freeze", FreezeTraitLangItem as uint);
331-
item_refs.insert(@"send", SendTraitLangItem as uint);
332-
item_refs.insert(@"sized", SizedTraitLangItem as uint);
333-
334-
item_refs.insert(@"drop", DropTraitLangItem as uint);
335-
336-
item_refs.insert(@"add", AddTraitLangItem as uint);
337-
item_refs.insert(@"sub", SubTraitLangItem as uint);
338-
item_refs.insert(@"mul", MulTraitLangItem as uint);
339-
item_refs.insert(@"div", DivTraitLangItem as uint);
340-
item_refs.insert(@"rem", RemTraitLangItem as uint);
341-
item_refs.insert(@"neg", NegTraitLangItem as uint);
342-
item_refs.insert(@"not", NotTraitLangItem as uint);
343-
item_refs.insert(@"bitxor", BitXorTraitLangItem as uint);
344-
item_refs.insert(@"bitand", BitAndTraitLangItem as uint);
345-
item_refs.insert(@"bitor", BitOrTraitLangItem as uint);
346-
item_refs.insert(@"shl", ShlTraitLangItem as uint);
347-
item_refs.insert(@"shr", ShrTraitLangItem as uint);
348-
item_refs.insert(@"index", IndexTraitLangItem as uint);
349-
350-
item_refs.insert(@"eq", EqTraitLangItem as uint);
351-
item_refs.insert(@"ord", OrdTraitLangItem as uint);
352-
353-
item_refs.insert(@"str_eq", StrEqFnLangItem as uint);
354-
item_refs.insert(@"uniq_str_eq", UniqStrEqFnLangItem as uint);
355-
item_refs.insert(@"fail_", FailFnLangItem as uint);
356-
item_refs.insert(@"fail_bounds_check",
332+
item_refs.insert("freeze", FreezeTraitLangItem as uint);
333+
item_refs.insert("send", SendTraitLangItem as uint);
334+
item_refs.insert("sized", SizedTraitLangItem as uint);
335+
336+
item_refs.insert("drop", DropTraitLangItem as uint);
337+
338+
item_refs.insert("add", AddTraitLangItem as uint);
339+
item_refs.insert("sub", SubTraitLangItem as uint);
340+
item_refs.insert("mul", MulTraitLangItem as uint);
341+
item_refs.insert("div", DivTraitLangItem as uint);
342+
item_refs.insert("rem", RemTraitLangItem as uint);
343+
item_refs.insert("neg", NegTraitLangItem as uint);
344+
item_refs.insert("not", NotTraitLangItem as uint);
345+
item_refs.insert("bitxor", BitXorTraitLangItem as uint);
346+
item_refs.insert("bitand", BitAndTraitLangItem as uint);
347+
item_refs.insert("bitor", BitOrTraitLangItem as uint);
348+
item_refs.insert("shl", ShlTraitLangItem as uint);
349+
item_refs.insert("shr", ShrTraitLangItem as uint);
350+
item_refs.insert("index", IndexTraitLangItem as uint);
351+
352+
item_refs.insert("eq", EqTraitLangItem as uint);
353+
item_refs.insert("ord", OrdTraitLangItem as uint);
354+
355+
item_refs.insert("str_eq", StrEqFnLangItem as uint);
356+
item_refs.insert("uniq_str_eq", UniqStrEqFnLangItem as uint);
357+
item_refs.insert("fail_", FailFnLangItem as uint);
358+
item_refs.insert("fail_bounds_check",
357359
FailBoundsCheckFnLangItem as uint);
358-
item_refs.insert(@"exchange_malloc", ExchangeMallocFnLangItem as uint);
359-
item_refs.insert(@"closure_exchange_malloc", ClosureExchangeMallocFnLangItem as uint);
360-
item_refs.insert(@"exchange_free", ExchangeFreeFnLangItem as uint);
361-
item_refs.insert(@"malloc", MallocFnLangItem as uint);
362-
item_refs.insert(@"free", FreeFnLangItem as uint);
363-
item_refs.insert(@"borrow_as_imm", BorrowAsImmFnLangItem as uint);
364-
item_refs.insert(@"borrow_as_mut", BorrowAsMutFnLangItem as uint);
365-
item_refs.insert(@"return_to_mut", ReturnToMutFnLangItem as uint);
366-
item_refs.insert(@"check_not_borrowed",
360+
item_refs.insert("exchange_malloc", ExchangeMallocFnLangItem as uint);
361+
item_refs.insert("closure_exchange_malloc", ClosureExchangeMallocFnLangItem as uint);
362+
item_refs.insert("exchange_free", ExchangeFreeFnLangItem as uint);
363+
item_refs.insert("malloc", MallocFnLangItem as uint);
364+
item_refs.insert("free", FreeFnLangItem as uint);
365+
item_refs.insert("borrow_as_imm", BorrowAsImmFnLangItem as uint);
366+
item_refs.insert("borrow_as_mut", BorrowAsMutFnLangItem as uint);
367+
item_refs.insert("return_to_mut", ReturnToMutFnLangItem as uint);
368+
item_refs.insert("check_not_borrowed",
367369
CheckNotBorrowedFnLangItem as uint);
368-
item_refs.insert(@"strdup_uniq", StrDupUniqFnLangItem as uint);
369-
item_refs.insert(@"record_borrow", RecordBorrowFnLangItem as uint);
370-
item_refs.insert(@"unrecord_borrow", UnrecordBorrowFnLangItem as uint);
371-
item_refs.insert(@"start", StartFnLangItem as uint);
372-
item_refs.insert(@"ty_desc", TyDescStructLangItem as uint);
373-
item_refs.insert(@"ty_visitor", TyVisitorTraitLangItem as uint);
374-
item_refs.insert(@"opaque", OpaqueStructLangItem as uint);
370+
item_refs.insert("strdup_uniq", StrDupUniqFnLangItem as uint);
371+
item_refs.insert("record_borrow", RecordBorrowFnLangItem as uint);
372+
item_refs.insert("unrecord_borrow", UnrecordBorrowFnLangItem as uint);
373+
item_refs.insert("start", StartFnLangItem as uint);
374+
item_refs.insert("ty_desc", TyDescStructLangItem as uint);
375+
item_refs.insert("ty_visitor", TyVisitorTraitLangItem as uint);
376+
item_refs.insert("opaque", OpaqueStructLangItem as uint);
375377

376378
LanguageItemCollector {
377379
crate: crate,
@@ -416,8 +418,8 @@ impl<'self> LanguageItemCollector<'self> {
416418
return; // Didn't match.
417419
}
418420

419-
let item_index = self.item_refs.find(&value).map_move(|x| *x);
420-
// prevent borrow checker from considering ^~~~~~~~~~~
421+
let item_index = self.item_refs.find_equiv(&value).map_move(|x| *x);
422+
// prevent borrow checker from considering ^~~~~~~~~~~
421423
// self to be borrowed (annoying)
422424

423425
match item_index {

0 commit comments

Comments
 (0)