提交 bee4e6ad 编写于 作者: B bors

auto merge of #14487 : arielb1/rust/fix-13933, r=alexcrichton

Fix issue #13933 in a few files. A more complete fix would require core::raw::MutSlice.
......@@ -160,7 +160,8 @@ pub fn make_unique<'a>(&'a mut self) -> &'a mut T {
// reference count is guaranteed to be 1 at this point, and we required
// the Arc itself to be `mut`, so we're returning the only possible
// reference to the inner data.
unsafe { mem::transmute::<&_, &mut _>(self.deref()) }
let inner = unsafe { &mut *self._ptr };
&mut inner.data
}
}
......
......@@ -90,6 +90,25 @@ pub fn fd(&self) -> fd_t { self.inner.fd }
pub fn handle(&self) -> libc::HANDLE {
unsafe { libc::get_osfhandle(self.fd()) as libc::HANDLE }
}
// A version of seek that takes &self so that tell can call it
// - the private seek should of course take &mut self.
fn seek_common(&self, pos: i64, style: io::SeekStyle) -> Result<u64, IoError> {
let whence = match style {
io::SeekSet => libc::FILE_BEGIN,
io::SeekEnd => libc::FILE_END,
io::SeekCur => libc::FILE_CURRENT,
};
unsafe {
let mut newpos = 0;
match libc::SetFilePointerEx(self.handle(), pos, &mut newpos,
whence) {
0 => Err(super::last_error()),
_ => Ok(newpos as u64),
}
}
}
}
impl io::Reader for FileDesc {
......@@ -151,26 +170,13 @@ fn pwrite(&mut self, buf: &[u8], mut offset: u64) -> Result<(), IoError> {
}
Ok(())
}
fn seek(&mut self, pos: i64, style: io::SeekStyle) -> Result<u64, IoError> {
let whence = match style {
io::SeekSet => libc::FILE_BEGIN,
io::SeekEnd => libc::FILE_END,
io::SeekCur => libc::FILE_CURRENT,
};
unsafe {
let mut newpos = 0;
match libc::SetFilePointerEx(self.handle(), pos, &mut newpos,
whence) {
0 => Err(super::last_error()),
_ => Ok(newpos as u64),
}
}
self.seek_common(pos, style)
}
fn tell(&self) -> Result<u64, IoError> {
// This transmute is fine because our seek implementation doesn't
// actually use the mutable self at all.
// FIXME #13933: Remove/justify all `&T` to `&mut T` transmutes
unsafe { mem::transmute::<&_, &mut FileDesc>(self).seek(0, io::SeekCur) }
self.seek_common(0, io::SeekCur)
}
fn fsync(&mut self) -> Result<(), IoError> {
......
......@@ -377,7 +377,7 @@ fn base_write(&mut self, buf: &[u8], offset: i64) -> Result<(), IoError> {
let r = FsRequest::write(&self.loop_, self.fd, buf, offset);
r.map_err(uv_error_to_io_error)
}
fn seek_common(&mut self, pos: i64, whence: c_int) ->
fn seek_common(&self, pos: i64, whence: c_int) ->
Result<u64, IoError>{
unsafe {
match libc::lseek(self.fd, pos as libc::off_t, whence) {
......@@ -446,10 +446,8 @@ fn seek(&mut self, pos: i64, whence: io::SeekStyle) -> Result<u64, IoError> {
}
fn tell(&self) -> Result<u64, IoError> {
use libc::SEEK_CUR;
// this is temporary
// FIXME #13933: Remove/justify all `&T` to `&mut T` transmutes
let self_ = unsafe { mem::transmute::<&_, &mut FileWatcher>(self) };
self_.seek_common(0, SEEK_CUR)
self.seek_common(0, SEEK_CUR)
}
fn fsync(&mut self) -> Result<(), IoError> {
let _m = self.fire_homing_missile();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册