about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-09-21 17:41:42 -0700
committerBrian Anderson <banderson@mozilla.com>2011-09-22 10:26:34 -0700
commit4d088bd5286b7946068953fe43efe1a9dd47193a (patch)
tree87e0e7270392d1f175cf5744753777a69475c952 /src/comp
parentaad1342e13c0c09932c5bfc6c9ca9a7430709194 (diff)
downloadrust-4d088bd5286b7946068953fe43efe1a9dd47193a.tar.gz
rust-4d088bd5286b7946068953fe43efe1a9dd47193a.zip
Call drop glue on the thing in a unique box
Issue #409
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/middle/trans.rs21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 2ffc43b8745..bb3c399dda4 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -1313,7 +1313,21 @@ fn make_free_glue(bcx: @block_ctxt, v0: ValueRef, t: ty::t) {
                 trans_non_gc_free(bcx, v)
             } else { bcx }
           }
-          ty::ty_uniq(_) { fail "free uniq unimplemented"; }
+          ty::ty_uniq(content_t) {
+            let free_cx = new_sub_block_ctxt(bcx, "uniq_free");
+            let next_cx = new_sub_block_ctxt(bcx, "uniq_free_next");
+            let vptr = Load(bcx, v0);
+            let null_test = IsNull(bcx, vptr);
+            CondBr(bcx, null_test, next_cx.llbb, free_cx.llbb);
+
+            let bcx = free_cx;
+            let bcx = drop_ty(bcx, vptr, content_t);
+            let bcx = trans_shared_free(bcx, vptr);
+            Store(bcx, C_null(val_ty(vptr)), v0);
+            Br(bcx, next_cx.llbb);
+
+            next_cx
+          }
           ty::ty_obj(_) {
             // Call through the obj's own fields-drop glue first.
             // Then free the body.
@@ -1366,10 +1380,7 @@ fn make_drop_glue(bcx: @block_ctxt, v0: ValueRef, t: ty::t) {
           ty::ty_str. { tvec::make_drop_glue(bcx, v0, t) }
           ty::ty_box(_) { decr_refcnt_maybe_free(bcx, v0, v0, t) }
           ty::ty_uniq(_) {
-            let vptr = Load(bcx, v0);
-            let bcx = trans_shared_free(bcx, vptr);
-            Store(bcx, C_null(val_ty(vptr)), v0);
-            bcx
+            free_ty(bcx, v0, t)
           }
           ty::ty_obj(_) {
             let box_cell =