about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2014-05-29 06:11:39 -0700
committerbors <bors@rust-lang.org>2014-05-29 06:11:39 -0700
commitbee4e6adac17f87b1cdc26ab69f8c0f5d82575a3 (patch)
tree9b0ef364d66b855094a3a390f7d38095c042f9a9
parentff2bf58e9e0c1e7b154b88fc7ba8c52584e9f768 (diff)
parent2e8bc9924c096cb8f889d3f46ecce7ebe622b964 (diff)
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.
-rw-r--r--src/liballoc/arc.rs3
-rw-r--r--src/libnative/io/file_win32.rs40
-rw-r--r--src/librustuv/file.rs8
3 files changed, 28 insertions, 23 deletions
diff --git a/src/liballoc/arc.rs b/src/liballoc/arc.rs
index a408bf8e284..546e4e52699 100644
--- a/src/liballoc/arc.rs
+++ b/src/liballoc/arc.rs
@@ -160,7 +160,8 @@ impl<T: Send + Share + Clone> Arc<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
     }
 }
 
diff --git a/src/libnative/io/file_win32.rs b/src/libnative/io/file_win32.rs
index c9a48db6920..4f1f3b3ca26 100644
--- a/src/libnative/io/file_win32.rs
+++ b/src/libnative/io/file_win32.rs
@@ -90,6 +90,25 @@ impl FileDesc {
     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 @@ impl rtio::RtioFileStream for FileDesc {
         }
         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> {
diff --git a/src/librustuv/file.rs b/src/librustuv/file.rs
index 12636a3c490..7143f420b08 100644
--- a/src/librustuv/file.rs
+++ b/src/librustuv/file.rs
@@ -377,7 +377,7 @@ impl FileWatcher {
         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 @@ impl rtio::RtioFileStream for FileWatcher {
     }
     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();