diff options
| author | Niko Matsakis <niko@alum.mit.edu> | 2012-08-02 16:00:45 -0700 |
|---|---|---|
| committer | Niko Matsakis <niko@alum.mit.edu> | 2012-08-02 22:36:36 -0700 |
| commit | 31c5cec55bd8b43e6082f79dff888f52b585621d (patch) | |
| tree | 22a99047877c7f42f141f0afeaa1641daf06ec01 /src/libstd | |
| parent | c2bb2f08372ad6e688ea0b7915d003cd4053cfec (diff) | |
Purge placement new; Make borrowck know about unary move.
cc #3071
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/arena.rs | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/libstd/arena.rs b/src/libstd/arena.rs index b9bc977db31..84675d9569a 100644 --- a/src/libstd/arena.rs +++ b/src/libstd/arena.rs @@ -4,6 +4,7 @@ export arena, arena_with_size; import list; import list::{list, cons, nil}; +import unsafe::reinterpret_cast; type chunk = {data: ~[u8], mut fill: uint}; @@ -27,7 +28,12 @@ fn arena() -> arena { arena_with_size(32u) } -impl arena for arena { +#[abi = "rust-intrinsic"] +extern mod rusti { + fn move_val_init<T>(&dst: T, -src: T); +} + +impl &arena { fn alloc_grow(n_bytes: uint, align: uint) -> *() { // Allocate a new chunk. let mut head = list::head(self.chunks); @@ -59,10 +65,13 @@ impl arena for arena { } #[inline(always)] - fn alloc(tydesc: *()) -> *() { + fn alloc<T>(op: fn() -> T) -> &self/T { unsafe { - let tydesc = tydesc as *sys::type_desc; - self.alloc_inner((*tydesc).size, (*tydesc).align) + let tydesc = sys::get_type_desc::<T>(); + let ptr = self.alloc_inner((*tydesc).size, (*tydesc).align); + let ptr: *mut T = reinterpret_cast(ptr); + rusti::move_val_init(*ptr, op()); + return reinterpret_cast(ptr); } } } |
