From daf22cff78522a1b5140fb7b02be3006ea4a2236 Mon Sep 17 00:00:00 2001 From: Mistivia Date: Sun, 22 Jun 2025 19:31:26 +0800 Subject: more aggressive gc --- src/interp.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/interp.c b/src/interp.c index befd28d..615a922 100644 --- a/src/interp.c +++ b/src/interp.c @@ -242,7 +242,9 @@ void Interp_add_primitive(Interp *self, const char *name, LispPrimitive fn) { } void Interp_gc(Interp *interp, SExpRef tmproot) { - if (!IntVector_empty(&interp->empty_space)) { + int freesize = IntVector_len(&interp->empty_space); + int heapsize = SExpVector_len(&interp->objs); + if (freesize > heapsize >> 4) { return; } SExpRefVector gcstack; @@ -297,12 +299,13 @@ void Interp_gc(Interp *interp, SExpRef tmproot) { continue; } if (obj->type == kSymbolSExp) continue; + if (obj->type == kEmptySExp) continue; if (obj->type == kStringSExp) free((void*)obj->str); obj->type = kEmptySExp; IntVector_push_back(&interp->empty_space, i); } // enlarge heap - int heapsize = SExpVector_len(&interp->objs); + heapsize = SExpVector_len(&interp->objs); int usedsize = heapsize - IntVector_len(&interp->empty_space); if (heapsize < usedsize * 2) { SExp sexp; -- cgit v1.0