@@ -33,41 +33,28 @@ use std::hashmap::HashMap;
33
33
use std:: iter:: Enumerate ;
34
34
use std:: vec;
35
35
36
-
37
- // Get the last "argument" (has to be done recursively to avoid phoney local ambiguity error)
38
- macro_rules! last {
39
- ( $first: expr, $( $remainder: expr, ) + ) => ( last!( $( $remainder, ) + ) ) ;
40
- ( $first: expr, ) => ( $first )
41
- }
42
-
43
36
// The actual lang items defined come at the end of this file in one handy table.
44
37
// So you probably just want to nip down to the end.
45
38
macro_rules! lets_do_this {
46
- // secondary rule to allow us to use `$num` as both an expression
47
- // and a pattern.
48
39
(
49
- $( $num: tt, $variant: ident, $name: expr, $method: ident; ) *
50
- ) => {
51
- lets_do_this!( count = 1 + last!( $( $num, ) * ) ,
52
- $( $num, $variant, $name, $method; ) * )
53
- } ;
54
-
55
- (
56
- count = $num_lang_items: expr, $( $num: pat, $variant: ident, $name: expr, $method: ident; ) *
40
+ $( $variant: ident, $name: expr, $method: ident; ) *
57
41
) => {
58
42
43
+ #[ deriving( FromPrimitive ) ]
59
44
pub enum LangItem {
60
45
$( $variant) ,*
61
46
}
62
47
63
48
pub struct LanguageItems {
64
- items: [ Option <ast:: DefId >, ..$num_lang_items ]
49
+ items: ~ [ Option <ast:: DefId >] ,
65
50
}
66
51
67
52
impl LanguageItems {
68
53
pub fn new( ) -> LanguageItems {
54
+ fn foo( _: LangItem ) -> Option <ast:: DefId > { None }
55
+
69
56
LanguageItems {
70
- items: [ None , ..$num_lang_items ]
57
+ items: ~ [ $ ( foo ( $variant ) ) , * ]
71
58
}
72
59
}
73
60
@@ -76,9 +63,10 @@ impl LanguageItems {
76
63
}
77
64
78
65
pub fn item_name( index: uint) -> & ' static str {
79
- match index {
80
- $( $num => $name, ) *
81
- _ => "???"
66
+ let item: Option <LangItem > = FromPrimitive :: from_uint( index) ;
67
+ match item {
68
+ $( Some ( $variant) => $name, ) *
69
+ None => "???"
82
70
}
83
71
}
84
72
@@ -208,69 +196,68 @@ pub fn extract(attrs: &[ast::Attribute]) -> Option<@str> {
208
196
}
209
197
210
198
pub fn collect_language_items( crate : & ast:: Crate ,
211
- session: Session )
212
- -> LanguageItems {
199
+ session: Session ) -> @LanguageItems {
213
200
let mut collector = LanguageItemCollector :: new( session) ;
214
201
collector. collect( crate ) ;
215
202
let LanguageItemCollector { items, .. } = collector;
216
203
session. abort_if_errors( ) ;
217
- items
204
+ @ items
218
205
}
219
206
220
207
// End of the macro
221
208
}
222
209
}
223
210
224
211
lets_do_this ! {
225
- // ID, Variant name, Name, Method name;
226
- 0 , FreezeTraitLangItem , "freeze" , freeze_trait;
227
- 1 , SendTraitLangItem , "send" , send_trait;
228
- 2 , SizedTraitLangItem , "sized" , sized_trait;
229
- 3 , PodTraitLangItem , "pod" , pod_trait;
230
-
231
- 4 , DropTraitLangItem , "drop" , drop_trait;
232
-
233
- 5 , AddTraitLangItem , "add" , add_trait;
234
- 6 , SubTraitLangItem , "sub" , sub_trait;
235
- 7 , MulTraitLangItem , "mul" , mul_trait;
236
- 8 , DivTraitLangItem , "div" , div_trait;
237
- 9 , RemTraitLangItem , "rem" , rem_trait;
238
- 10 , NegTraitLangItem , "neg" , neg_trait;
239
- 11 , NotTraitLangItem , "not" , not_trait;
240
- 12 , BitXorTraitLangItem , "bitxor" , bitxor_trait;
241
- 13 , BitAndTraitLangItem , "bitand" , bitand_trait;
242
- 14 , BitOrTraitLangItem , "bitor" , bitor_trait;
243
- 15 , ShlTraitLangItem , "shl" , shl_trait;
244
- 16 , ShrTraitLangItem , "shr" , shr_trait;
245
- 17 , IndexTraitLangItem , "index" , index_trait;
246
-
247
- 18 , EqTraitLangItem , "eq" , eq_trait;
248
- 19 , OrdTraitLangItem , "ord" , ord_trait;
249
-
250
- 20 , StrEqFnLangItem , "str_eq" , str_eq_fn;
251
- 21 , UniqStrEqFnLangItem , "uniq_str_eq" , uniq_str_eq_fn;
252
- 22 , FailFnLangItem , "fail_" , fail_fn;
253
- 23 , FailBoundsCheckFnLangItem , "fail_bounds_check" , fail_bounds_check_fn;
254
- 24 , ExchangeMallocFnLangItem , "exchange_malloc" , exchange_malloc_fn;
255
- 25 , ClosureExchangeMallocFnLangItem , "closure_exchange_malloc" , closure_exchange_malloc_fn;
256
- 26 , ExchangeFreeFnLangItem , "exchange_free" , exchange_free_fn;
257
- 27 , MallocFnLangItem , "malloc" , malloc_fn;
258
- 28 , FreeFnLangItem , "free" , free_fn;
259
- 29 , StrDupUniqFnLangItem , "strdup_uniq" , strdup_uniq_fn;
260
-
261
- 30 , StartFnLangItem , "start" , start_fn;
262
-
263
- 31 , TyDescStructLangItem , "ty_desc" , ty_desc;
264
- 32 , TyVisitorTraitLangItem , "ty_visitor" , ty_visitor;
265
- 33 , OpaqueStructLangItem , "opaque" , opaque;
266
-
267
- 34 , EventLoopFactoryLangItem , "event_loop_factory" , event_loop_factory;
268
-
269
- 35 , TypeIdLangItem , "type_id" , type_id;
270
-
271
- 36 , EhPersonalityLangItem , "eh_personality" , eh_personality_fn;
272
-
273
- 37 , ManagedHeapLangItem , "managed_heap" , managed_heap;
274
- 38 , ExchangeHeapLangItem , "exchange_heap" , exchange_heap;
275
- 39 , GcLangItem , "gc" , gc;
212
+ // Variant name, Name, Method name;
213
+ FreezeTraitLangItem , "freeze" , freeze_trait;
214
+ SendTraitLangItem , "send" , send_trait;
215
+ SizedTraitLangItem , "sized" , sized_trait;
216
+ PodTraitLangItem , "pod" , pod_trait;
217
+
218
+ DropTraitLangItem , "drop" , drop_trait;
219
+
220
+ AddTraitLangItem , "add" , add_trait;
221
+ SubTraitLangItem , "sub" , sub_trait;
222
+ MulTraitLangItem , "mul" , mul_trait;
223
+ DivTraitLangItem , "div" , div_trait;
224
+ RemTraitLangItem , "rem" , rem_trait;
225
+ NegTraitLangItem , "neg" , neg_trait;
226
+ NotTraitLangItem , "not" , not_trait;
227
+ BitXorTraitLangItem , "bitxor" , bitxor_trait;
228
+ BitAndTraitLangItem , "bitand" , bitand_trait;
229
+ BitOrTraitLangItem , "bitor" , bitor_trait;
230
+ ShlTraitLangItem , "shl" , shl_trait;
231
+ ShrTraitLangItem , "shr" , shr_trait;
232
+ IndexTraitLangItem , "index" , index_trait;
233
+
234
+ EqTraitLangItem , "eq" , eq_trait;
235
+ OrdTraitLangItem , "ord" , ord_trait;
236
+
237
+ StrEqFnLangItem , "str_eq" , str_eq_fn;
238
+ UniqStrEqFnLangItem , "uniq_str_eq" , uniq_str_eq_fn;
239
+ FailFnLangItem , "fail_" , fail_fn;
240
+ FailBoundsCheckFnLangItem , "fail_bounds_check" , fail_bounds_check_fn;
241
+ ExchangeMallocFnLangItem , "exchange_malloc" , exchange_malloc_fn;
242
+ ClosureExchangeMallocFnLangItem , "closure_exchange_malloc" , closure_exchange_malloc_fn;
243
+ ExchangeFreeFnLangItem , "exchange_free" , exchange_free_fn;
244
+ MallocFnLangItem , "malloc" , malloc_fn;
245
+ FreeFnLangItem , "free" , free_fn;
246
+ StrDupUniqFnLangItem , "strdup_uniq" , strdup_uniq_fn;
247
+
248
+ StartFnLangItem , "start" , start_fn;
249
+
250
+ TyDescStructLangItem , "ty_desc" , ty_desc;
251
+ TyVisitorTraitLangItem , "ty_visitor" , ty_visitor;
252
+ OpaqueStructLangItem , "opaque" , opaque;
253
+
254
+ EventLoopFactoryLangItem , "event_loop_factory" , event_loop_factory;
255
+
256
+ TypeIdLangItem , "type_id" , type_id;
257
+
258
+ EhPersonalityLangItem , "eh_personality" , eh_personality_fn;
259
+
260
+ ManagedHeapLangItem , "managed_heap" , managed_heap;
261
+ ExchangeHeapLangItem , "exchange_heap" , exchange_heap;
262
+ GcLangItem , "gc" , gc;
276
263
}
0 commit comments