diff options
| author | Mistivia <i@mistivia.com> | 2025-06-22 19:31:26 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2025-06-22 19:34:33 +0800 |
| commit | daf22cff78522a1b5140fb7b02be3006ea4a2236 (patch) | |
| tree | 704a3687c7f388b032d20769db49a639960eb1e8 /src/interp.c | |
| parent | dacb6b16b205661189c51cb7ce25efab96e8682b (diff) | |
more aggressive gc
Diffstat (limited to 'src/interp.c')
| -rw-r--r-- | src/interp.c | 7 |
1 files 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; |
