1
Fork 0

Add a demoded version of ptr::addr_of

Currently, the new version is ptr::p2::addr_of and the old one is
ptr::addr_of. This is kind of cheesy, but I need a snapshot before I
can ditch the old version, since the pipe compiler generates calls to
addr_of.

core is converted over to use the new version, std is not.
This commit is contained in:
Tim Chevalier 2012-09-28 21:51:14 -07:00
parent f1014c43fd
commit 3639d38d5c
23 changed files with 110 additions and 94 deletions

View file

@ -66,7 +66,7 @@ use rt::rust_task;
use rt::rust_closure;
macro_rules! move_it (
{ $x:expr } => { unsafe { let y <- *ptr::addr_of($x); move y } }
{ $x:expr } => { unsafe { let y <- *ptr::p2::addr_of(&($x)); move y } }
)
type TaskSet = send_map::linear::LinearMap<*rust_task,()>;
@ -511,7 +511,14 @@ fn spawn_raw(+opts: TaskOpts, +f: fn~()) {
let child_wrapper = make_child_wrapper(new_task, move child_tg,
move ancestors, is_main, move notify_chan, move f);
let fptr = ptr::addr_of(child_wrapper);
/*
Truly awful, but otherwise the borrow checker complains about
the move in the last line of this block, for reasons I can't
understand. -- tjc
*/
let tmp: u64 = cast::reinterpret_cast(&(&child_wrapper));
let whatever: &~fn() = cast::reinterpret_cast(&tmp);
let fptr = ptr::p2::addr_of(whatever);
let closure: *rust_closure = cast::reinterpret_cast(&fptr);
// Getting killed between these two calls would free the child's