diff --git a/src/lj_gc.c b/src/lj_gc.c index b35a0d44..2fc52ec1 100644 --- a/src/lj_gc.c +++ b/src/lj_gc.c @@ -700,9 +700,12 @@ static size_t gc_onestep(lua_State *L) } case GCSfinalize: if (gcref(g->gc.mmudata) != NULL) { + GCSize old = g->gc.total; if (tvref(g->jit_base)) /* Don't call finalizers on trace. */ return LJ_MAX_MEM; gc_finalize(L); /* Finalize one userdata object. */ + if (old >= g->gc.total && g->gc.estimate > old - g->gc.total) + g->gc.estimate -= old - g->gc.total; if (g->gc.estimate > GCFINALIZECOST) g->gc.estimate -= GCFINALIZECOST; return GCFINALIZECOST;