@@ -20,7 +20,7 @@ use syntax::attr::mk_attr_id;
20
20
use syntax:: ptr:: P ;
21
21
use syntax:: print:: pprust:: tts_to_string;
22
22
23
- use super :: LinkType ;
23
+ use super :: { BindgenOptions , LinkType } ;
24
24
use types:: * ;
25
25
26
26
struct GenCtx < ' r > {
@@ -115,7 +115,11 @@ fn enum_name(name: &str) -> String {
115
115
format ! ( "Enum_{}" , name)
116
116
}
117
117
118
- pub fn gen_mod ( links : & [ ( String , LinkType ) ] , globs : Vec < Global > , span : Span ) -> Vec < P < ast:: Item > > {
118
+ pub fn gen_mod (
119
+ options : & BindgenOptions ,
120
+ globs : Vec < Global > ,
121
+ span : Span )
122
+ -> Vec < P < ast:: Item > > {
119
123
// Create a dummy ExtCtxt. We only need this for string interning and that uses TLS.
120
124
let mut features = Features :: new ( ) ;
121
125
features. allow_quote = true ;
@@ -180,8 +184,11 @@ pub fn gen_mod(links: &[(String, LinkType)], globs: Vec<Global>, span: Span) ->
180
184
for g in gs. into_iter ( ) {
181
185
match g {
182
186
GType ( ti) => {
183
- let t = ti. borrow ( ) . clone ( ) ;
184
- defs. extend ( ctypedef_to_rs ( & mut ctx, t. name . clone ( ) , & t. ty ) . into_iter ( ) )
187
+ let t = ti. borrow ( ) ;
188
+ defs. extend ( ctypedef_to_rs (
189
+ & mut ctx,
190
+ options. rust_enums ,
191
+ t. name . clone ( ) , & t. ty ) )
185
192
} ,
186
193
GCompDecl ( ci) => {
187
194
{
@@ -214,7 +221,10 @@ pub fn gen_mod(links: &[(String, LinkType)], globs: Vec<Global>, span: Span) ->
214
221
e. name = unnamed_name ( & mut ctx, e. name . clone ( ) ) ;
215
222
}
216
223
let e = ei. borrow ( ) ;
217
- defs. extend ( cenum_to_rs ( & mut ctx, enum_name ( & e. name ) , e. kind , e. layout , & e. items ) . into_iter ( ) )
224
+ defs. extend ( cenum_to_rs (
225
+ & mut ctx,
226
+ options. rust_enums ,
227
+ enum_name ( & e. name ) , e. kind , e. layout , & e. items ) ) ;
218
228
} ,
219
229
GVar ( vi) => {
220
230
let v = vi. borrow ( ) ;
@@ -269,11 +279,11 @@ pub fn gen_mod(links: &[(String, LinkType)], globs: Vec<Global>, span: Span) ->
269
279
} ;
270
280
271
281
if !Vec :: is_empty ( & vars) {
272
- defs. push ( mk_extern ( & mut ctx, links, vars, abi:: Abi :: C ) ) ;
282
+ defs. push ( mk_extern ( & mut ctx, & options . links , vars, abi:: Abi :: C ) ) ;
273
283
}
274
284
275
285
for ( abi, funcs) in funcs. into_iter ( ) {
276
- defs. push ( mk_extern ( & mut ctx, links, funcs, abi) ) ;
286
+ defs. push ( mk_extern ( & mut ctx, & options . links , funcs, abi) ) ;
277
287
}
278
288
279
289
//let attrs = vec!(mk_attr_list(&mut ctx, "allow", ["dead_code", "non_camel_case_types", "uppercase_variables"]));
@@ -439,7 +449,12 @@ fn tag_dup_decl(gs: Vec<Global>) -> Vec<Global> {
439
449
res
440
450
}
441
451
442
- fn ctypedef_to_rs ( ctx : & mut GenCtx , name : String , ty : & Type ) -> Vec < P < ast:: Item > > {
452
+ fn ctypedef_to_rs (
453
+ ctx : & mut GenCtx ,
454
+ rust_enums : bool ,
455
+ name : String ,
456
+ ty : & Type )
457
+ -> Vec < P < ast:: Item > > {
443
458
fn mk_item ( ctx : & mut GenCtx , name : String , ty : & Type ) -> P < ast:: Item > {
444
459
let rust_name = rust_type_id ( ctx, name) ;
445
460
let rust_ty = cty_to_rs ( ctx, ty) ;
@@ -478,7 +493,7 @@ fn ctypedef_to_rs(ctx: &mut GenCtx, name: String, ty: &Type) -> Vec<P<ast::Item>
478
493
if is_empty {
479
494
ei. borrow_mut ( ) . name = name. clone ( ) ;
480
495
let e = ei. borrow ( ) ;
481
- cenum_to_rs ( ctx, name, e. kind , e. layout , & e. items )
496
+ cenum_to_rs ( ctx, rust_enums , name, e. kind , e. layout , & e. items )
482
497
} else {
483
498
vec ! ( mk_item( ctx, name, ty) )
484
499
}
@@ -700,22 +715,6 @@ fn const_to_rs(ctx: &mut GenCtx, name: String, val: i64, val_ty: ast::Ty) -> P<a
700
715
} )
701
716
}
702
717
703
- fn enum_kind_is_signed ( kind : IKind ) -> bool {
704
- match kind {
705
- IBool => false ,
706
- ISChar => true ,
707
- IUChar => false ,
708
- IShort => true ,
709
- IUShort => false ,
710
- IInt => true ,
711
- IUInt => false ,
712
- ILong => true ,
713
- IULong => false ,
714
- ILongLong => true ,
715
- IULongLong => false ,
716
- }
717
- }
718
-
719
718
fn enum_size_to_rust_type_name ( signed : bool , size : usize ) -> & ' static str {
720
719
match ( signed, size) {
721
720
( true , 1 ) => "i8" ,
@@ -765,20 +764,41 @@ fn cenum_value_to_int_lit(
765
764
}
766
765
}
767
766
768
-
769
- fn cenum_to_rs ( ctx : & mut GenCtx ,
770
- name : String ,
771
- kind : IKind ,
772
- layout : Layout ,
773
- enum_items : & [ EnumItem ] )
774
- -> Vec < P < ast:: Item > > {
767
+ fn cenum_to_rs (
768
+ ctx : & mut GenCtx ,
769
+ rust_enums : bool ,
770
+ name : String ,
771
+ kind : IKind ,
772
+ layout : Layout ,
773
+ enum_items : & [ EnumItem ] )
774
+ -> Vec < P < ast:: Item > > {
775
775
let enum_name = ctx. ext_cx . ident_of ( & name) ;
776
776
let enum_ty = ctx. ext_cx . ty_ident ( ctx. span , enum_name) ;
777
- let enum_is_signed = enum_kind_is_signed ( kind) ;
777
+ let enum_is_signed = kind. is_signed ( ) ;
778
+ let enum_repr = enum_size_to_rust_type_name ( enum_is_signed, layout. size ) ;
779
+ let mut items = vec ! [ ] ;
780
+
781
+ if !rust_enums {
782
+ items. push ( ctx. ext_cx . item_ty (
783
+ ctx. span ,
784
+ enum_name,
785
+ ctx. ext_cx . ty_ident (
786
+ ctx. span ,
787
+ ctx. ext_cx . ident_of ( enum_repr) ) ) ) ;
788
+ for item in enum_items {
789
+ let value = cenum_value_to_int_lit (
790
+ ctx, enum_is_signed, layout. size , item. val ) ;
791
+ items. push ( ctx. ext_cx . item_const (
792
+ ctx. span ,
793
+ ctx. ext_cx . ident_of ( & item. name ) ,
794
+ enum_ty. clone ( ) ,
795
+ value) ) ;
796
+ }
797
+ return items;
798
+ }
778
799
779
800
let mut variants = vec ! [ ] ;
780
801
let mut found_values = HashMap :: new ( ) ;
781
- let mut items = vec ! [ ] ;
782
802
783
803
for item in enum_items {
784
804
let name = ctx. ext_cx . ident_of ( & item. name ) ;
@@ -810,7 +830,7 @@ fn cenum_to_rs(ctx: &mut GenCtx,
810
830
} ) ) ;
811
831
}
812
832
813
- let enum_repr = InternedString :: new ( enum_size_to_rust_type_name ( enum_is_signed , layout . size ) ) ;
833
+ let enum_repr = InternedString :: new ( enum_repr ) ;
814
834
815
835
let repr_arg = ctx. ext_cx . meta_word ( ctx. span , enum_repr) ;
816
836
let repr_list = ctx. ext_cx . meta_list ( ctx. span , InternedString :: new ( "repr" ) , vec ! [ repr_arg] ) ;
0 commit comments