diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-10-02 11:47:43 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-10-02 11:47:43 -0300 |
commit | 78bc8e553d4190fc3b90be5b621fc0f3507586ef (patch) | |
tree | 9bd9317e1a56960b944549d44a20b91024574c19 /lapi.c | |
parent | dad808a73a98a23729614b8814728d76b4e5d577 (diff) | |
download | lua-78bc8e553d4190fc3b90be5b621fc0f3507586ef.tar.gz lua-78bc8e553d4190fc3b90be5b621fc0f3507586ef.tar.bz2 lua-78bc8e553d4190fc3b90be5b621fc0f3507586ef.zip |
new API for garbage collector
Diffstat (limited to 'lapi.c')
-rw-r--r-- | lapi.c | 33 |
1 files changed, 27 insertions, 6 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lapi.c,v 1.100 2000/09/27 12:51:39 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 1.101 2000/09/29 12:42:13 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 | */ |
@@ -155,7 +155,6 @@ double lua_tonumber (lua_State *L, int index) { | |||
155 | } | 155 | } |
156 | 156 | ||
157 | const char *lua_tostring (lua_State *L, int index) { | 157 | const char *lua_tostring (lua_State *L, int index) { |
158 | luaC_checkGC(L); /* `tostring' may create a new string */ | ||
159 | access(L, index, (tostring(L, o) == 0), NULL, svalue(o)); | 158 | access(L, index, (tostring(L, o) == 0), NULL, svalue(o)); |
160 | } | 159 | } |
161 | 160 | ||
@@ -203,7 +202,6 @@ void lua_pushnumber (lua_State *L, double n) { | |||
203 | 202 | ||
204 | 203 | ||
205 | void lua_pushlstring (lua_State *L, const char *s, size_t len) { | 204 | void lua_pushlstring (lua_State *L, const char *s, size_t len) { |
206 | luaC_checkGC(L); | ||
207 | tsvalue(L->top) = luaS_newlstr(L, s, len); | 205 | tsvalue(L->top) = luaS_newlstr(L, s, len); |
208 | ttype(L->top) = TAG_STRING; | 206 | ttype(L->top) = TAG_STRING; |
209 | api_incr_top(L); | 207 | api_incr_top(L); |
@@ -219,13 +217,11 @@ void lua_pushstring (lua_State *L, const char *s) { | |||
219 | 217 | ||
220 | 218 | ||
221 | void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) { | 219 | void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) { |
222 | luaC_checkGC(L); | ||
223 | luaV_Cclosure(L, fn, n); | 220 | luaV_Cclosure(L, fn, n); |
224 | } | 221 | } |
225 | 222 | ||
226 | 223 | ||
227 | void lua_pushusertag (lua_State *L, void *u, int tag) { /* ORDER LUA_T */ | 224 | void lua_pushusertag (lua_State *L, void *u, int tag) { /* ORDER LUA_T */ |
228 | luaC_checkGC(L); | ||
229 | if (tag != LUA_ANYTAG && tag != TAG_USERDATA && tag < NUM_TAGS) | 225 | if (tag != LUA_ANYTAG && tag != TAG_USERDATA && tag < NUM_TAGS) |
230 | luaO_verror(L, "invalid tag for a userdata (%d)", tag); | 226 | luaO_verror(L, "invalid tag for a userdata (%d)", tag); |
231 | tsvalue(L->top) = luaS_createudata(L, u, tag); | 227 | tsvalue(L->top) = luaS_createudata(L, u, tag); |
@@ -292,7 +288,6 @@ int lua_getref (lua_State *L, int ref) { | |||
292 | 288 | ||
293 | 289 | ||
294 | void lua_newtable (lua_State *L) { | 290 | void lua_newtable (lua_State *L) { |
295 | luaC_checkGC(L); | ||
296 | hvalue(L->top) = luaH_new(L, 0); | 291 | hvalue(L->top) = luaH_new(L, 0); |
297 | ttype(L->top) = TAG_TABLE; | 292 | ttype(L->top) = TAG_TABLE; |
298 | api_incr_top(L); | 293 | api_incr_top(L); |
@@ -377,6 +372,31 @@ void lua_rawcall (lua_State *L, int nargs, int nresults) { | |||
377 | 372 | ||
378 | 373 | ||
379 | /* | 374 | /* |
375 | ** Garbage-collection functions | ||
376 | */ | ||
377 | |||
378 | /* GC values are expressed in Kbytes: #bytes/2^10 */ | ||
379 | #define GCscale(x) ((int)((x)>>10)) | ||
380 | #define GCunscale(x) ((unsigned long)(x)<<10) | ||
381 | |||
382 | int lua_getgcthreshold (lua_State *L) { | ||
383 | return GCscale(L->GCthreshold); | ||
384 | } | ||
385 | |||
386 | int lua_getgccount (lua_State *L) { | ||
387 | return GCscale(L->nblocks); | ||
388 | } | ||
389 | |||
390 | void lua_setgcthreshold (lua_State *L, int newthreshold) { | ||
391 | if (newthreshold > GCscale(ULONG_MAX)) | ||
392 | L->GCthreshold = ULONG_MAX; | ||
393 | else | ||
394 | L->GCthreshold = GCunscale(newthreshold); | ||
395 | luaC_checkGC(L); | ||
396 | } | ||
397 | |||
398 | |||
399 | /* | ||
380 | ** miscellaneous functions | 400 | ** miscellaneous functions |
381 | */ | 401 | */ |
382 | 402 | ||
@@ -449,5 +469,6 @@ void lua_concat (lua_State *L, int n) { | |||
449 | StkId top = L->top; | 469 | StkId top = L->top; |
450 | luaV_strconc(L, n, top); | 470 | luaV_strconc(L, n, top); |
451 | L->top = top-(n-1); | 471 | L->top = top-(n-1); |
472 | luaC_checkGC(L); | ||
452 | } | 473 | } |
453 | 474 | ||