Skip to content

Fix bitfield generation bug with const function #718

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 24, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 4 additions & 7 deletions src/codegen/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1106,19 +1106,16 @@ impl Bitfield {
quote_tokens!(ctx.ext_cx(), pub fn)
};

// Don't use variables or blocks because const function does not allow them.
quote_item!(
ctx.ext_cx(),
impl XxxUnused {
#[inline]
$fn_prefix $ctor_name($params $param_name : $bitfield_ty)
-> $unit_field_int_ty {
let bitfield_unit_val = $body;
let $param_name = $param_name
as $bitfield_int_ty
as $unit_field_int_ty;
let mask = $mask as $unit_field_int_ty;
let $param_name = ($param_name << $offset) & mask;
bitfield_unit_val | $param_name
($body |
(($param_name as $bitfield_int_ty as $unit_field_int_ty) << $offset) &
($mask as $unit_field_int_ty))
}
}
).unwrap()
Expand Down
9 changes: 3 additions & 6 deletions tests/expectations/tests/bitfield-method-same-name.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,9 @@ impl Foo {
#[inline]
pub fn new_bitfield_1(type__bindgen_bitfield: ::std::os::raw::c_char)
-> u8 {
let bitfield_unit_val = { 0 };
let type__bindgen_bitfield = type__bindgen_bitfield as u8 as u8;
let mask = 7usize as u8;
let type__bindgen_bitfield =
(type__bindgen_bitfield << 0usize) & mask;
bitfield_unit_val | type__bindgen_bitfield
({ 0 } |
((type__bindgen_bitfield as u8 as u8) << 0usize) &
(7usize as u8))
}
#[inline]
pub unsafe fn type_(&mut self) -> ::std::os::raw::c_char {
Expand Down
241 changes: 53 additions & 188 deletions tests/expectations/tests/bitfield_align.rs
Original file line number Diff line number Diff line change
Expand Up @@ -222,122 +222,39 @@ impl A {
b8: ::std::os::raw::c_uint,
b9: ::std::os::raw::c_uint,
b10: ::std::os::raw::c_uint) -> u16 {
let bitfield_unit_val =
{
let bitfield_unit_val =
{
let bitfield_unit_val =
{
let bitfield_unit_val =
{
let bitfield_unit_val =
{
let bitfield_unit_val =
{
let bitfield_unit_val =
{
let bitfield_unit_val =
{
let bitfield_unit_val =
{
let bitfield_unit_val =
{
0
};
let b1 =
b1
as
u32
as
u16;
let mask =
1usize
as
u16;
let b1 =
(b1
<<
0usize)
&
mask;
bitfield_unit_val
|
b1
};
let b2 =
b2
as
u32
as
u16;
let mask =
2usize
as
u16;
let b2 =
(b2
<<
1usize)
&
mask;
bitfield_unit_val
|
b2
};
let b3 =
b3 as u32
as
u16;
let mask =
4usize as
u16;
let b3 =
(b3 <<
2usize)
&
mask;
bitfield_unit_val
| b3
};
let b4 =
b4 as u32 as u16;
let mask =
8usize as u16;
let b4 =
(b4 << 3usize) &
mask;
bitfield_unit_val | b4
};
let b5 = b5 as u32 as u16;
let mask = 16usize as u16;
let b5 =
(b5 << 4usize) & mask;
bitfield_unit_val | b5
};
let b6 = b6 as u32 as u16;
let mask = 32usize as u16;
let b6 = (b6 << 5usize) & mask;
bitfield_unit_val | b6
};
let b7 = b7 as u32 as u16;
let mask = 64usize as u16;
let b7 = (b7 << 6usize) & mask;
bitfield_unit_val | b7
};
let b8 = b8 as u32 as u16;
let mask = 128usize as u16;
let b8 = (b8 << 7usize) & mask;
bitfield_unit_val | b8
};
let b9 = b9 as u32 as u16;
let mask = 256usize as u16;
let b9 = (b9 << 8usize) & mask;
bitfield_unit_val | b9
};
let b10 = b10 as u32 as u16;
let mask = 512usize as u16;
let b10 = (b10 << 9usize) & mask;
bitfield_unit_val | b10
({
({
({
({
({
({
({
({
({
({ 0 } |
((b1 as u32 as u16)
<< 0usize) &
(1usize as u16))
} |
((b2 as u32 as u16) <<
1usize) &
(2usize as u16))
} |
((b3 as u32 as u16) << 2usize)
& (4usize as u16))
} |
((b4 as u32 as u16) << 3usize) &
(8usize as u16))
} |
((b5 as u32 as u16) << 4usize) &
(16usize as u16))
} |
((b6 as u32 as u16) << 5usize) &
(32usize as u16))
} | ((b7 as u32 as u16) << 6usize) & (64usize as u16))
} | ((b8 as u32 as u16) << 7usize) & (128usize as u16))
} | ((b9 as u32 as u16) << 8usize) & (256usize as u16))
} | ((b10 as u32 as u16) << 9usize) & (512usize as u16))
}
}
#[repr(C)]
Expand Down Expand Up @@ -396,18 +313,10 @@ impl B {
#[inline]
pub fn new_bitfield_1(foo: ::std::os::raw::c_uint,
bar: ::std::os::raw::c_uchar) -> u32 {
let bitfield_unit_val =
{
let bitfield_unit_val = { 0 };
let foo = foo as u32 as u32;
let mask = 2147483647usize as u32;
let foo = (foo << 0usize) & mask;
bitfield_unit_val | foo
};
let bar = bar as u8 as u32;
let mask = 2147483648usize as u32;
let bar = (bar << 31usize) & mask;
bitfield_unit_val | bar
({
({ 0 } |
((foo as u32 as u32) << 0usize) & (2147483647usize as u32))
} | ((bar as u8 as u32) << 31usize) & (2147483648usize as u32))
}
}
#[repr(C)]
Expand Down Expand Up @@ -476,18 +385,8 @@ impl C {
#[inline]
pub fn new_bitfield_1(b1: ::std::os::raw::c_uint,
b2: ::std::os::raw::c_uint) -> u8 {
let bitfield_unit_val =
{
let bitfield_unit_val = { 0 };
let b1 = b1 as u32 as u8;
let mask = 1usize as u8;
let b1 = (b1 << 0usize) & mask;
bitfield_unit_val | b1
};
let b2 = b2 as u32 as u8;
let mask = 2usize as u8;
let b2 = (b2 << 1usize) & mask;
bitfield_unit_val | b2
({ ({ 0 } | ((b1 as u32 as u8) << 0usize) & (1usize as u8)) } |
((b2 as u32 as u8) << 1usize) & (2usize as u8))
}
}
#[repr(C)]
Expand Down Expand Up @@ -567,25 +466,12 @@ impl Date1 {
pub fn new_bitfield_1(nWeekDay: ::std::os::raw::c_ushort,
nMonthDay: ::std::os::raw::c_ushort,
nMonth: ::std::os::raw::c_ushort) -> u16 {
let bitfield_unit_val =
{
let bitfield_unit_val =
{
let bitfield_unit_val = { 0 };
let nWeekDay = nWeekDay as u16 as u16;
let mask = 7usize as u16;
let nWeekDay = (nWeekDay << 0usize) & mask;
bitfield_unit_val | nWeekDay
};
let nMonthDay = nMonthDay as u16 as u16;
let mask = 504usize as u16;
let nMonthDay = (nMonthDay << 3usize) & mask;
bitfield_unit_val | nMonthDay
};
let nMonth = nMonth as u16 as u16;
let mask = 15872usize as u16;
let nMonth = (nMonth << 9usize) & mask;
bitfield_unit_val | nMonth
({
({
({ 0 } |
((nWeekDay as u16 as u16) << 0usize) & (7usize as u16))
} | ((nMonthDay as u16 as u16) << 3usize) & (504usize as u16))
} | ((nMonth as u16 as u16) << 9usize) & (15872usize as u16))
}
#[inline]
pub fn nYear(&self) -> ::std::os::raw::c_ushort {
Expand All @@ -607,11 +493,7 @@ impl Date1 {
}
#[inline]
pub fn new_bitfield_2(nYear: ::std::os::raw::c_ushort) -> u8 {
let bitfield_unit_val = { 0 };
let nYear = nYear as u16 as u8;
let mask = 255usize as u8;
let nYear = (nYear << 0usize) & mask;
bitfield_unit_val | nYear
({ 0 } | ((nYear as u16 as u8) << 0usize) & (255usize as u8))
}
}
#[repr(C)]
Expand Down Expand Up @@ -696,25 +578,12 @@ impl Date2 {
pub fn new_bitfield_1(nWeekDay: ::std::os::raw::c_ushort,
nMonthDay: ::std::os::raw::c_ushort,
nMonth: ::std::os::raw::c_ushort) -> u16 {
let bitfield_unit_val =
{
let bitfield_unit_val =
{
let bitfield_unit_val = { 0 };
let nWeekDay = nWeekDay as u16 as u16;
let mask = 7usize as u16;
let nWeekDay = (nWeekDay << 0usize) & mask;
bitfield_unit_val | nWeekDay
};
let nMonthDay = nMonthDay as u16 as u16;
let mask = 504usize as u16;
let nMonthDay = (nMonthDay << 3usize) & mask;
bitfield_unit_val | nMonthDay
};
let nMonth = nMonth as u16 as u16;
let mask = 15872usize as u16;
let nMonth = (nMonth << 9usize) & mask;
bitfield_unit_val | nMonth
({
({
({ 0 } |
((nWeekDay as u16 as u16) << 0usize) & (7usize as u16))
} | ((nMonthDay as u16 as u16) << 3usize) & (504usize as u16))
} | ((nMonth as u16 as u16) << 9usize) & (15872usize as u16))
}
#[inline]
pub fn nYear(&self) -> ::std::os::raw::c_ushort {
Expand All @@ -736,10 +605,6 @@ impl Date2 {
}
#[inline]
pub fn new_bitfield_2(nYear: ::std::os::raw::c_ushort) -> u8 {
let bitfield_unit_val = { 0 };
let nYear = nYear as u16 as u8;
let mask = 255usize as u8;
let nYear = (nYear << 0usize) & mask;
bitfield_unit_val | nYear
({ 0 } | ((nYear as u16 as u8) << 0usize) & (255usize as u8))
}
}
16 changes: 4 additions & 12 deletions tests/expectations/tests/bitfield_method_mangling.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,17 +63,9 @@ impl mach_msg_type_descriptor_t {
#[inline]
pub fn new_bitfield_1(pad3: ::std::os::raw::c_uint,
type_: ::std::os::raw::c_uint) -> u32 {
let bitfield_unit_val =
{
let bitfield_unit_val = { 0 };
let pad3 = pad3 as u32 as u32;
let mask = 16777215usize as u32;
let pad3 = (pad3 << 0usize) & mask;
bitfield_unit_val | pad3
};
let type_ = type_ as u32 as u32;
let mask = 4278190080usize as u32;
let type_ = (type_ << 24usize) & mask;
bitfield_unit_val | type_
({
({ 0 } |
((pad3 as u32 as u32) << 0usize) & (16777215usize as u32))
} | ((type_ as u32 as u32) << 24usize) & (4278190080usize as u32))
}
}
19 changes: 7 additions & 12 deletions tests/expectations/tests/jsval_layout_opaque.rs
Original file line number Diff line number Diff line change
Expand Up @@ -168,18 +168,13 @@ impl jsval_layout__bindgen_ty_1 {
}
#[inline]
pub fn new_bitfield_1(payload47: u64, tag: JSValueTag) -> u64 {
let bitfield_unit_val =
{
let bitfield_unit_val = { 0 };
let payload47 = payload47 as u64 as u64;
let mask = 140737488355327usize as u64;
let payload47 = (payload47 << 0usize) & mask;
bitfield_unit_val | payload47
};
let tag = tag as u32 as u64;
let mask = 18446603336221196288usize as u64;
let tag = (tag << 47usize) & mask;
bitfield_unit_val | tag
({
({ 0 } |
((payload47 as u64 as u64) << 0usize) &
(140737488355327usize as u64))
} |
((tag as u32 as u64) << 47usize) &
(18446603336221196288usize as u64))
}
}
#[repr(C)]
Expand Down
Loading