From c2d75892af2fdc6b9bf25365a15de5dc63bcc852 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 16 Oct 2009 01:53:16 +0000 Subject: Cons. git-svn-id: http://svn.drobilla.net/resp/tuplr@235 ad02d1e2-f140-0410-9f75-f8b11f17cedd --- src/gc.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'src/gc.cpp') diff --git a/src/gc.cpp b/src/gc.cpp index acbcb0e..01848d2 100644 --- a/src/gc.cpp +++ b/src/gc.cpp @@ -44,6 +44,7 @@ GC::alloc(size_t size) size += sizeof(Object::Header); void* ret = tlsf_malloc((tlsf_t*)_pool, size); ((Object::Header*)ret)->mark = 0; + ((Object::Header*)ret)->tag = Object::AST; ret = (char*)ret + sizeof(Object::Header); _heap.push_back((Object*)ret); return ret; @@ -56,10 +57,12 @@ mark(const Object* obj) return; obj->mark(true); - const ATuple* tup = dynamic_cast((AST*)obj); - if (tup) - FOREACHP(ATuple::const_iterator, i, tup) - mark(*i); + if (obj->tag() == Object::AST) { + const ATuple* tup = ((const AST*)obj)->to(); + if (tup) + FOREACHP(ATuple::const_iterator, i, tup) + mark(*i); + } } void @@ -77,14 +80,14 @@ GC::collect(const Roots& roots) if ((*i)->marked()) { (*i)->mark(false); } else { - AST* ast = (AST*)*i; - if (!ast->to()) { // FIXME - (ast)->~AST(); + if ((*i)->tag() == Object::AST) + ((AST*)*i)->~AST(); + tlsf_free((tlsf_t*)_pool, ((char*)(*i) - sizeof(Object::Header))); _heap.erase(i); - } } i = next; } + //std::cerr << "[GC] Collect " << oldSize << " => " << _heap.size() << endl; } -- cgit v1.2.1