Skip to content

Commit 8b246fd

Browse files
committed
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.
1 parent 06e3e63 commit 8b246fd

File tree

5 files changed

+10
-20
lines changed

5 files changed

+10
-20
lines changed

src/libgreen/context.rs

+2-5
Original file line numberDiff line numberDiff line change
@@ -289,11 +289,8 @@ fn initialize_call_frame(regs: &mut Registers, fptr: InitFn, arg: uint,
289289
}
290290

291291
fn align_down(sp: *mut uint) -> *mut uint {
292-
unsafe {
293-
let sp: uint = transmute(sp);
294-
let sp = sp & !(16 - 1);
295-
transmute::<uint, *mut uint>(sp)
296-
}
292+
let sp = (sp as uint) & !(16 - 1);
293+
sp as *mut uint
297294
}
298295

299296
// ptr::mut_offset is positive ints only

src/libgreen/sched.rs

+4-11
Original file line numberDiff line numberDiff line change
@@ -612,9 +612,7 @@ impl Scheduler {
612612
f: |&mut Scheduler, ~GreenTask|) -> ~GreenTask {
613613
let f_opaque = ClosureConverter::from_fn(f);
614614

615-
let current_task_dupe = unsafe {
616-
*cast::transmute::<&~GreenTask, &uint>(&current_task)
617-
};
615+
let current_task_dupe = &*current_task as *GreenTask;
618616

619617
// The current task is placed inside an enum with the cleanup
620618
// function. This enum is then placed inside the scheduler.
@@ -633,13 +631,8 @@ impl Scheduler {
633631
cast::transmute_mut_region(*next_task.sched.get_mut_ref());
634632

635633
let current_task: &mut GreenTask = match sched.cleanup_job {
636-
Some(CleanupJob { task: ref task, .. }) => {
637-
let task_ptr: *~GreenTask = task;
638-
cast::transmute_mut_region(*cast::transmute_mut_unsafe(task_ptr))
639-
}
640-
None => {
641-
rtabort!("no cleanup job");
642-
}
634+
Some(CleanupJob { task: ref mut task, .. }) => &mut **task,
635+
None => rtabort!("no cleanup job")
643636
};
644637

645638
let (current_task_context, next_task_context) =
@@ -852,7 +845,7 @@ impl Scheduler {
852845

853846
// * Utility Functions
854847

855-
pub fn sched_id(&self) -> uint { unsafe { cast::transmute(self) } }
848+
pub fn sched_id(&self) -> uint { self as *Scheduler as uint }
856849

857850
pub fn run_cleanup_job(&mut self) {
858851
let cleanup_job = self.cleanup_job.take_unwrap();

src/libgreen/task.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ impl GreenTask {
266266
// context switches
267267

268268
pub fn as_uint(&self) -> uint {
269-
unsafe { cast::transmute(self) }
269+
self as *GreenTask as uint
270270
}
271271

272272
pub unsafe fn from_uint(val: uint) -> ~GreenTask { cast::transmute(val) }

src/libnative/task.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ impl rt::Runtime for Ops {
186186
cur_task.put_runtime(self as ~rt::Runtime);
187187

188188
unsafe {
189-
let cur_task_dupe = *cast::transmute::<&~Task, &uint>(&cur_task);
189+
let cur_task_dupe = &*cur_task as *Task;
190190
let task = BlockedTask::block(cur_task);
191191

192192
if times == 1 {
@@ -218,7 +218,7 @@ impl rt::Runtime for Ops {
218218
}
219219
}
220220
// re-acquire ownership of the task
221-
cur_task = cast::transmute::<uint, ~Task>(cur_task_dupe);
221+
cur_task = cast::transmute(cur_task_dupe);
222222
}
223223

224224
// put the task back in TLS, and everything is as it once was.

src/librustuv/queue.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ impl QueuePool {
123123
unsafe {
124124
assert_eq!(uvll::uv_async_init(loop_.handle, handle, async_cb), 0);
125125
uvll::uv_unref(handle);
126-
let data: *c_void = *cast::transmute::<&~QueuePool, &*c_void>(&q);
126+
let data = &*q as *QueuePool as *c_void;
127127
uvll::set_data_for_uv_handle(handle, data);
128128
}
129129

0 commit comments

Comments
 (0)