Skip to content

Commit

Permalink
Allow enum's to be repr(C) or repr(i32,i16,i8)
Browse files Browse the repository at this point in the history
  • Loading branch information
eqrion committed Sep 27, 2017
1 parent e0ec983 commit 9ff9ab1
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 13 deletions.
36 changes: 23 additions & 13 deletions src/bindgen/ir/enumeration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,14 @@ impl Enum {
{
let repr = Repr::load(attrs);

if repr != Repr::U32 &&
if repr != Repr::C &&
repr != Repr::U32 &&
repr != Repr::U16 &&
repr != Repr::U8 {
return if repr == Repr::C {
Err(format!("repr(C) is not FFI safe for enums"))
} else {
Err(format!("enum not marked with a repr(u32) or repr(u16) or repr(u8)"))
};
repr != Repr::U8 &&
repr != Repr::I32 &&
repr != Repr::I16 &&
repr != Repr::I8 {
return Err(format!("enum not marked with a valid repr(prim) or repr(C)"));
}

let mut values = Vec::new();
Expand Down Expand Up @@ -117,16 +117,24 @@ impl Source for Enum {
self.documentation.write(config, out);

let size = match self.repr {
Repr::U32 => "uint32_t",
Repr::U16 => "uint16_t",
Repr::U8 => "uint8_t",
Repr::C => None,
Repr::U32 => Some("uint32_t"),
Repr::U16 => Some("uint16_t"),
Repr::U8 => Some("uint8_t"),
Repr::I32 => Some("int32_t"),
Repr::I16 => Some("int16_t"),
Repr::I8 => Some("int8_t"),
_ => unreachable!(),
};

if config.language == Language::C {
out.write(&format!("enum {}", self.name));
} else {
out.write(&format!("enum class {} : {}", self.name, size));
if let Some(prim) = size {
out.write(&format!("enum class {} : {}", self.name, prim));
} else {
out.write(&format!("enum class {}", self.name));
}
}
out.open_brace();
for (i, value) in self.values.iter().enumerate() {
Expand All @@ -144,8 +152,10 @@ impl Source for Enum {
out.close_brace(true);

if config.language == Language::C {
out.new_line();
out.write(&format!("typedef {} {};", size, self.name));
if let Some(prim) = size {
out.new_line();
out.write(&format!("typedef {} {};", prim, self.name));
}
}

self.cfg.write_after(config, out);
Expand Down
24 changes: 24 additions & 0 deletions src/bindgen/ir/repr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ pub enum Repr {
U8,
U16,
U32,
I8,
I16,
I32,
}

impl Repr {
Expand All @@ -23,6 +26,12 @@ impl Repr {
Repr::U16
} else if Repr::has_attr(Repr::repr_u8(), attrs) {
Repr::U8
} else if Repr::has_attr(Repr::repr_i32(), attrs) {
Repr::I32
} else if Repr::has_attr(Repr::repr_i16(), attrs) {
Repr::I16
} else if Repr::has_attr(Repr::repr_i8(), attrs) {
Repr::I8
} else {
Repr::None
}
Expand Down Expand Up @@ -51,4 +60,19 @@ impl Repr {
syn::MetaItem::List(syn::Ident::new("repr"),
vec![syn::NestedMetaItem::MetaItem(syn::MetaItem::Word(syn::Ident::new("u8")))])
}

fn repr_i32() -> syn::MetaItem {
syn::MetaItem::List(syn::Ident::new("repr"),
vec![syn::NestedMetaItem::MetaItem(syn::MetaItem::Word(syn::Ident::new("i32")))])
}

fn repr_i16() -> syn::MetaItem {
syn::MetaItem::List(syn::Ident::new("repr"),
vec![syn::NestedMetaItem::MetaItem(syn::MetaItem::Word(syn::Ident::new("i16")))])
}

fn repr_i8() -> syn::MetaItem {
syn::MetaItem::List(syn::Ident::new("repr"),
vec![syn::NestedMetaItem::MetaItem(syn::MetaItem::Word(syn::Ident::new("i8")))])
}
}

0 comments on commit 9ff9ab1

Please sign in to comment.