diff options
| author | Brian Anderson <banderson@mozilla.com> | 2011-09-21 17:41:42 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2011-09-22 10:26:34 -0700 |
| commit | 4d088bd5286b7946068953fe43efe1a9dd47193a (patch) | |
| tree | 87e0e7270392d1f175cf5744753777a69475c952 /src/comp | |
| parent | aad1342e13c0c09932c5bfc6c9ca9a7430709194 (diff) | |
| download | rust-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.rs | 21 |
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 = |
