From 7b337e35810a25b53da76aa9d873b6b74081da72 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Wed, 10 Aug 2011 22:47:18 -0700 Subject: [PATCH] rustc: Don't free shared memory when --gc is on --- src/comp/middle/trans.rs | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index f0e1def315cf..165ad2761881 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -1292,11 +1292,22 @@ fn make_free_glue(cx: &@block_ctxt, v0: ValueRef, t: &ty::t) { // FIXME: switch gc/non-gc on layer of the type. let rs = alt ty::struct(bcx_tcx(cx), t) { - ty::ty_str. { let v = cx.build.Load(v0); trans_non_gc_free(cx, v) } + ty::ty_str. { + let v = cx.build.Load(v0); + if !bcx_ccx(cx).sess.get_opts().do_gc { + trans_non_gc_free(cx, v) + } else { + rslt(cx, C_nil()) + } + } ty::ty_vec(_) { let v = cx.build.Load(v0); let rs = iter_sequence(cx, v, t, bind drop_ty(_, _, _)); - trans_non_gc_free(rs.bcx, v) + if !bcx_ccx(cx).sess.get_opts().do_gc { + trans_non_gc_free(rs.bcx, v) + } else { + rslt(cx, C_nil()) + } } ty::ty_box(body_mt) { let v = cx.build.Load(v0); @@ -1305,7 +1316,11 @@ fn make_free_glue(cx: &@block_ctxt, v0: ValueRef, t: &ty::t) { let body_ty = body_mt.ty; let body_val = load_if_immediate(cx, body, body_ty); let rs = drop_ty(cx, body_val, body_ty); - trans_non_gc_free(rs.bcx, v) + if !bcx_ccx(cx).sess.get_opts().do_gc { + trans_non_gc_free(rs.bcx, v) + } else { + rslt(cx, C_nil()) + } } ty::ty_uniq(_) { fail "free uniq unimplemented"; @@ -1341,7 +1356,11 @@ fn make_free_glue(cx: &@block_ctxt, v0: ValueRef, t: &ty::t) { let ti = none[@tydesc_info]; call_tydesc_glue_full(cx, body, tydesc, abi::tydesc_field_drop_glue, ti); - trans_non_gc_free(cx, b) + if (!bcx_ccx(cx).sess.get_opts().do_gc) { + trans_non_gc_free(cx, b) + } else { + rslt(cx, C_nil()) + } } ty::ty_fn(_, _, _, _, _) { let box_cell = @@ -1358,7 +1377,11 @@ fn make_free_glue(cx: &@block_ctxt, v0: ValueRef, t: &ty::t) { let ti = none[@tydesc_info]; call_tydesc_glue_full(cx, bindings, cx.build.Load(tydescptr), abi::tydesc_field_drop_glue, ti); - trans_non_gc_free(cx, v) + if (!bcx_ccx(cx).sess.get_opts().do_gc) { + trans_non_gc_free(cx, v) + } else { + rslt(cx, C_nil()) + } } _ { rslt(cx, C_nil()) } };