Skip to content

Commit

Permalink
options: Add an opt-in to recover the size_t behavior removed in 5d38f2a
Browse files Browse the repository at this point in the history
.
  • Loading branch information
emilio committed Feb 3, 2020
1 parent 1d86a83 commit f96dcf9
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 0 deletions.
6 changes: 6 additions & 0 deletions src/codegen/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4126,8 +4126,14 @@ mod utils {
"int64_t" => primitive_ty(ctx, "i64"),
"uint64_t" => primitive_ty(ctx, "u64"),

"size_t" if ctx.options().size_t_is_usize => {
primitive_ty(ctx, "usize")
}
"uintptr_t" => primitive_ty(ctx, "usize"),

"ssize_t" if ctx.options().size_t_is_usize => {
primitive_ty(ctx, "isize")
}
"intptr_t" | "ptrdiff_t" => primitive_ty(ctx, "isize"),
_ => return None,
})
Expand Down
14 changes: 14 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -604,6 +604,10 @@ impl Builder {
output_vector.push("--no-record-matches".into());
}

if self.options.size_t_is_usize {
output_vector.push("--size_t-is-usize".into());
}

if !self.options.rustfmt_bindings {
output_vector.push("--no-rustfmt-bindings".into());
}
Expand Down Expand Up @@ -1350,6 +1354,12 @@ impl Builder {
self
}

/// Set whether `size_t` should be translated to `usize` automatically.
pub fn size_t_is_usize(mut self, is: bool) -> Self {
self.options.size_t_is_usize = is;
self
}

/// Set whether rustfmt should format the generated bindings.
pub fn rustfmt_bindings(mut self, doit: bool) -> Self {
self.options.rustfmt_bindings = doit;
Expand Down Expand Up @@ -1776,6 +1786,9 @@ struct BindgenOptions {
/// items via the `error!` log.
record_matches: bool,

/// Whether `size_t` should be translated to `usize` automatically.
size_t_is_usize: bool,

/// Whether rustfmt should format the generated bindings.
rustfmt_bindings: bool,

Expand Down Expand Up @@ -1917,6 +1930,7 @@ impl Default for BindgenOptions {
time_phases: false,
record_matches: true,
rustfmt_bindings: true,
size_t_is_usize: false,
rustfmt_configuration_file: None,
no_partialeq_types: Default::default(),
no_copy_types: Default::default(),
Expand Down
7 changes: 7 additions & 0 deletions src/options.rs
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,9 @@ where
"Do not record matching items in the regex sets. \
This disables reporting of unused items.",
),
Arg::with_name("size_t-is-usize")
.long("size_t-is-usize")
.help("Translate size_t to usize."),
Arg::with_name("no-rustfmt-bindings")
.long("no-rustfmt-bindings")
.help("Do not format the generated bindings with rustfmt."),
Expand Down Expand Up @@ -763,6 +766,10 @@ where
builder = builder.record_matches(false);
}

if matches.is_present("size_t-is-usize") {
builder = builder.size_t_is_usize(true);
}

let no_rustfmt_bindings = matches.is_present("no-rustfmt-bindings");
if no_rustfmt_bindings {
builder = builder.rustfmt_bindings(false);
Expand Down
49 changes: 49 additions & 0 deletions tests/expectations/tests/size_t_is_usize.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/* automatically generated by rust-bindgen */

#![allow(
dead_code,
non_snake_case,
non_camel_case_types,
non_upper_case_globals
)]

#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct A {
pub len: usize,
pub offset: isize,
pub next: *mut A,
}
#[test]
fn bindgen_test_layout_A() {
assert_eq!(
::std::mem::size_of::<A>(),
24usize,
concat!("Size of: ", stringify!(A))
);
assert_eq!(
::std::mem::align_of::<A>(),
8usize,
concat!("Alignment of ", stringify!(A))
);
assert_eq!(
unsafe { &(*(::std::ptr::null::<A>())).len as *const _ as usize },
0usize,
concat!("Offset of field: ", stringify!(A), "::", stringify!(len))
);
assert_eq!(
unsafe { &(*(::std::ptr::null::<A>())).offset as *const _ as usize },
8usize,
concat!("Offset of field: ", stringify!(A), "::", stringify!(offset))
);
assert_eq!(
unsafe { &(*(::std::ptr::null::<A>())).next as *const _ as usize },
16usize,
concat!("Offset of field: ", stringify!(A), "::", stringify!(next))
);
}
impl Default for A {
fn default() -> Self {
unsafe { ::std::mem::zeroed() }
}
}
10 changes: 10 additions & 0 deletions tests/headers/size_t_is_usize.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// bindgen-flags: --size_t-is-usize

typedef unsigned long size_t;
typedef long ssize_t;

struct A {
size_t len;
ssize_t offset;
struct A* next;
};

0 comments on commit f96dcf9

Please sign in to comment.