summaryrefslogtreecommitdiff
path: root/ldo.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2006-07-11 12:53:29 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2006-07-11 12:53:29 -0300
commit3ca9af51a4f060cf2178901a67a21f8269af3224 (patch)
tree4f1bb541280aa8b4960b16d0925eca60adb2b1a8 /ldo.c
parentc7b89dd28097296bbc14d9b47b4cea72514b2b76 (diff)
downloadlua-3ca9af51a4f060cf2178901a67a21f8269af3224.tar.gz
lua-3ca9af51a4f060cf2178901a67a21f8269af3224.tar.bz2
lua-3ca9af51a4f060cf2178901a67a21f8269af3224.zip
emergency garbage collector (core forces a GC when allocation fails)
Diffstat (limited to 'ldo.c')
-rw-r--r--ldo.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/ldo.c b/ldo.c
index d7a587e9..6ce1e519 100644
--- a/ldo.c
+++ b/ldo.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldo.c,v 2.37 2005/12/22 16:19:56 roberto Exp roberto $ 2** $Id: ldo.c,v 2.38 2006/06/05 19:36:14 roberto Exp roberto $
3** Stack and Call structure of Lua 3** Stack and Call structure of Lua
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -81,7 +81,7 @@ static void restore_stack_limit (lua_State *L) {
81static void resetstack (lua_State *L, int status) { 81static void resetstack (lua_State *L, int status) {
82 L->ci = L->base_ci; 82 L->ci = L->base_ci;
83 L->base = L->ci->base; 83 L->base = L->ci->base;
84 luaF_close(L, L->base); /* close eventual pending closures */ 84 luaF_close(L, L->base); /* close possible pending closures */
85 luaD_seterrorobj(L, status, L->base); 85 luaD_seterrorobj(L, status, L->base);
86 L->nCcalls = 0; 86 L->nCcalls = 0;
87 L->allowhook = 1; 87 L->allowhook = 1;
@@ -217,11 +217,13 @@ static StkId adjust_varargs (lua_State *L, Proto *p, int actual) {
217 int nvar = actual - nfixargs; /* number of extra arguments */ 217 int nvar = actual - nfixargs; /* number of extra arguments */
218 lua_assert(p->is_vararg & VARARG_HASARG); 218 lua_assert(p->is_vararg & VARARG_HASARG);
219 luaC_checkGC(L); 219 luaC_checkGC(L);
220 htab = luaH_new(L, nvar, 1); /* create `arg' table */ 220 htab = luaH_new(L); /* create `arg' table */
221 sethvalue(L, L->top++, htab);
221 for (i=0; i<nvar; i++) /* put extra arguments into `arg' table */ 222 for (i=0; i<nvar; i++) /* put extra arguments into `arg' table */
222 setobj2n(L, luaH_setnum(L, htab, i+1), L->top - nvar + i); 223 setobj2n(L, luaH_setnum(L, htab, i+1), L->top - nvar + i - 1);
223 /* store counter in field `n' */ 224 /* store counter in field `n' */
224 setnvalue(luaH_setstr(L, htab, luaS_newliteral(L, "n")), cast_num(nvar)); 225 setnvalue(luaH_setstr(L, htab, luaS_newliteral(L, "n")), cast_num(nvar));
226 L->top--;
225 } 227 }
226#endif 228#endif
227 /* move fixed parameters to final position */ 229 /* move fixed parameters to final position */
@@ -332,7 +334,7 @@ static StkId callrethooks (lua_State *L, StkId firstResult) {
332 ptrdiff_t fr = savestack(L, firstResult); /* next call may change stack */ 334 ptrdiff_t fr = savestack(L, firstResult); /* next call may change stack */
333 luaD_callhook(L, LUA_HOOKRET, -1); 335 luaD_callhook(L, LUA_HOOKRET, -1);
334 if (f_isLua(L->ci)) { /* Lua function? */ 336 if (f_isLua(L->ci)) { /* Lua function? */
335 while (L->ci->tailcalls--) /* call hook for eventual tail calls */ 337 while (L->ci->tailcalls--) /* call hook for possible tail calls */
336 luaD_callhook(L, LUA_HOOKTAILRET, -1); 338 luaD_callhook(L, LUA_HOOKTAILRET, -1);
337 } 339 }
338 return restorestack(L, fr); 340 return restorestack(L, fr);
@@ -461,7 +463,7 @@ int luaD_pcall (lua_State *L, Pfunc func, void *u,
461 status = luaD_rawrunprotected(L, func, u); 463 status = luaD_rawrunprotected(L, func, u);
462 if (status != 0) { /* an error occurred? */ 464 if (status != 0) { /* an error occurred? */
463 StkId oldtop = restorestack(L, old_top); 465 StkId oldtop = restorestack(L, old_top);
464 luaF_close(L, oldtop); /* close eventual pending closures */ 466 luaF_close(L, oldtop); /* close possible pending closures */
465 luaD_seterrorobj(L, status, oldtop); 467 luaD_seterrorobj(L, status, oldtop);
466 L->nCcalls = oldnCcalls; 468 L->nCcalls = oldnCcalls;
467 L->ci = restoreci(L, old_ci); 469 L->ci = restoreci(L, old_ci);
@@ -494,12 +496,13 @@ static void f_parser (lua_State *L, void *ud) {
494 luaC_checkGC(L); 496 luaC_checkGC(L);
495 tf = ((c == LUA_SIGNATURE[0]) ? luaU_undump : luaY_parser)(L, p->z, 497 tf = ((c == LUA_SIGNATURE[0]) ? luaU_undump : luaY_parser)(L, p->z,
496 &p->buff, p->name); 498 &p->buff, p->name);
499 setptvalue2s(L, L->top, tf);
500 incr_top(L);
497 cl = luaF_newLclosure(L, tf->nups, hvalue(gt(L))); 501 cl = luaF_newLclosure(L, tf->nups, hvalue(gt(L)));
498 cl->l.p = tf; 502 cl->l.p = tf;
499 for (i = 0; i < tf->nups; i++) /* initialize eventual upvalues */ 503 setclvalue(L, L->top - 1, cl);
504 for (i = 0; i < tf->nups; i++) /* initialize upvalues */
500 cl->l.upvals[i] = luaF_newupval(L); 505 cl->l.upvals[i] = luaF_newupval(L);
501 setclvalue(L, L->top, cl);
502 incr_top(L);
503} 506}
504 507
505 508