about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorHuon Wilson <dbau.pp+github@gmail.com>2014-02-21 22:40:53 +1100
committerHuon Wilson <dbau.pp+github@gmail.com>2014-02-24 01:15:39 +1100
commit8b246fda78858e55295ab72bde7ced9af4cbdaf6 (patch)
tree3af1881f7f980361f5650d23a3e66418e519b421 /src
parent06e3e63c9046c160a00122990f31b82dd729a4a3 (diff)
downloadrust-8b246fda78858e55295ab72bde7ced9af4cbdaf6.tar.gz
rust-8b246fda78858e55295ab72bde7ced9af4cbdaf6.zip
green,native,rustuv: Replace many pointer `transmute`'s with `as` or referencing.
These can all be written in a more controlled manner than with the
transmute hammer, leading to (hopefully) safer code.
Diffstat (limited to 'src')
-rw-r--r--src/libgreen/context.rs7
-rw-r--r--src/libgreen/sched.rs15
-rw-r--r--src/libgreen/task.rs2
-rw-r--r--src/libnative/task.rs4
-rw-r--r--src/librustuv/queue.rs2
5 files changed, 10 insertions, 20 deletions
diff --git a/src/libgreen/context.rs b/src/libgreen/context.rs
index ff9080d1039..779fb6815b7 100644
--- a/src/libgreen/context.rs
+++ b/src/libgreen/context.rs
@@ -289,11 +289,8 @@ fn initialize_call_frame(regs: &mut Registers, fptr: InitFn, arg: uint,
 }
 
 fn align_down(sp: *mut uint) -> *mut uint {
-    unsafe {
-        let sp: uint = transmute(sp);
-        let sp = sp & !(16 - 1);
-        transmute::<uint, *mut uint>(sp)
-    }
+    let sp = (sp as uint) & !(16 - 1);
+    sp as *mut uint
 }
 
 // ptr::mut_offset is positive ints only
diff --git a/src/libgreen/sched.rs b/src/libgreen/sched.rs
index f722744e23d..c6db989d036 100644
--- a/src/libgreen/sched.rs
+++ b/src/libgreen/sched.rs
@@ -612,9 +612,7 @@ impl Scheduler {
                                f: |&mut Scheduler, ~GreenTask|) -> ~GreenTask {
         let f_opaque = ClosureConverter::from_fn(f);
 
-        let current_task_dupe = unsafe {
-            *cast::transmute::<&~GreenTask, &uint>(&current_task)
-        };
+        let current_task_dupe = &*current_task as *GreenTask;
 
         // The current task is placed inside an enum with the cleanup
         // function. This enum is then placed inside the scheduler.
@@ -633,13 +631,8 @@ impl Scheduler {
                 cast::transmute_mut_region(*next_task.sched.get_mut_ref());
 
             let current_task: &mut GreenTask = match sched.cleanup_job {
-                Some(CleanupJob { task: ref task, .. }) => {
-                    let task_ptr: *~GreenTask = task;
-                    cast::transmute_mut_region(*cast::transmute_mut_unsafe(task_ptr))
-                }
-                None => {
-                    rtabort!("no cleanup job");
-                }
+                Some(CleanupJob { task: ref mut task, .. }) => &mut **task,
+                None => rtabort!("no cleanup job")
             };
 
             let (current_task_context, next_task_context) =
@@ -852,7 +845,7 @@ impl Scheduler {
 
     // * Utility Functions
 
-    pub fn sched_id(&self) -> uint { unsafe { cast::transmute(self) } }
+    pub fn sched_id(&self) -> uint { self as *Scheduler as uint }
 
     pub fn run_cleanup_job(&mut self) {
         let cleanup_job = self.cleanup_job.take_unwrap();
diff --git a/src/libgreen/task.rs b/src/libgreen/task.rs
index 1d7fb64896f..bf0ea14ca87 100644
--- a/src/libgreen/task.rs
+++ b/src/libgreen/task.rs
@@ -266,7 +266,7 @@ impl GreenTask {
     // context switches
 
     pub fn as_uint(&self) -> uint {
-        unsafe { cast::transmute(self) }
+        self as *GreenTask as uint
     }
 
     pub unsafe fn from_uint(val: uint) -> ~GreenTask { cast::transmute(val) }
diff --git a/src/libnative/task.rs b/src/libnative/task.rs
index ccfc040e7df..5682697ebfc 100644
--- a/src/libnative/task.rs
+++ b/src/libnative/task.rs
@@ -186,7 +186,7 @@ impl rt::Runtime for Ops {
         cur_task.put_runtime(self as ~rt::Runtime);
 
         unsafe {
-            let cur_task_dupe = *cast::transmute::<&~Task, &uint>(&cur_task);
+            let cur_task_dupe = &*cur_task as *Task;
             let task = BlockedTask::block(cur_task);
 
             if times == 1 {
@@ -218,7 +218,7 @@ impl rt::Runtime for Ops {
                 }
             }
             // re-acquire ownership of the task
-            cur_task = cast::transmute::<uint, ~Task>(cur_task_dupe);
+            cur_task = cast::transmute(cur_task_dupe);
         }
 
         // put the task back in TLS, and everything is as it once was.
diff --git a/src/librustuv/queue.rs b/src/librustuv/queue.rs
index da502ca72de..e998b5ca20b 100644
--- a/src/librustuv/queue.rs
+++ b/src/librustuv/queue.rs
@@ -123,7 +123,7 @@ impl QueuePool {
         unsafe {
             assert_eq!(uvll::uv_async_init(loop_.handle, handle, async_cb), 0);
             uvll::uv_unref(handle);
-            let data: *c_void = *cast::transmute::<&~QueuePool, &*c_void>(&q);
+            let data = &*q as *QueuePool as *c_void;
             uvll::set_data_for_uv_handle(handle, data);
         }