aboutsummaryrefslogtreecommitdiff
path: root/lapi.c
diff options
context:
space:
mode:
Diffstat (limited to 'lapi.c')
-rw-r--r--lapi.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/lapi.c b/lapi.c
index d5765cc9..cb38ffba 100644
--- a/lapi.c
+++ b/lapi.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lapi.c,v 2.194 2014/02/13 12:11:34 roberto Exp roberto $ 2** $Id: lapi.c,v 2.195 2014/02/13 17:25:20 roberto Exp roberto $
3** Lua API 3** Lua API
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -1070,12 +1070,20 @@ LUA_API int lua_gc (lua_State *L, int what, int data) {
1070 break; 1070 break;
1071 } 1071 }
1072 case LUA_GCSTEP: { 1072 case LUA_GCSTEP: {
1073 lu_mem debt = cast(lu_mem, data) * 1024 - GCSTEPSIZE; 1073 l_mem debt = 1; /* =1 to signal that it did an actual step */
1074 if (g->gcrunning) 1074 int oldrunning = g->gcrunning;
1075 debt += g->GCdebt; /* include current debt */ 1075 g->gcrunning = 1; /* force GC to run */
1076 luaE_setdebt(g, debt); 1076 if (data == 0) {
1077 luaC_forcestep(L); 1077 luaE_setdebt(g, -GCSTEPSIZE); /* to do a "small" step */
1078 if (g->gcstate == GCSpause) /* end of cycle? */ 1078 luaC_step(L);
1079 }
1080 else { /* add 'data' to total debt */
1081 debt = cast(l_mem, data) * 1024 + g->GCdebt;
1082 luaE_setdebt(g, debt);
1083 luaC_checkGC(L);
1084 }
1085 g->gcrunning = oldrunning; /* restore previous state */
1086 if (debt > 0 && g->gcstate == GCSpause) /* end of cycle? */
1079 res = 1; /* signal it */ 1087 res = 1; /* signal it */
1080 break; 1088 break;
1081 } 1089 }