diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2011-08-23 14:24:34 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2011-08-23 14:24:34 -0300 |
| commit | 3dc5475e239e2da52a380288ae8b293a6b019f81 (patch) | |
| tree | 3da13bd67407f9717b5fb9a024dca38b78589bfc | |
| parent | 8a008a20579dd6818cb770147c8765b72eb2acfe (diff) | |
| download | lua-3dc5475e239e2da52a380288ae8b293a6b019f81.tar.gz lua-3dc5475e239e2da52a380288ae8b293a6b019f81.tar.bz2 lua-3dc5475e239e2da52a380288ae8b293a6b019f81.zip | |
'nCcalls' should be local to each thread, as each thread may have its
own C stack (with LuaThreads or something similar)
| -rw-r--r-- | lcorolib.c | 4 | ||||
| -rw-r--r-- | ldo.c | 28 | ||||
| -rw-r--r-- | lparser.c | 12 | ||||
| -rw-r--r-- | lstate.c | 4 | ||||
| -rw-r--r-- | lstate.h | 4 | ||||
| -rw-r--r-- | ltests.c | 6 | ||||
| -rw-r--r-- | lua.h | 4 |
7 files changed, 31 insertions, 31 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lcorolib.c,v 1.1 2010/06/10 21:30:26 roberto Exp roberto $ | 2 | ** $Id: lcorolib.c,v 1.2 2010/07/02 11:38:13 roberto Exp roberto $ |
| 3 | ** Coroutine Library | 3 | ** Coroutine Library |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -28,7 +28,7 @@ static int auxresume (lua_State *L, lua_State *co, int narg) { | |||
| 28 | return -1; /* error flag */ | 28 | return -1; /* error flag */ |
| 29 | } | 29 | } |
| 30 | lua_xmove(L, co, narg); | 30 | lua_xmove(L, co, narg); |
| 31 | status = lua_resume(co, narg); | 31 | status = lua_resume(co, L, narg); |
| 32 | if (status == LUA_OK || status == LUA_YIELD) { | 32 | if (status == LUA_OK || status == LUA_YIELD) { |
| 33 | int nres = lua_gettop(co); | 33 | int nres = lua_gettop(co); |
| 34 | if (!lua_checkstack(L, nres + 1)) { | 34 | if (!lua_checkstack(L, nres + 1)) { |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ldo.c,v 2.97 2011/06/20 16:36:03 roberto Exp roberto $ | 2 | ** $Id: ldo.c,v 2.98 2011/06/28 15:42:04 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 | */ |
| @@ -123,7 +123,7 @@ void luaD_throw (lua_State *L, int errcode) { | |||
| 123 | 123 | ||
| 124 | 124 | ||
| 125 | int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) { | 125 | int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) { |
| 126 | unsigned short oldnCcalls = G(L)->nCcalls; | 126 | unsigned short oldnCcalls = L->nCcalls; |
| 127 | struct lua_longjmp lj; | 127 | struct lua_longjmp lj; |
| 128 | lj.status = LUA_OK; | 128 | lj.status = LUA_OK; |
| 129 | lj.previous = L->errorJmp; /* chain new error handler */ | 129 | lj.previous = L->errorJmp; /* chain new error handler */ |
| @@ -132,7 +132,7 @@ int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) { | |||
| 132 | (*f)(L, ud); | 132 | (*f)(L, ud); |
| 133 | ); | 133 | ); |
| 134 | L->errorJmp = lj.previous; /* restore old error handler */ | 134 | L->errorJmp = lj.previous; /* restore old error handler */ |
| 135 | G(L)->nCcalls = oldnCcalls; | 135 | L->nCcalls = oldnCcalls; |
| 136 | return lj.status; | 136 | return lj.status; |
| 137 | } | 137 | } |
| 138 | 138 | ||
| @@ -382,18 +382,17 @@ int luaD_poscall (lua_State *L, StkId firstResult) { | |||
| 382 | ** function position. | 382 | ** function position. |
| 383 | */ | 383 | */ |
| 384 | void luaD_call (lua_State *L, StkId func, int nResults, int allowyield) { | 384 | void luaD_call (lua_State *L, StkId func, int nResults, int allowyield) { |
| 385 | global_State *g = G(L); | 385 | if (++L->nCcalls >= LUAI_MAXCCALLS) { |
| 386 | if (++g->nCcalls >= LUAI_MAXCCALLS) { | 386 | if (L->nCcalls == LUAI_MAXCCALLS) |
| 387 | if (g->nCcalls == LUAI_MAXCCALLS) | ||
| 388 | luaG_runerror(L, "C stack overflow"); | 387 | luaG_runerror(L, "C stack overflow"); |
| 389 | else if (g->nCcalls >= (LUAI_MAXCCALLS + (LUAI_MAXCCALLS>>3))) | 388 | else if (L->nCcalls >= (LUAI_MAXCCALLS + (LUAI_MAXCCALLS>>3))) |
| 390 | luaD_throw(L, LUA_ERRERR); /* error while handing stack error */ | 389 | luaD_throw(L, LUA_ERRERR); /* error while handing stack error */ |
| 391 | } | 390 | } |
| 392 | if (!allowyield) L->nny++; | 391 | if (!allowyield) L->nny++; |
| 393 | if (!luaD_precall(L, func, nResults)) /* is a Lua function? */ | 392 | if (!luaD_precall(L, func, nResults)) /* is a Lua function? */ |
| 394 | luaV_execute(L); /* call it */ | 393 | luaV_execute(L); /* call it */ |
| 395 | if (!allowyield) L->nny--; | 394 | if (!allowyield) L->nny--; |
| 396 | g->nCcalls--; | 395 | L->nCcalls--; |
| 397 | luaC_checkGC(L); | 396 | luaC_checkGC(L); |
| 398 | } | 397 | } |
| 399 | 398 | ||
| @@ -404,7 +403,7 @@ static void finishCcall (lua_State *L) { | |||
| 404 | lua_assert(ci->u.c.k != NULL); /* must have a continuation */ | 403 | lua_assert(ci->u.c.k != NULL); /* must have a continuation */ |
| 405 | lua_assert(L->nny == 0); | 404 | lua_assert(L->nny == 0); |
| 406 | /* finish 'luaD_call' */ | 405 | /* finish 'luaD_call' */ |
| 407 | G(L)->nCcalls--; | 406 | L->nCcalls--; |
| 408 | /* finish 'lua_callk' */ | 407 | /* finish 'lua_callk' */ |
| 409 | adjustresults(L, ci->nresults); | 408 | adjustresults(L, ci->nresults); |
| 410 | /* call continuation function */ | 409 | /* call continuation function */ |
| @@ -487,7 +486,7 @@ static void resume_error (lua_State *L, const char *msg, StkId firstArg) { | |||
| 487 | static void resume (lua_State *L, void *ud) { | 486 | static void resume (lua_State *L, void *ud) { |
| 488 | StkId firstArg = cast(StkId, ud); | 487 | StkId firstArg = cast(StkId, ud); |
| 489 | CallInfo *ci = L->ci; | 488 | CallInfo *ci = L->ci; |
| 490 | if (G(L)->nCcalls >= LUAI_MAXCCALLS) | 489 | if (L->nCcalls >= LUAI_MAXCCALLS) |
| 491 | resume_error(L, "C stack overflow", firstArg); | 490 | resume_error(L, "C stack overflow", firstArg); |
| 492 | if (L->status == LUA_OK) { /* may be starting a coroutine */ | 491 | if (L->status == LUA_OK) { /* may be starting a coroutine */ |
| 493 | if (ci != &L->base_ci) /* not in base level? */ | 492 | if (ci != &L->base_ci) /* not in base level? */ |
| @@ -514,7 +513,7 @@ static void resume (lua_State *L, void *ud) { | |||
| 514 | api_checknelems(L, n); | 513 | api_checknelems(L, n); |
| 515 | firstArg = L->top - n; /* yield results come from continuation */ | 514 | firstArg = L->top - n; /* yield results come from continuation */ |
| 516 | } | 515 | } |
| 517 | G(L)->nCcalls--; /* finish 'luaD_call' */ | 516 | L->nCcalls--; /* finish 'luaD_call' */ |
| 518 | luaD_poscall(L, firstArg); /* finish 'luaD_precall' */ | 517 | luaD_poscall(L, firstArg); /* finish 'luaD_precall' */ |
| 519 | } | 518 | } |
| 520 | unroll(L, NULL); | 519 | unroll(L, NULL); |
| @@ -522,11 +521,11 @@ static void resume (lua_State *L, void *ud) { | |||
| 522 | } | 521 | } |
| 523 | 522 | ||
| 524 | 523 | ||
| 525 | LUA_API int lua_resume (lua_State *L, int nargs) { | 524 | LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs) { |
| 526 | int status; | 525 | int status; |
| 527 | lua_lock(L); | 526 | lua_lock(L); |
| 528 | luai_userstateresume(L, nargs); | 527 | luai_userstateresume(L, nargs); |
| 529 | ++G(L)->nCcalls; /* count resume */ | 528 | L->nCcalls = (from) ? from->nCcalls + 1 : 1; |
| 530 | L->nny = 0; /* allow yields */ | 529 | L->nny = 0; /* allow yields */ |
| 531 | api_checknelems(L, (L->status == LUA_OK) ? nargs + 1 : nargs); | 530 | api_checknelems(L, (L->status == LUA_OK) ? nargs + 1 : nargs); |
| 532 | status = luaD_rawrunprotected(L, resume, L->top - nargs); | 531 | status = luaD_rawrunprotected(L, resume, L->top - nargs); |
| @@ -546,7 +545,8 @@ LUA_API int lua_resume (lua_State *L, int nargs) { | |||
| 546 | lua_assert(status == L->status); | 545 | lua_assert(status == L->status); |
| 547 | } | 546 | } |
| 548 | L->nny = 1; /* do not allow yields */ | 547 | L->nny = 1; /* do not allow yields */ |
| 549 | --G(L)->nCcalls; | 548 | L->nCcalls--; |
| 549 | lua_assert(L->nCcalls == ((from) ? from->nCcalls : 0)); | ||
| 550 | lua_unlock(L); | 550 | lua_unlock(L); |
| 551 | return status; | 551 | return status; |
| 552 | } | 552 | } |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lparser.c,v 2.114 2011/07/15 12:50:29 roberto Exp roberto $ | 2 | ** $Id: lparser.c,v 2.115 2011/07/27 18:09:01 roberto Exp roberto $ |
| 3 | ** Lua Parser | 3 | ** Lua Parser |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -328,13 +328,13 @@ static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { | |||
| 328 | 328 | ||
| 329 | 329 | ||
| 330 | static void enterlevel (LexState *ls) { | 330 | static void enterlevel (LexState *ls) { |
| 331 | global_State *g = G(ls->L); | 331 | lua_State *L = ls->L; |
| 332 | ++g->nCcalls; | 332 | ++L->nCcalls; |
| 333 | checklimit(ls->fs, g->nCcalls, LUAI_MAXCCALLS, "syntax levels"); | 333 | checklimit(ls->fs, L->nCcalls, LUAI_MAXCCALLS, "syntax levels"); |
| 334 | } | 334 | } |
| 335 | 335 | ||
| 336 | 336 | ||
| 337 | #define leavelevel(ls) (G((ls)->L)->nCcalls--) | 337 | #define leavelevel(ls) ((ls)->L->nCcalls--) |
| 338 | 338 | ||
| 339 | 339 | ||
| 340 | static void closegoto (LexState *ls, int g, Labeldesc *label) { | 340 | static void closegoto (LexState *ls, int g, Labeldesc *label) { |
| @@ -1144,7 +1144,7 @@ static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) { | |||
| 1144 | primaryexp(ls, &nv.v); | 1144 | primaryexp(ls, &nv.v); |
| 1145 | if (nv.v.k != VINDEXED) | 1145 | if (nv.v.k != VINDEXED) |
| 1146 | check_conflict(ls, lh, &nv.v); | 1146 | check_conflict(ls, lh, &nv.v); |
| 1147 | checklimit(ls->fs, nvars, LUAI_MAXCCALLS - G(ls->L)->nCcalls, | 1147 | checklimit(ls->fs, nvars, LUAI_MAXCCALLS - ls->L->nCcalls, |
| 1148 | "variable names"); | 1148 | "variable names"); |
| 1149 | assignment(ls, &nv, nvars+1); | 1149 | assignment(ls, &nv, nvars+1); |
| 1150 | } | 1150 | } |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lstate.c,v 2.89 2010/12/20 19:40:07 roberto Exp roberto $ | 2 | ** $Id: lstate.c,v 2.90 2011/08/09 20:58:29 roberto Exp roberto $ |
| 3 | ** Global State | 3 | ** Global State |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -171,6 +171,7 @@ static void preinit_state (lua_State *L, global_State *g) { | |||
| 171 | L->ci = NULL; | 171 | L->ci = NULL; |
| 172 | L->stacksize = 0; | 172 | L->stacksize = 0; |
| 173 | L->errorJmp = NULL; | 173 | L->errorJmp = NULL; |
| 174 | L->nCcalls = 0; | ||
| 174 | L->hook = NULL; | 175 | L->hook = NULL; |
| 175 | L->hookmask = 0; | 176 | L->hookmask = 0; |
| 176 | L->basehookcount = 0; | 177 | L->basehookcount = 0; |
| @@ -237,7 +238,6 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { | |||
| 237 | g->currentwhite = bit2mask(WHITE0BIT, FIXEDBIT); | 238 | g->currentwhite = bit2mask(WHITE0BIT, FIXEDBIT); |
| 238 | L->marked = luaC_white(g); | 239 | L->marked = luaC_white(g); |
| 239 | g->gckind = KGC_NORMAL; | 240 | g->gckind = KGC_NORMAL; |
| 240 | g->nCcalls = 0; | ||
| 241 | preinit_state(L, g); | 241 | preinit_state(L, g); |
| 242 | g->frealloc = f; | 242 | g->frealloc = f; |
| 243 | g->ud = ud; | 243 | g->ud = ud; |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lstate.h,v 2.71 2010/12/20 19:40:07 roberto Exp roberto $ | 2 | ** $Id: lstate.h,v 2.72 2011/06/02 19:31:40 roberto Exp roberto $ |
| 3 | ** Global State | 3 | ** Global State |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -118,7 +118,6 @@ typedef struct global_State { | |||
| 118 | lu_mem lastmajormem; /* memory in use after last major collection */ | 118 | lu_mem lastmajormem; /* memory in use after last major collection */ |
| 119 | stringtable strt; /* hash table for strings */ | 119 | stringtable strt; /* hash table for strings */ |
| 120 | TValue l_registry; | 120 | TValue l_registry; |
| 121 | unsigned short nCcalls; /* number of nested C calls */ | ||
| 122 | lu_byte currentwhite; | 121 | lu_byte currentwhite; |
| 123 | lu_byte gcstate; /* state of garbage collector */ | 122 | lu_byte gcstate; /* state of garbage collector */ |
| 124 | lu_byte gckind; /* kind of GC running */ | 123 | lu_byte gckind; /* kind of GC running */ |
| @@ -161,6 +160,7 @@ struct lua_State { | |||
| 161 | StkId stack; /* stack base */ | 160 | StkId stack; /* stack base */ |
| 162 | int stacksize; | 161 | int stacksize; |
| 163 | unsigned short nny; /* number of non-yieldable calls in stack */ | 162 | unsigned short nny; /* number of non-yieldable calls in stack */ |
| 163 | unsigned short nCcalls; /* number of nested C calls */ | ||
| 164 | lu_byte hookmask; | 164 | lu_byte hookmask; |
| 165 | lu_byte allowhook; | 165 | lu_byte allowhook; |
| 166 | int basehookcount; | 166 | int basehookcount; |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ltests.c,v 2.120 2011/06/24 14:36:21 roberto Exp roberto $ | 2 | ** $Id: ltests.c,v 2.121 2011/07/02 15:59:17 roberto Exp roberto $ |
| 3 | ** Internal Module for Debugging of the Lua Implementation | 3 | ** Internal Module for Debugging of the Lua Implementation |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -1210,7 +1210,7 @@ static int runC (lua_State *L, lua_State *L1, const char *pc) { | |||
| 1210 | } | 1210 | } |
| 1211 | else if EQ("resume") { | 1211 | else if EQ("resume") { |
| 1212 | int i = getindex; | 1212 | int i = getindex; |
| 1213 | status = lua_resume(lua_tothread(L1, i), getnum); | 1213 | status = lua_resume(lua_tothread(L1, i), L, getnum); |
| 1214 | } | 1214 | } |
| 1215 | else if EQ("pushstatus") { | 1215 | else if EQ("pushstatus") { |
| 1216 | pushcode(L1, status); | 1216 | pushcode(L1, status); |
| @@ -1397,7 +1397,7 @@ static int coresume (lua_State *L) { | |||
| 1397 | int status; | 1397 | int status; |
| 1398 | lua_State *co = lua_tothread(L, 1); | 1398 | lua_State *co = lua_tothread(L, 1); |
| 1399 | luaL_argcheck(L, co, 1, "coroutine expected"); | 1399 | luaL_argcheck(L, co, 1, "coroutine expected"); |
| 1400 | status = lua_resume(co, 0); | 1400 | status = lua_resume(co, L, 0); |
| 1401 | if (status != LUA_OK && status != LUA_YIELD) { | 1401 | if (status != LUA_OK && status != LUA_YIELD) { |
| 1402 | lua_pushboolean(L, 0); | 1402 | lua_pushboolean(L, 0); |
| 1403 | lua_insert(L, -2); | 1403 | lua_insert(L, -2); |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lua.h,v 1.277 2011/04/18 14:15:48 roberto Exp roberto $ | 2 | ** $Id: lua.h,v 1.278 2011/07/02 16:00:15 roberto Exp roberto $ |
| 3 | ** Lua - A Scripting Language | 3 | ** Lua - A Scripting Language |
| 4 | ** Lua.org, PUC-Rio, Brazil (http://www.lua.org) | 4 | ** Lua.org, PUC-Rio, Brazil (http://www.lua.org) |
| 5 | ** See Copyright Notice at the end of this file | 5 | ** See Copyright Notice at the end of this file |
| @@ -261,7 +261,7 @@ LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data); | |||
| 261 | LUA_API int (lua_yieldk) (lua_State *L, int nresults, int ctx, | 261 | LUA_API int (lua_yieldk) (lua_State *L, int nresults, int ctx, |
| 262 | lua_CFunction k); | 262 | lua_CFunction k); |
| 263 | #define lua_yield(L,n) lua_yieldk(L, (n), 0, NULL) | 263 | #define lua_yield(L,n) lua_yieldk(L, (n), 0, NULL) |
| 264 | LUA_API int (lua_resume) (lua_State *L, int narg); | 264 | LUA_API int (lua_resume) (lua_State *L, lua_State *from, int narg); |
| 265 | LUA_API int (lua_status) (lua_State *L); | 265 | LUA_API int (lua_status) (lua_State *L); |
| 266 | 266 | ||
| 267 | /* | 267 | /* |
