diff options
Diffstat (limited to 'lapi.c')
| -rw-r--r-- | lapi.c | 22 |
1 files changed, 15 insertions, 7 deletions
| @@ -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 | } |
