about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEric Holk <eric.holk@gmail.com>2012-06-14 19:32:55 -0700
committerEric Holk <eric.holk@gmail.com>2012-06-21 16:11:11 -0700
commitdc3862bf58297b75a0e3d4dfdf1f66b56f51dd1d (patch)
treea167331634a96901fc33237ffa64e9206c7646da
parent3b9848b869c17ca369fc8bc7703e727eb19a211d (diff)
downloadrust-dc3862bf58297b75a0e3d4dfdf1f66b56f51dd1d.tar.gz
rust-dc3862bf58297b75a0e3d4dfdf1f66b56f51dd1d.zip
This was unsafe, and will probably leak.
-rw-r--r--src/libcore/vec.rs21
1 files changed, 13 insertions, 8 deletions
diff --git a/src/libcore/vec.rs b/src/libcore/vec.rs
index 4455dbd2426..a80acc67e42 100644
--- a/src/libcore/vec.rs
+++ b/src/libcore/vec.rs
@@ -379,16 +379,21 @@ fn shift<T>(&v: [T]) -> T {
     v <-> vv;
 
     unsafe {
-        let vv = unsafe::to_ptr(vv);
-        let r <- *vv;
-
-        for uint::range(1u, ln) {|i|
-            // FIXME: this isn't legal, per se...
-            let r <- *ptr::offset(vv, i);
-            push(v, r);
+        let mut rr;
+        {
+            let vv = unsafe::to_ptr(vv);
+            let mut r <- *vv;
+
+            for uint::range(1u, ln) {|i|
+                // FIXME: this isn't legal, per se...
+                let r <- *ptr::offset(vv, i);
+                push(v, r);
+            }
+            rr <- r;
         }
+        unsafe::set_len(vv, 0u);
 
-        r
+        rr
     }
 }