@@ -20,7 +20,7 @@ use syntax::attr::mk_attr_id;
2020use syntax:: ptr:: P ;
2121use syntax:: print:: pprust:: tts_to_string;
2222
23- use super :: LinkType ;
23+ use super :: { BindgenOptions , LinkType } ;
2424use types:: * ;
2525
2626struct GenCtx < ' r > {
@@ -115,7 +115,11 @@ fn enum_name(name: &str) -> String {
115115 format ! ( "Enum_{}" , name)
116116}
117117
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 > > {
119123 // Create a dummy ExtCtxt. We only need this for string interning and that uses TLS.
120124 let mut features = Features :: new ( ) ;
121125 features. allow_quote = true ;
@@ -180,8 +184,11 @@ pub fn gen_mod(links: &[(String, LinkType)], globs: Vec<Global>, span: Span) ->
180184 for g in gs. into_iter ( ) {
181185 match g {
182186 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 ) )
185192 } ,
186193 GCompDecl ( ci) => {
187194 {
@@ -214,7 +221,10 @@ pub fn gen_mod(links: &[(String, LinkType)], globs: Vec<Global>, span: Span) ->
214221 e. name = unnamed_name ( & mut ctx, e. name . clone ( ) ) ;
215222 }
216223 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 ) ) ;
218228 } ,
219229 GVar ( vi) => {
220230 let v = vi. borrow ( ) ;
@@ -269,11 +279,11 @@ pub fn gen_mod(links: &[(String, LinkType)], globs: Vec<Global>, span: Span) ->
269279 } ;
270280
271281 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 ) ) ;
273283 }
274284
275285 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) ) ;
277287 }
278288
279289 //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> {
439449 res
440450}
441451
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 > > {
443458 fn mk_item ( ctx : & mut GenCtx , name : String , ty : & Type ) -> P < ast:: Item > {
444459 let rust_name = rust_type_id ( ctx, name) ;
445460 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>
478493 if is_empty {
479494 ei. borrow_mut ( ) . name = name. clone ( ) ;
480495 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 )
482497 } else {
483498 vec ! ( mk_item( ctx, name, ty) )
484499 }
@@ -749,20 +764,41 @@ fn cenum_value_to_int_lit(
749764 }
750765}
751766
752-
753- fn cenum_to_rs ( ctx : & mut GenCtx ,
754- name : String ,
755- kind : IKind ,
756- layout : Layout ,
757- enum_items : & [ EnumItem ] )
758- -> 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 > > {
759775 let enum_name = ctx. ext_cx . ident_of ( & name) ;
760776 let enum_ty = ctx. ext_cx . ty_ident ( ctx. span , enum_name) ;
761777 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+ }
762799
763800 let mut variants = vec ! [ ] ;
764801 let mut found_values = HashMap :: new ( ) ;
765- let mut items = vec ! [ ] ;
766802
767803 for item in enum_items {
768804 let name = ctx. ext_cx . ident_of ( & item. name ) ;
@@ -794,7 +830,7 @@ fn cenum_to_rs(ctx: &mut GenCtx,
794830 } ) ) ;
795831 }
796832
797- let enum_repr = InternedString :: new ( enum_size_to_rust_type_name ( enum_is_signed , layout . size ) ) ;
833+ let enum_repr = InternedString :: new ( enum_repr ) ;
798834
799835 let repr_arg = ctx. ext_cx . meta_word ( ctx. span , enum_repr) ;
800836 let repr_list = ctx. ext_cx . meta_list ( ctx. span , InternedString :: new ( "repr" ) , vec ! [ repr_arg] ) ;
0 commit comments