about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2012-08-02 16:00:45 -0700
committerNiko Matsakis <niko@alum.mit.edu>2012-08-02 22:36:36 -0700
commit31c5cec55bd8b43e6082f79dff888f52b585621d (patch)
tree22a99047877c7f42f141f0afeaa1641daf06ec01 /src/libstd
parentc2bb2f08372ad6e688ea0b7915d003cd4053cfec (diff)
Purge placement new; Make borrowck know about unary move.
cc #3071
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/arena.rs17
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);
         }
     }
 }