aboutsummaryrefslogtreecommitdiff
path: root/lapi.c
diff options
context:
space:
mode:
Diffstat (limited to 'lapi.c')
-rw-r--r--lapi.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/lapi.c b/lapi.c
index 42c8fcdd..9b6ca1ec 100644
--- a/lapi.c
+++ b/lapi.c
@@ -1201,11 +1201,16 @@ LUA_API int lua_gc (lua_State *L, int what, ...) {
1201 case LUA_GCSTEP: { 1201 case LUA_GCSTEP: {
1202 lu_byte oldstp = g->gcstp; 1202 lu_byte oldstp = g->gcstp;
1203 l_mem n = cast(l_mem, va_arg(argp, size_t)); 1203 l_mem n = cast(l_mem, va_arg(argp, size_t));
1204 l_mem newdebt;
1204 int work = 0; /* true if GC did some work */ 1205 int work = 0; /* true if GC did some work */
1205 g->gcstp = 0; /* allow GC to run (other bits must be zero here) */ 1206 g->gcstp = 0; /* allow GC to run (other bits must be zero here) */
1206 if (n <= 0) 1207 if (n <= 0)
1207 n = g->GCdebt; /* force to run one basic step */ 1208 newdebt = 0; /* force to run one basic step */
1208 luaE_setdebt(g, g->GCdebt - n); 1209 else if (g->GCdebt >= n - MAX_LMEM) /* no overflow? */
1210 newdebt = g->GCdebt - n;
1211 else /* overflow */
1212 newdebt = -MAX_LMEM; /* set debt to miminum value */
1213 luaE_setdebt(g, newdebt);
1209 luaC_condGC(L, (void)0, work = 1); 1214 luaC_condGC(L, (void)0, work = 1);
1210 if (work && g->gcstate == GCSpause) /* end of cycle? */ 1215 if (work && g->gcstate == GCSpause) /* end of cycle? */
1211 res = 1; /* signal it */ 1216 res = 1; /* signal it */