about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2011-09-02 17:51:03 -0700
committerPatrick Walton <pcwalton@mimiga.net>2011-09-02 17:51:28 -0700
commitb329324f711d364a70a4d0c281e627bf470ef3d6 (patch)
tree23df80cc84fcc7ba2143c80a9ef61ed9e325c6b3
parent477c1bf6e164379db3bd0cfdcf3c876d5fe3d58b (diff)
downloadrust-b329324f711d364a70a4d0c281e627bf470ef3d6.tar.gz
rust-b329324f711d364a70a4d0c281e627bf470ef3d6.zip
rustc: Zero out unique pointers after we drop them
-rw-r--r--src/comp/middle/trans.rs7
-rw-r--r--src/comp/middle/trans_vec.rs1
2 files changed, 7 insertions, 1 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index e03b23bf43c..47a63c0d660 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -1386,7 +1386,12 @@ fn make_drop_glue(bcx: &@block_ctxt, v0: ValueRef, t: ty::t) {
       ty::ty_vec(_) { tvec::make_drop_glue(bcx, v0, t) }
       ty::ty_istr. { tvec::make_drop_glue(bcx, v0, t) }
       ty::ty_box(_) { decr_refcnt_maybe_free(bcx, v0, v0, t) }
-      ty::ty_uniq(_) { trans_shared_free(bcx, Load(bcx, v0)) }
+      ty::ty_uniq(_) {
+        let vptr = Load(bcx, v0);
+        let bcx = trans_shared_free(bcx, vptr);
+        Store(bcx, C_null(val_ty(vptr)), v0);
+        bcx
+      }
       ty::ty_obj(_) {
         let box_cell =
             GEP(bcx, v0, [C_int(0), C_int(abi::obj_field_box)]);
diff --git a/src/comp/middle/trans_vec.rs b/src/comp/middle/trans_vec.rs
index 436b6d951aa..84d542bbdcd 100644
--- a/src/comp/middle/trans_vec.rs
+++ b/src/comp/middle/trans_vec.rs
@@ -87,6 +87,7 @@ fn make_drop_glue(bcx: &@block_ctxt, vptrptr: ValueRef, vec_ty: ty::t)
         drop_cx = iter_vec(drop_cx, vptrptr, vec_ty, trans::drop_ty);
     }
     drop_cx = trans::trans_shared_free(drop_cx, vptr);
+    Store(drop_cx, C_null(val_ty(vptr)), vptrptr);
     Br(drop_cx, next_cx.llbb);
     ret next_cx;
 }