aboutsummaryrefslogtreecommitdiffstats
path: root/src/gc.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2009-10-16 01:53:16 +0000
committerDavid Robillard <d@drobilla.net>2009-10-16 01:53:16 +0000
commitc2d75892af2fdc6b9bf25365a15de5dc63bcc852 (patch)
tree22234de7261ca54f6c1d01e0ff271cbde5af0699 /src/gc.cpp
parent474b2a748bfdb55aac43bba998bc79a5c9d18675 (diff)
downloadresp-c2d75892af2fdc6b9bf25365a15de5dc63bcc852.tar.gz
resp-c2d75892af2fdc6b9bf25365a15de5dc63bcc852.tar.bz2
resp-c2d75892af2fdc6b9bf25365a15de5dc63bcc852.zip
Cons.
git-svn-id: http://svn.drobilla.net/resp/tuplr@235 ad02d1e2-f140-0410-9f75-f8b11f17cedd
Diffstat (limited to 'src/gc.cpp')
-rw-r--r--src/gc.cpp19
1 files changed, 11 insertions, 8 deletions
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<const ATuple*>((AST*)obj);
- if (tup)
- FOREACHP(ATuple::const_iterator, i, tup)
- mark(*i);
+ if (obj->tag() == Object::AST) {
+ const ATuple* tup = ((const AST*)obj)->to<const ATuple*>();
+ 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<AType*>()) { // 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;
}