diff options
Diffstat (limited to 'src/rt/rust_cc.cpp')
| -rw-r--r-- | src/rt/rust_cc.cpp | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/src/rt/rust_cc.cpp b/src/rt/rust_cc.cpp index c0a7c4b4740..9d6c4992b17 100644 --- a/src/rt/rust_cc.cpp +++ b/src/rt/rust_cc.cpp @@ -409,7 +409,18 @@ sweep(rust_task *task, const std::set<void *> &marked) { while (begin != end) { void *alloc = begin->first; if (marked.find(alloc) == marked.end()) { + const type_desc *tydesc = begin->second; + DPRINT("object is part of a cycle: %p\n", alloc); + + // Run the destructor. + // TODO: What if it fails? + if (tydesc->drop_glue) { + tydesc->drop_glue(NULL, task, (void *)tydesc, + tydesc->first_param, alloc); + } + + task->free(alloc); } ++begin; } @@ -418,8 +429,8 @@ sweep(rust_task *task, const std::set<void *> &marked) { void do_cc(rust_task *task) { - DPRINT("cc; n allocs = %lu\n", - (long unsigned int)task->local_allocs.size()); + //DPRINT("cc; n allocs = %lu\n", + // (long unsigned int)task->local_allocs.size()); irc_map ircs; irc::compute_ircs(task, ircs); |
