diff options
| author | Marijn Haverbeke <marijnh@gmail.com> | 2011-07-29 12:53:58 +0200 |
|---|---|---|
| committer | Marijn Haverbeke <marijnh@gmail.com> | 2011-07-29 12:53:58 +0200 |
| commit | ae46c154f09deb57018579bb00fa3fcac9a93770 (patch) | |
| tree | d61ab2db40befe48094fd279e39921e852c79fcd /src/comp | |
| parent | 0ba34d873dec9853a22f07bf49a136c1695772b0 (diff) | |
| download | rust-ae46c154f09deb57018579bb00fa3fcac9a93770.tar.gz rust-ae46c154f09deb57018579bb00fa3fcac9a93770.zip | |
Make sure resources always have their drop glue called
Even when their content does not contain pointers
Diffstat (limited to 'src/comp')
| -rw-r--r-- | src/comp/middle/trans.rs | 2 | ||||
| -rw-r--r-- | src/comp/middle/ty.rs | 8 |
2 files changed, 9 insertions, 1 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 468923ef79b..928ae327f9b 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -2403,7 +2403,7 @@ fn drop_slot(cx: &@block_ctxt, slot: ValueRef, t: &ty::t) -> result { } fn drop_ty(cx: &@block_ctxt, v: ValueRef, t: ty::t) -> result { - if ty::type_has_pointers(bcx_tcx(cx), t) { + if ty::type_needs_drop(bcx_tcx(cx), t) { ret call_tydesc_glue(cx, v, t, abi::tydesc_field_drop_glue); } ret rslt(cx, C_nil()); diff --git a/src/comp/middle/ty.rs b/src/comp/middle/ty.rs index 4e75c730cfb..a3b043820d6 100644 --- a/src/comp/middle/ty.rs +++ b/src/comp/middle/ty.rs @@ -157,6 +157,7 @@ export type_err; export type_err_to_str; export type_has_dynamic_size; export type_has_pointers; +export type_needs_drop; export type_is_bool; export type_is_bot; export type_is_box; @@ -1022,6 +1023,13 @@ fn type_has_pointers(cx: &ctxt, ty: &t) -> bool { ret result; } +fn type_needs_drop(cx: &ctxt, ty: &t) -> bool { + ret alt struct(cx, ty) { + ty_res(_, _, _) { true } + _ { type_has_pointers(cx, ty) } + }; +} + fn type_kind(cx: &ctxt, ty: &t) -> ast::kind { alt cx.kind_cache.find(ty) { some(result) { ret result; } |
