aboutsummaryrefslogtreecommitdiff
path: root/lstate.c
diff options
context:
space:
mode:
Diffstat (limited to 'lstate.c')
-rw-r--r--lstate.c45
1 files changed, 25 insertions, 20 deletions
diff --git a/lstate.c b/lstate.c
index 8cda3072..bd1b5120 100644
--- a/lstate.c
+++ b/lstate.c
@@ -97,25 +97,8 @@ void luaE_setdebt (global_State *g, l_mem debt) {
97 97
98 98
99LUA_API int lua_setcstacklimit (lua_State *L, unsigned int limit) { 99LUA_API int lua_setcstacklimit (lua_State *L, unsigned int limit) {
100 global_State *g = G(L); 100 UNUSED(L); UNUSED(limit);
101 int ccalls; 101 return LUAI_MAXCCALLS; /* warning?? */
102 luaE_freeCI(L); /* release unused CIs */
103 ccalls = getCcalls(L);
104 if (limit >= 40000)
105 return 0; /* out of bounds */
106 limit += CSTACKERR;
107 if (L != g-> mainthread)
108 return 0; /* only main thread can change the C stack */
109 else if (ccalls <= CSTACKERR)
110 return 0; /* handling overflow */
111 else {
112 int diff = limit - g->Cstacklimit;
113 if (ccalls + diff <= CSTACKERR)
114 return 0; /* new limit would cause an overflow */
115 g->Cstacklimit = limit; /* set new limit */
116 L->nCcalls += diff; /* correct 'nCcalls' */
117 return limit - diff - CSTACKERR; /* success; return previous limit */
118 }
119} 102}
120 103
121 104
@@ -172,6 +155,28 @@ void luaE_shrinkCI (lua_State *L) {
172} 155}
173 156
174 157
158/*
159** Called when 'getCcalls(L)' larger or equal to LUAI_MAXCCALLS.
160** If equal, raises an overflow error. If value is larger than
161** LUAI_MAXCCALLS (which means it is handling an overflow) but
162** not much larger, does not report an error (to allow overflow
163** handling to work).
164*/
165void luaE_checkcstack (lua_State *L) {
166 if (getCcalls(L) == LUAI_MAXCCALLS)
167 luaG_runerror(L, "C stack overflow");
168 else if (getCcalls(L) >= (LUAI_MAXCCALLS / 10 * 11))
169 luaD_throw(L, LUA_ERRERR); /* error while handing stack error */
170}
171
172
173LUAI_FUNC void luaE_incCstack (lua_State *L) {
174 L->nCcalls++;
175 if (getCcalls(L) >= LUAI_MAXCCALLS)
176 luaE_checkcstack(L);
177}
178
179
175static void stack_init (lua_State *L1, lua_State *L) { 180static void stack_init (lua_State *L1, lua_State *L) {
176 int i; CallInfo *ci; 181 int i; CallInfo *ci;
177 /* initialize stack array */ 182 /* initialize stack array */
@@ -357,7 +362,7 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) {
357 preinit_thread(L, g); 362 preinit_thread(L, g);
358 g->allgc = obj2gco(L); /* by now, only object is the main thread */ 363 g->allgc = obj2gco(L); /* by now, only object is the main thread */
359 L->next = NULL; 364 L->next = NULL;
360 g->Cstacklimit = L->nCcalls = 0; 365 L->nCcalls = 0;
361 incnny(L); /* main thread is always non yieldable */ 366 incnny(L); /* main thread is always non yieldable */
362 g->frealloc = f; 367 g->frealloc = f;
363 g->ud = ud; 368 g->ud = ud;