@@ -33,104 +33,157 @@ use core::ptr;
33
33
use std:: map:: HashMap ;
34
34
use str_eq = str :: eq;
35
35
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
+
36
66
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 ]
64
68
}
65
69
66
- mod language_items {
67
- #[ legacy_exports] ;
68
- fn make ( ) -> LanguageItems {
70
+ impl LanguageItems {
71
+ static pub fn new( ) -> LanguageItems {
69
72
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 ]
97
74
}
98
75
}
99
- }
100
76
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
+ }
104
139
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 {
105
158
let item_refs = HashMap ( ) ;
106
159
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 ) ;
134
187
135
188
LanguageItemCollector {
136
189
crate: crate ,
@@ -141,16 +194,15 @@ fn LanguageItemCollector(crate: @crate, session: Session,
141
194
}
142
195
143
196
struct LanguageItemCollector {
144
- items : & LanguageItems ,
197
+ items : & mut LanguageItems ,
145
198
146
199
crate : @crate ,
147
200
session : Session ,
148
201
149
- item_refs : HashMap < ~str , & mut Option < def_id > > ,
202
+ item_refs : HashMap < ~str , uint > ,
150
203
}
151
204
152
205
impl LanguageItemCollector {
153
-
154
206
fn match_and_collect_meta_item ( item_def_id : def_id ,
155
207
meta_item : meta_item ) {
156
208
match meta_item. node {
@@ -177,12 +229,11 @@ impl LanguageItemCollector {
177
229
None => {
178
230
// Didn't match.
179
231
}
180
- Some ( item_ref ) => {
232
+ Some ( item_index ) => {
181
233
// Check for duplicates.
182
- match copy * item_ref {
234
+ match self . items . items [ item_index ] {
183
235
Some ( original_def_id)
184
236
if original_def_id != item_def_id => {
185
-
186
237
self . session . err ( fmt ! ( "duplicate entry for `%s`" ,
187
238
value) ) ;
188
239
}
@@ -192,7 +243,7 @@ impl LanguageItemCollector {
192
243
}
193
244
194
245
// Matched.
195
- * item_ref = Some ( item_def_id) ;
246
+ self . items . items [ item_index ] = Some ( item_def_id) ;
196
247
}
197
248
}
198
249
}
@@ -240,7 +291,7 @@ impl LanguageItemCollector {
240
291
241
292
fn check_completeness ( ) {
242
293
for self . item_refs. each |key, item_ref| {
243
- match * item_ref {
294
+ match self . items . items [ item_ref] {
244
295
None => {
245
296
self . session . err ( fmt ! ( "no item found for `%s`" , key) ) ;
246
297
}
@@ -259,8 +310,8 @@ impl LanguageItemCollector {
259
310
}
260
311
261
312
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) ;
264
315
collector. collect ( ) ;
265
316
copy items
266
317
}
0 commit comments