From 8b246fda78858e55295ab72bde7ced9af4cbdaf6 Mon Sep 17 00:00:00 2001 From: Huon Wilson Date: Fri, 21 Feb 2014 22:40:53 +1100 Subject: [PATCH] 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. --- src/libgreen/context.rs | 7 ++----- src/libgreen/sched.rs | 15 ++++----------- src/libgreen/task.rs | 2 +- src/libnative/task.rs | 4 ++-- src/librustuv/queue.rs | 2 +- 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::(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>(¤t_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::(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); }