Skip to content

Commit 0ab7f91

Browse files
committed
librustc: Refactor language items to have IDs. rs=refactor
Preparation for fixing the performance problems with language item collection.
1 parent 96e01a6 commit 0ab7f91

File tree

9 files changed

+178
-131
lines changed

9 files changed

+178
-131
lines changed

src/librustc/metadata/csearch.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ export get_type;
4848
export get_impl_traits;
4949
export get_impl_method;
5050
export get_item_path;
51+
export get_lang_items;
5152
export maybe_get_item_ast, found_ast, found, found_parent, not_found;
5253
export ProvidedTraitMethodInfo;
5354
export StaticMethodInfo;

src/librustc/middle/lang_items.rs

Lines changed: 149 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -33,104 +33,157 @@ use core::ptr;
3333
use std::map::HashMap;
3434
use str_eq = str::eq;
3535

36+
pub enum LangItem {
37+
ConstTraitLangItem, // 0
38+
CopyTraitLangItem, // 1
39+
OwnedTraitLangItem, // 2
40+
DurableTraitLangItem, // 3
41+
42+
DropTraitLangItem, // 4
43+
44+
AddTraitLangItem, // 5
45+
SubTraitLangItem, // 6
46+
MulTraitLangItem, // 7
47+
DivTraitLangItem, // 8
48+
ModuloTraitLangItem, // 9
49+
NegTraitLangItem, // 10
50+
BitXorTraitLangItem, // 11
51+
BitAndTraitLangItem, // 12
52+
BitOrTraitLangItem, // 13
53+
ShlTraitLangItem, // 14
54+
ShrTraitLangItem, // 15
55+
IndexTraitLangItem, // 16
56+
57+
EqTraitLangItem, // 17
58+
OrdTraitLangItem, // 18
59+
60+
StrEqFnLangItem, // 19
61+
UniqStrEqFnLangItem, // 20
62+
AnnihilateFnLangItem, // 21
63+
LogTypeFnLangItem, // 22
64+
}
65+
3666
struct LanguageItems {
37-
mut const_trait: Option<def_id>,
38-
mut copy_trait: Option<def_id>,
39-
mut owned_trait: Option<def_id>,
40-
mut durable_trait: Option<def_id>,
41-
42-
mut drop_trait: Option<def_id>,
43-
44-
mut add_trait: Option<def_id>,
45-
mut sub_trait: Option<def_id>,
46-
mut mul_trait: Option<def_id>,
47-
mut div_trait: Option<def_id>,
48-
mut modulo_trait: Option<def_id>,
49-
mut neg_trait: Option<def_id>,
50-
mut bitxor_trait: Option<def_id>,
51-
mut bitand_trait: Option<def_id>,
52-
mut bitor_trait: Option<def_id>,
53-
mut shl_trait: Option<def_id>,
54-
mut shr_trait: Option<def_id>,
55-
mut index_trait: Option<def_id>,
56-
57-
mut eq_trait: Option<def_id>,
58-
mut ord_trait: Option<def_id>,
59-
60-
mut str_eq_fn: Option<def_id>,
61-
mut uniq_str_eq_fn: Option<def_id>,
62-
mut annihilate_fn: Option<def_id>,
63-
mut log_type_fn: Option<def_id>
67+
items: [ Option<def_id> * 23 ]
6468
}
6569

66-
mod language_items {
67-
#[legacy_exports];
68-
fn make() -> LanguageItems {
70+
impl LanguageItems {
71+
static pub fn new() -> LanguageItems {
6972
LanguageItems {
70-
const_trait: None,
71-
copy_trait: None,
72-
owned_trait: None,
73-
durable_trait: None,
74-
75-
drop_trait: None,
76-
77-
add_trait: None,
78-
sub_trait: None,
79-
mul_trait: None,
80-
div_trait: None,
81-
modulo_trait: None,
82-
neg_trait: None,
83-
bitxor_trait: None,
84-
bitand_trait: None,
85-
bitor_trait: None,
86-
shl_trait: None,
87-
shr_trait: None,
88-
index_trait: None,
89-
90-
eq_trait: None,
91-
ord_trait: None,
92-
93-
str_eq_fn: None,
94-
uniq_str_eq_fn: None,
95-
annihilate_fn: None,
96-
log_type_fn: None
73+
items: [ None, ..23 ]
9774
}
9875
}
99-
}
10076

101-
fn LanguageItemCollector(crate: @crate, session: Session,
102-
items: &r/LanguageItems)
103-
-> LanguageItemCollector/&r {
77+
// XXX: Method macros sure would be nice here.
78+
79+
pub fn const_trait(&const self) -> def_id {
80+
self.items[ConstTraitLangItem as uint].get()
81+
}
82+
pub fn copy_trait(&const self) -> def_id {
83+
self.items[CopyTraitLangItem as uint].get()
84+
}
85+
pub fn owned_trait(&const self) -> def_id {
86+
self.items[OwnedTraitLangItem as uint].get()
87+
}
88+
pub fn durable_trait(&const self) -> def_id {
89+
self.items[DurableTraitLangItem as uint].get()
90+
}
91+
92+
pub fn drop_trait(&const self) -> def_id {
93+
self.items[DropTraitLangItem as uint].get()
94+
}
95+
96+
pub fn add_trait(&const self) -> def_id {
97+
self.items[AddTraitLangItem as uint].get()
98+
}
99+
pub fn sub_trait(&const self) -> def_id {
100+
self.items[SubTraitLangItem as uint].get()
101+
}
102+
pub fn mul_trait(&const self) -> def_id {
103+
self.items[MulTraitLangItem as uint].get()
104+
}
105+
pub fn div_trait(&const self) -> def_id {
106+
self.items[DivTraitLangItem as uint].get()
107+
}
108+
pub fn modulo_trait(&const self) -> def_id {
109+
self.items[ModuloTraitLangItem as uint].get()
110+
}
111+
pub fn neg_trait(&const self) -> def_id {
112+
self.items[NegTraitLangItem as uint].get()
113+
}
114+
pub fn bitxor_trait(&const self) -> def_id {
115+
self.items[BitXorTraitLangItem as uint].get()
116+
}
117+
pub fn bitand_trait(&const self) -> def_id {
118+
self.items[BitAndTraitLangItem as uint].get()
119+
}
120+
pub fn bitor_trait(&const self) -> def_id {
121+
self.items[BitOrTraitLangItem as uint].get()
122+
}
123+
pub fn shl_trait(&const self) -> def_id {
124+
self.items[ShlTraitLangItem as uint].get()
125+
}
126+
pub fn shr_trait(&const self) -> def_id {
127+
self.items[ShrTraitLangItem as uint].get()
128+
}
129+
pub fn index_trait(&const self) -> def_id {
130+
self.items[IndexTraitLangItem as uint].get()
131+
}
132+
133+
pub fn eq_trait(&const self) -> def_id {
134+
self.items[EqTraitLangItem as uint].get()
135+
}
136+
pub fn ord_trait(&const self) -> def_id {
137+
self.items[OrdTraitLangItem as uint].get()
138+
}
104139

140+
pub fn str_eq_fn(&const self) -> def_id {
141+
self.items[StrEqFnLangItem as uint].get()
142+
}
143+
pub fn uniq_str_eq_fn(&const self) -> def_id {
144+
self.items[UniqStrEqFnLangItem as uint].get()
145+
}
146+
pub fn annihilate_fn(&const self) -> def_id {
147+
self.items[AnnihilateFnLangItem as uint].get()
148+
}
149+
pub fn log_type_fn(&const self) -> def_id {
150+
self.items[LogTypeFnLangItem as uint].get()
151+
}
152+
}
153+
154+
fn LanguageItemCollector(crate: @crate,
155+
session: Session,
156+
items: &r/mut LanguageItems)
157+
-> LanguageItemCollector/&r {
105158
let item_refs = HashMap();
106159

107-
item_refs.insert(~"const", &mut items.const_trait);
108-
item_refs.insert(~"copy", &mut items.copy_trait);
109-
item_refs.insert(~"owned", &mut items.owned_trait);
110-
item_refs.insert(~"durable", &mut items.durable_trait);
111-
112-
item_refs.insert(~"drop", &mut items.drop_trait);
113-
114-
item_refs.insert(~"add", &mut items.add_trait);
115-
item_refs.insert(~"sub", &mut items.sub_trait);
116-
item_refs.insert(~"mul", &mut items.mul_trait);
117-
item_refs.insert(~"div", &mut items.div_trait);
118-
item_refs.insert(~"modulo", &mut items.modulo_trait);
119-
item_refs.insert(~"neg", &mut items.neg_trait);
120-
item_refs.insert(~"bitxor", &mut items.bitxor_trait);
121-
item_refs.insert(~"bitand", &mut items.bitand_trait);
122-
item_refs.insert(~"bitor", &mut items.bitor_trait);
123-
item_refs.insert(~"shl", &mut items.shl_trait);
124-
item_refs.insert(~"shr", &mut items.shr_trait);
125-
item_refs.insert(~"index", &mut items.index_trait);
126-
127-
item_refs.insert(~"eq", &mut items.eq_trait);
128-
item_refs.insert(~"ord", &mut items.ord_trait);
129-
130-
item_refs.insert(~"str_eq", &mut items.str_eq_fn);
131-
item_refs.insert(~"uniq_str_eq", &mut items.uniq_str_eq_fn);
132-
item_refs.insert(~"annihilate", &mut items.annihilate_fn);
133-
item_refs.insert(~"log_type", &mut items.log_type_fn);
160+
item_refs.insert(~"const", ConstTraitLangItem as uint);
161+
item_refs.insert(~"copy", CopyTraitLangItem as uint);
162+
item_refs.insert(~"owned", OwnedTraitLangItem as uint);
163+
item_refs.insert(~"durable", DurableTraitLangItem as uint);
164+
165+
item_refs.insert(~"drop", DropTraitLangItem as uint);
166+
167+
item_refs.insert(~"add", AddTraitLangItem as uint);
168+
item_refs.insert(~"sub", SubTraitLangItem as uint);
169+
item_refs.insert(~"mul", MulTraitLangItem as uint);
170+
item_refs.insert(~"div", DivTraitLangItem as uint);
171+
item_refs.insert(~"modulo", ModuloTraitLangItem as uint);
172+
item_refs.insert(~"neg", NegTraitLangItem as uint);
173+
item_refs.insert(~"bitxor", BitXorTraitLangItem as uint);
174+
item_refs.insert(~"bitand", BitAndTraitLangItem as uint);
175+
item_refs.insert(~"bitor", BitOrTraitLangItem as uint);
176+
item_refs.insert(~"shl", ShlTraitLangItem as uint);
177+
item_refs.insert(~"shr", ShrTraitLangItem as uint);
178+
item_refs.insert(~"index", IndexTraitLangItem as uint);
179+
180+
item_refs.insert(~"eq", EqTraitLangItem as uint);
181+
item_refs.insert(~"ord", OrdTraitLangItem as uint);
182+
183+
item_refs.insert(~"str_eq", StrEqFnLangItem as uint);
184+
item_refs.insert(~"uniq_str_eq", UniqStrEqFnLangItem as uint);
185+
item_refs.insert(~"annihilate", AnnihilateFnLangItem as uint);
186+
item_refs.insert(~"log_type", LogTypeFnLangItem as uint);
134187

135188
LanguageItemCollector {
136189
crate: crate,
@@ -141,16 +194,15 @@ fn LanguageItemCollector(crate: @crate, session: Session,
141194
}
142195

143196
struct LanguageItemCollector {
144-
items: &LanguageItems,
197+
items: &mut LanguageItems,
145198

146199
crate: @crate,
147200
session: Session,
148201

149-
item_refs: HashMap<~str,&mut Option<def_id>>,
202+
item_refs: HashMap<~str,uint>,
150203
}
151204

152205
impl LanguageItemCollector {
153-
154206
fn match_and_collect_meta_item(item_def_id: def_id,
155207
meta_item: meta_item) {
156208
match meta_item.node {
@@ -177,12 +229,11 @@ impl LanguageItemCollector {
177229
None => {
178230
// Didn't match.
179231
}
180-
Some(item_ref) => {
232+
Some(item_index) => {
181233
// Check for duplicates.
182-
match copy *item_ref {
234+
match self.items.items[item_index] {
183235
Some(original_def_id)
184236
if original_def_id != item_def_id => {
185-
186237
self.session.err(fmt!("duplicate entry for `%s`",
187238
value));
188239
}
@@ -192,7 +243,7 @@ impl LanguageItemCollector {
192243
}
193244

194245
// Matched.
195-
*item_ref = Some(item_def_id);
246+
self.items.items[item_index] = Some(item_def_id);
196247
}
197248
}
198249
}
@@ -240,7 +291,7 @@ impl LanguageItemCollector {
240291

241292
fn check_completeness() {
242293
for self.item_refs.each |key, item_ref| {
243-
match *item_ref {
294+
match self.items.items[item_ref] {
244295
None => {
245296
self.session.err(fmt!("no item found for `%s`", key));
246297
}
@@ -259,8 +310,8 @@ impl LanguageItemCollector {
259310
}
260311

261312
fn collect_language_items(crate: @crate, session: Session) -> LanguageItems {
262-
let items = language_items::make();
263-
let collector = LanguageItemCollector(crate, session, &items);
313+
let mut items = LanguageItems::new();
314+
let collector = LanguageItemCollector(crate, session, &mut items);
264315
collector.collect();
265316
copy items
266317
}

0 commit comments

Comments
 (0)