diff options
author | Emilio Cobos Álvarez <emilio@crisal.io> | 2017-06-18 00:57:41 +0200 |
---|---|---|
committer | Emilio Cobos Álvarez <emilio@crisal.io> | 2017-06-18 02:09:28 +0200 |
commit | 700a3ea249f1f82abe7ed4be98359aff615d13e1 (patch) | |
tree | b678320e07aa6dede425507b4e76226afa532ee6 /src/codegen/mod.rs | |
parent | 02ac99221a4d418c1d7dd3eef1fcda160f3696b1 (diff) |
codegen: Fix bitfield getter/setters so they work with NPOT sizes.
Diffstat (limited to 'src/codegen/mod.rs')
-rw-r--r-- | src/codegen/mod.rs | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 30f527e9..bd5b1f3b 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1288,7 +1288,9 @@ impl<'a> FieldCodegen<'a> for Bitfield { pub fn $getter_name(&self) -> $bitfield_ty { let mask = $mask as $unit_field_int_ty; let unit_field_val: $unit_field_int_ty = unsafe { - ::$prefix::mem::transmute(self.$unit_field_ident) + ::$prefix::ptr::read_unaligned( + &self.$unit_field_ident as *const _ as *const $unit_field_int_ty + ) }; let val = (unit_field_val & mask) >> $offset; unsafe { @@ -1302,14 +1304,19 @@ impl<'a> FieldCodegen<'a> for Bitfield { let val = val as $bitfield_int_ty as $unit_field_int_ty; let mut unit_field_val: $unit_field_int_ty = unsafe { - ::$prefix::mem::transmute(self.$unit_field_ident) + ::$prefix::ptr::read_unaligned( + &self.$unit_field_ident as *const _ as *const $unit_field_int_ty) }; + unit_field_val &= !mask; unit_field_val |= (val << $offset) & mask; - self.$unit_field_ident = unsafe { - ::$prefix::mem::transmute(unit_field_val) - }; + unsafe { + ::$prefix::ptr::write_unaligned( + &mut self.$unit_field_ident as *mut _ as *mut $unit_field_int_ty, + unit_field_val + ); + } } } ).unwrap(); |