aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ldo.c30
-rw-r--r--lparser.c11
-rw-r--r--lstate.c7
-rw-r--r--lstate.h5
4 files changed, 32 insertions, 21 deletions
diff --git a/ldo.c b/ldo.c
index 6ce1e519..7b41866a 100644
--- a/ldo.c
+++ b/ldo.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldo.c,v 2.38 2006/06/05 19:36:14 roberto Exp roberto $ 2** $Id: ldo.c,v 2.39 2006/07/11 15:53:29 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*/
@@ -83,7 +83,6 @@ static void resetstack (lua_State *L, int status) {
83 L->base = L->ci->base; 83 L->base = L->ci->base;
84 luaF_close(L, L->base); /* close possible 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;
87 L->allowhook = 1; 86 L->allowhook = 1;
88 restore_stack_limit(L); 87 restore_stack_limit(L);
89 L->errfunc = 0; 88 L->errfunc = 0;
@@ -109,6 +108,7 @@ void luaD_throw (lua_State *L, int errcode) {
109 108
110 109
111int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) { 110int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) {
111 unsigned short oldnCcalls = G(L)->nCcalls;
112 struct lua_longjmp lj; 112 struct lua_longjmp lj;
113 lj.status = 0; 113 lj.status = 0;
114 lj.previous = L->errorJmp; /* chain new error handler */ 114 lj.previous = L->errorJmp; /* chain new error handler */
@@ -117,6 +117,7 @@ int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) {
117 (*f)(L, ud); 117 (*f)(L, ud);
118 ); 118 );
119 L->errorJmp = lj.previous; /* restore old error handler */ 119 L->errorJmp = lj.previous; /* restore old error handler */
120 G(L)->nCcalls = oldnCcalls;
120 return lj.status; 121 return lj.status;
121} 122}
122 123
@@ -369,15 +370,17 @@ int luaD_poscall (lua_State *L, StkId firstResult) {
369** function position. 370** function position.
370*/ 371*/
371void luaD_call (lua_State *L, StkId func, int nResults) { 372void luaD_call (lua_State *L, StkId func, int nResults) {
372 if (++L->nCcalls >= LUAI_MAXCCALLS) { 373 global_State *g = G(L);
373 if (L->nCcalls == LUAI_MAXCCALLS) 374 lua_assert(g->nCcalls >= L->baseCcalls);
375 if (++g->nCcalls >= LUAI_MAXCCALLS) {
376 if (g->nCcalls == LUAI_MAXCCALLS)
374 luaG_runerror(L, "C stack overflow"); 377 luaG_runerror(L, "C stack overflow");
375 else if (L->nCcalls >= (LUAI_MAXCCALLS + (LUAI_MAXCCALLS>>3))) 378 else if (g->nCcalls >= (LUAI_MAXCCALLS + (LUAI_MAXCCALLS>>3)))
376 luaD_throw(L, LUA_ERRERR); /* error while handing stack error */ 379 luaD_throw(L, LUA_ERRERR); /* error while handing stack error */
377 } 380 }
378 if (luaD_precall(L, func, nResults) == PCRLUA) /* is a Lua function? */ 381 if (luaD_precall(L, func, nResults) == PCRLUA) /* is a Lua function? */
379 luaV_execute(L, 1); /* call it */ 382 luaV_execute(L, 1); /* call it */
380 L->nCcalls--; 383 g->nCcalls--;
381 luaC_checkGC(L); 384 luaC_checkGC(L);
382} 385}
383 386
@@ -426,15 +429,22 @@ LUA_API int lua_resume (lua_State *L, int nargs) {
426 return resume_error(L, "cannot resume non-suspended coroutine"); 429 return resume_error(L, "cannot resume non-suspended coroutine");
427 } 430 }
428 luai_userstateresume(L, nargs); 431 luai_userstateresume(L, nargs);
429 lua_assert(L->errfunc == 0 && L->nCcalls == 0); 432 lua_assert(L->errfunc == 0 && L->baseCcalls == 0);
433 if (G(L)->nCcalls >= LUAI_MAXCCALLS)
434 return resume_error(L, "C stack overflow");
435 L->baseCcalls = ++G(L)->nCcalls;
430 status = luaD_rawrunprotected(L, resume, L->top - nargs); 436 status = luaD_rawrunprotected(L, resume, L->top - nargs);
431 if (status != 0) { /* error? */ 437 if (status != 0) { /* error? */
432 L->status = cast_byte(status); /* mark thread as `dead' */ 438 L->status = cast_byte(status); /* mark thread as `dead' */
433 luaD_seterrorobj(L, status, L->top); 439 luaD_seterrorobj(L, status, L->top);
434 L->ci->top = L->top; 440 L->ci->top = L->top;
435 } 441 }
436 else 442 else {
443 lua_assert(L->baseCcalls == G(L)->nCcalls);
437 status = L->status; 444 status = L->status;
445 }
446 --G(L)->nCcalls;
447 L->baseCcalls = 0;
438 lua_unlock(L); 448 lua_unlock(L);
439 return status; 449 return status;
440} 450}
@@ -443,7 +453,7 @@ LUA_API int lua_resume (lua_State *L, int nargs) {
443LUA_API int lua_yield (lua_State *L, int nresults) { 453LUA_API int lua_yield (lua_State *L, int nresults) {
444 luai_userstateyield(L, nresults); 454 luai_userstateyield(L, nresults);
445 lua_lock(L); 455 lua_lock(L);
446 if (L->nCcalls > 0) 456 if (G(L)->nCcalls > L->baseCcalls)
447 luaG_runerror(L, "attempt to yield across metamethod/C-call boundary"); 457 luaG_runerror(L, "attempt to yield across metamethod/C-call boundary");
448 L->base = L->top - nresults; /* protect stack slots below */ 458 L->base = L->top - nresults; /* protect stack slots below */
449 L->status = LUA_YIELD; 459 L->status = LUA_YIELD;
@@ -455,7 +465,6 @@ LUA_API int lua_yield (lua_State *L, int nresults) {
455int luaD_pcall (lua_State *L, Pfunc func, void *u, 465int luaD_pcall (lua_State *L, Pfunc func, void *u,
456 ptrdiff_t old_top, ptrdiff_t ef) { 466 ptrdiff_t old_top, ptrdiff_t ef) {
457 int status; 467 int status;
458 unsigned short oldnCcalls = L->nCcalls;
459 ptrdiff_t old_ci = saveci(L, L->ci); 468 ptrdiff_t old_ci = saveci(L, L->ci);
460 lu_byte old_allowhooks = L->allowhook; 469 lu_byte old_allowhooks = L->allowhook;
461 ptrdiff_t old_errfunc = L->errfunc; 470 ptrdiff_t old_errfunc = L->errfunc;
@@ -465,7 +474,6 @@ int luaD_pcall (lua_State *L, Pfunc func, void *u,
465 StkId oldtop = restorestack(L, old_top); 474 StkId oldtop = restorestack(L, old_top);
466 luaF_close(L, oldtop); /* close possible pending closures */ 475 luaF_close(L, oldtop); /* close possible pending closures */
467 luaD_seterrorobj(L, status, oldtop); 476 luaD_seterrorobj(L, status, oldtop);
468 L->nCcalls = oldnCcalls;
469 L->ci = restoreci(L, old_ci); 477 L->ci = restoreci(L, old_ci);
470 L->base = L->ci->base; 478 L->base = L->ci->base;
471 L->savedpc = L->ci->savedpc; 479 L->savedpc = L->ci->savedpc;
diff --git a/lparser.c b/lparser.c
index 349cfd10..4a2372d3 100644
--- a/lparser.c
+++ b/lparser.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lparser.c,v 2.44 2006/07/11 15:53:29 roberto Exp roberto $ 2** $Id: lparser.c,v 2.45 2006/07/12 19:02:50 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*/
@@ -73,7 +73,7 @@ static void errorlimit (FuncState *fs, int limit, const char *what) {
73 luaO_pushfstring(fs->L, "main function has more than %d %s", limit, what) : 73 luaO_pushfstring(fs->L, "main function has more than %d %s", limit, what) :
74 luaO_pushfstring(fs->L, "function at line %d has more than %d %s", 74 luaO_pushfstring(fs->L, "function at line %d has more than %d %s",
75 fs->f->linedefined, limit, what); 75 fs->f->linedefined, limit, what);
76 luaX_lexerror(fs->ls, msg, 0); 76 luaX_lexerror(fs->ls, msg, fs->ls->t.token);
77} 77}
78 78
79 79
@@ -274,12 +274,13 @@ static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) {
274 274
275 275
276static void enterlevel (LexState *ls) { 276static void enterlevel (LexState *ls) {
277 ++ls->L->nCcalls; 277 global_State *g = G(ls->L);
278 luaY_checklimit(ls->fs, ls->L->nCcalls, LUAI_MAXCCALLS, "syntax levels"); 278 ++g->nCcalls;
279 luaY_checklimit(ls->fs, g->nCcalls, LUAI_MAXCCALLS, "syntax levels");
279} 280}
280 281
281 282
282#define leavelevel(ls) ((ls)->L->nCcalls--) 283#define leavelevel(ls) (G((ls)->L)->nCcalls--)
283 284
284 285
285static void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isbreakable) { 286static void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isbreakable) {
diff --git a/lstate.c b/lstate.c
index c9aebcba..30ff3cbd 100644
--- a/lstate.c
+++ b/lstate.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lstate.c,v 2.36 2006/05/24 14:15:50 roberto Exp roberto $ 2** $Id: lstate.c,v 2.37 2006/07/11 15:53: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*/
@@ -94,7 +94,7 @@ static void preinit_state (lua_State *L, global_State *g) {
94 resethookcount(L); 94 resethookcount(L);
95 L->openupval = NULL; 95 L->openupval = NULL;
96 L->size_ci = 0; 96 L->size_ci = 0;
97 L->nCcalls = 0; 97 L->baseCcalls = 0;
98 L->status = 0; 98 L->status = 0;
99 L->base_ci = L->ci = NULL; 99 L->base_ci = L->ci = NULL;
100 L->savedpc = NULL; 100 L->savedpc = NULL;
@@ -161,6 +161,7 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) {
161 g->currentwhite = bit2mask(WHITE0BIT, FIXEDBIT); 161 g->currentwhite = bit2mask(WHITE0BIT, FIXEDBIT);
162 L->marked = luaC_white(g); 162 L->marked = luaC_white(g);
163 g->emergencygc = 0; 163 g->emergencygc = 0;
164 g->nCcalls = 0;
164 set2bits(L->marked, FIXEDBIT, SFIXEDBIT); 165 set2bits(L->marked, FIXEDBIT, SFIXEDBIT);
165 preinit_state(L, g); 166 preinit_state(L, g);
166 g->frealloc = f; 167 g->frealloc = f;
@@ -214,7 +215,7 @@ LUA_API void lua_close (lua_State *L) {
214 do { /* repeat until no more errors */ 215 do { /* repeat until no more errors */
215 L->ci = L->base_ci; 216 L->ci = L->base_ci;
216 L->base = L->top = L->ci->base; 217 L->base = L->top = L->ci->base;
217 L->nCcalls = 0; 218 G(L)->nCcalls = 0;
218 } while (luaD_rawrunprotected(L, callallgcTM, NULL) != 0); 219 } while (luaD_rawrunprotected(L, callallgcTM, NULL) != 0);
219 lua_assert(G(L)->tmudata == NULL); 220 lua_assert(G(L)->tmudata == NULL);
220 luai_userstateclose(L); 221 luai_userstateclose(L);
diff --git a/lstate.h b/lstate.h
index 89fc82d1..d96e7b3b 100644
--- a/lstate.h
+++ b/lstate.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lstate.h,v 2.24 2006/02/06 18:27:59 roberto Exp roberto $ 2** $Id: lstate.h,v 2.25 2006/07/11 15:53:29 roberto Exp $
3** Global State 3** Global State
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -69,6 +69,7 @@ typedef struct global_State {
69 stringtable strt; /* hash table for strings */ 69 stringtable strt; /* hash table for strings */
70 lua_Alloc frealloc; /* function to reallocate memory */ 70 lua_Alloc frealloc; /* function to reallocate memory */
71 void *ud; /* auxiliary data to `frealloc' */ 71 void *ud; /* auxiliary data to `frealloc' */
72 unsigned short nCcalls; /* number of nested C calls */
72 lu_byte currentwhite; 73 lu_byte currentwhite;
73 lu_byte gcstate; /* state of garbage collector */ 74 lu_byte gcstate; /* state of garbage collector */
74 lu_byte emergencygc; /* true when collect was trigged by alloc error */ 75 lu_byte emergencygc; /* true when collect was trigged by alloc error */
@@ -112,7 +113,7 @@ struct lua_State {
112 CallInfo *base_ci; /* array of CallInfo's */ 113 CallInfo *base_ci; /* array of CallInfo's */
113 int stacksize; 114 int stacksize;
114 int size_ci; /* size of array `base_ci' */ 115 int size_ci; /* size of array `base_ci' */
115 unsigned short nCcalls; /* number of nested C calls */ 116 unsigned short baseCcalls; /* number of nested C calls when resuming */
116 lu_byte hookmask; 117 lu_byte hookmask;
117 lu_byte allowhook; 118 lu_byte allowhook;
118 int basehookcount; 119 int basehookcount;