diff options
author | Emilio Cobos Álvarez <emilio@crisal.io> | 2017-06-20 23:07:36 +0200 |
---|---|---|
committer | Emilio Cobos Álvarez <emilio@crisal.io> | 2017-06-20 23:09:56 +0200 |
commit | 9cd4d6f5b97cb79d6daeef0ef9035d9eb617952e (patch) | |
tree | cc530b20036834c1caf1ab3d213c3caa161b0e4a /src | |
parent | a99bbd865e813143a81d29fac8cb46acd5bf6141 (diff) |
codegen: Inline {read,write}_unaligned in order to support rust 1.15.
... Which is what Firefox uses right now.
Diffstat (limited to 'src')
-rw-r--r-- | src/codegen/mod.rs | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 4f0ea371..2d60d0e8 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1286,12 +1286,19 @@ impl<'a> FieldCodegen<'a> for Bitfield { impl XxxIgnored { #[inline] 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::ptr::read_unaligned( - &self.$unit_field_ident as *const _ as *const $unit_field_int_ty + let mut unit_field_val: $unit_field_int_ty = unsafe { + ::$prefix::mem::uninitialized() + }; + + unsafe { + ::$prefix::ptr::copy_nonoverlapping( + &self.$unit_field_ident as *const _ as *const u8, + &mut unit_field_val as *mut $unit_field_int_ty as *mut u8, + ::$prefix::mem::size_of::<$unit_field_int_ty>(), ) }; + + let mask = $mask as $unit_field_int_ty; let val = (unit_field_val & mask) >> $offset; unsafe { ::$prefix::mem::transmute(val as $bitfield_int_ty) @@ -1304,17 +1311,25 @@ 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::ptr::read_unaligned( - &self.$unit_field_ident as *const _ as *const $unit_field_int_ty) + ::$prefix::mem::uninitialized() + }; + + unsafe { + ::$prefix::ptr::copy_nonoverlapping( + &self.$unit_field_ident as *const _ as *const u8, + &mut unit_field_val as *mut $unit_field_int_ty as *mut u8, + ::$prefix::mem::size_of::<$unit_field_int_ty>(), + ) }; unit_field_val &= !mask; unit_field_val |= (val << $offset) & mask; unsafe { - ::$prefix::ptr::write_unaligned( - &mut self.$unit_field_ident as *mut _ as *mut $unit_field_int_ty, - unit_field_val + ::$prefix::ptr::copy_nonoverlapping( + &unit_field_val as *const _ as *const u8, + &mut self.$unit_field_ident as *mut _ as *mut u8, + ::$prefix::mem::size_of::<$unit_field_int_ty>(), ); } } |