diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2009-07-15 14:26:14 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2009-07-15 14:26:14 -0300 |
commit | f76f4cb79d84af4a7be9e0d75553bbe05a3ae90c (patch) | |
tree | dd9d1f8f3fb8c69f7617fe5688d7b1178bb7190e | |
parent | abb85fc059a5d6427b9dc36edee1619f2c7a1da8 (diff) | |
download | lua-f76f4cb79d84af4a7be9e0d75553bbe05a3ae90c.tar.gz lua-f76f4cb79d84af4a7be9e0d75553bbe05a3ae90c.tar.bz2 lua-f76f4cb79d84af4a7be9e0d75553bbe05a3ae90c.zip |
new way to control stack overflow, controling only total size of the stack
-rw-r--r-- | lapi.c | 17 | ||||
-rw-r--r-- | lauxlib.c | 25 | ||||
-rw-r--r-- | ldo.c | 68 | ||||
-rw-r--r-- | ldo.h | 3 | ||||
-rw-r--r-- | llimits.h | 6 | ||||
-rw-r--r-- | lstate.c | 19 | ||||
-rw-r--r-- | lstate.h | 3 | ||||
-rw-r--r-- | ltests.c | 3 | ||||
-rw-r--r-- | lua.h | 4 | ||||
-rw-r--r-- | luaconf.h | 30 |
10 files changed, 100 insertions, 78 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lapi.c,v 2.83 2009/06/18 18:59:18 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 2.84 2009/06/19 14:21:23 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 | */ |
@@ -86,14 +86,15 @@ LUA_API int lua_checkstack (lua_State *L, int size) { | |||
86 | int res = 1; | 86 | int res = 1; |
87 | CallInfo *ci = L->ci; | 87 | CallInfo *ci = L->ci; |
88 | lua_lock(L); | 88 | lua_lock(L); |
89 | if (size > LUAI_MAXCSTACK || | 89 | if (L->stack_last - L->top <= size) { /* need to grow stack? */ |
90 | (L->top - (ci->func + 1) + size) > LUAI_MAXCSTACK) | 90 | int inuse = L->top - L->stack + EXTRA_STACK; |
91 | res = 0; /* stack overflow */ | 91 | if (inuse > LUAI_MAXSTACK - size) /* can grow without overflow? */ |
92 | else if (size > 0) { | 92 | res = 0; /* no */ |
93 | luaD_checkstack(L, size); | 93 | else |
94 | if (ci->top < L->top + size) | 94 | luaD_growstack(L, size); |
95 | ci->top = L->top + size; | ||
96 | } | 95 | } |
96 | if (res && ci->top < L->top + size) | ||
97 | ci->top = L->top + size; /* adjust frame top */ | ||
97 | lua_unlock(L); | 98 | lua_unlock(L); |
98 | return res; | 99 | return res; |
99 | } | 100 | } |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lauxlib.c,v 1.187 2009/06/18 18:59:58 roberto Exp roberto $ | 2 | ** $Id: lauxlib.c,v 1.188 2009/06/19 14:21:57 roberto Exp roberto $ |
3 | ** Auxiliary functions for building Lua libraries | 3 | ** Auxiliary functions for building Lua libraries |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -106,9 +106,16 @@ static void pushfuncname (lua_State *L, lua_Debug *ar) { | |||
106 | 106 | ||
107 | static int countlevels (lua_State *L) { | 107 | static int countlevels (lua_State *L) { |
108 | lua_Debug ar; | 108 | lua_Debug ar; |
109 | int level = 1; | 109 | int li = 1, le = 1; |
110 | while (lua_getstack(L, level, &ar)) level++; | 110 | /* find an upper bound */ |
111 | return level; | 111 | while (lua_getstack(L, le, &ar)) { li = le; le *= 2; } |
112 | /* do a binary search */ | ||
113 | while (li < le) { | ||
114 | int m = (li + le)/2; | ||
115 | if (lua_getstack(L, m, &ar)) li = m + 1; | ||
116 | else le = m; | ||
117 | } | ||
118 | return le - 1; | ||
112 | } | 119 | } |
113 | 120 | ||
114 | 121 | ||
@@ -263,9 +270,13 @@ LUALIB_API int luaL_checkoption (lua_State *L, int narg, const char *def, | |||
263 | } | 270 | } |
264 | 271 | ||
265 | 272 | ||
266 | LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *mes) { | 273 | LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *msg) { |
267 | if (!lua_checkstack(L, space)) | 274 | if (!lua_checkstack(L, space)) { |
268 | luaL_error(L, "stack overflow (%s)", mes); | 275 | if (msg) |
276 | luaL_error(L, "stack overflow (%s)", msg); | ||
277 | else | ||
278 | luaL_error(L, "stack overflow"); | ||
279 | } | ||
269 | } | 280 | } |
270 | 281 | ||
271 | 282 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ldo.c,v 2.64 2009/05/21 20:06:11 roberto Exp roberto $ | 2 | ** $Id: ldo.c,v 2.65 2009/06/01 19:09:26 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 | */ |
@@ -70,12 +70,6 @@ void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop) { | |||
70 | } | 70 | } |
71 | 71 | ||
72 | 72 | ||
73 | static void restore_stack_limit (lua_State *L) { | ||
74 | if (L->nci >= LUAI_MAXCALLS) /* stack overflow? */ | ||
75 | luaE_freeCI(L); /* erase all extras CIs */ | ||
76 | } | ||
77 | |||
78 | |||
79 | void luaD_throw (lua_State *L, int errcode) { | 73 | void luaD_throw (lua_State *L, int errcode) { |
80 | if (L->errorJmp) { /* thread has an error handler? */ | 74 | if (L->errorJmp) { /* thread has an error handler? */ |
81 | L->errorJmp->status = errcode; /* set status */ | 75 | L->errorJmp->status = errcode; /* set status */ |
@@ -130,25 +124,63 @@ static void correctstack (lua_State *L, TValue *oldstack) { | |||
130 | } | 124 | } |
131 | 125 | ||
132 | 126 | ||
127 | /* some space for error handling */ | ||
128 | #define ERRORSTACKSIZE (LUAI_MAXSTACK + 200) | ||
129 | |||
130 | |||
133 | void luaD_reallocstack (lua_State *L, int newsize) { | 131 | void luaD_reallocstack (lua_State *L, int newsize) { |
134 | TValue *oldstack = L->stack; | 132 | TValue *oldstack = L->stack; |
135 | int lim = L->stacksize; | 133 | int lim = L->stacksize; |
136 | int realsize = newsize + 1 + EXTRA_STACK; | 134 | lua_assert(newsize <= LUAI_MAXSTACK || newsize == ERRORSTACKSIZE); |
137 | lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK - 1); | 135 | lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK); |
138 | luaM_reallocvector(L, L->stack, L->stacksize, realsize, TValue); | 136 | luaM_reallocvector(L, L->stack, L->stacksize, newsize, TValue); |
139 | for (; lim < realsize; lim++) | 137 | for (; lim < newsize; lim++) |
140 | setnilvalue(L->stack + lim); /* erase new segment */ | 138 | setnilvalue(L->stack + lim); /* erase new segment */ |
141 | L->stacksize = realsize; | 139 | L->stacksize = newsize; |
142 | L->stack_last = L->stack+newsize; | 140 | L->stack_last = L->stack + newsize - EXTRA_STACK; |
143 | correctstack(L, oldstack); | 141 | correctstack(L, oldstack); |
144 | } | 142 | } |
145 | 143 | ||
146 | 144 | ||
147 | void luaD_growstack (lua_State *L, int n) { | 145 | void luaD_growstack (lua_State *L, int n) { |
148 | if (n <= L->stacksize) /* double size is enough? */ | 146 | int size = L->stacksize; |
149 | luaD_reallocstack(L, 2*L->stacksize); | 147 | if (size > LUAI_MAXSTACK) /* error after extra size? */ |
148 | luaD_throw(L, LUA_ERRERR); | ||
149 | else { | ||
150 | int needed = L->top - L->stack + n + EXTRA_STACK; | ||
151 | int newsize = 2 * size; | ||
152 | if (newsize > LUAI_MAXSTACK) newsize = LUAI_MAXSTACK; | ||
153 | if (newsize < needed) newsize = needed; | ||
154 | if (newsize > LUAI_MAXSTACK) { /* stack overflow? */ | ||
155 | luaD_reallocstack(L, ERRORSTACKSIZE); | ||
156 | luaG_runerror(L, "stack overflow"); | ||
157 | } | ||
158 | else | ||
159 | luaD_reallocstack(L, newsize); | ||
160 | } | ||
161 | } | ||
162 | |||
163 | |||
164 | static int stackinuse (lua_State *L) { | ||
165 | CallInfo *ci; | ||
166 | StkId lim = L->top; | ||
167 | for (ci = L->ci; ci != NULL; ci = ci->previous) { | ||
168 | lua_assert(ci->top <= L->stack_last); | ||
169 | if (lim < ci->top) lim = ci->top; | ||
170 | } | ||
171 | return cast_int(lim - L->stack) + 1; /* part of stack in use */ | ||
172 | } | ||
173 | |||
174 | |||
175 | void luaD_shrinkstack (lua_State *L) { | ||
176 | int inuse = stackinuse(L); | ||
177 | int goodsize = inuse + (inuse / 8) + 2*EXTRA_STACK; | ||
178 | if (goodsize > LUAI_MAXSTACK) goodsize = LUAI_MAXSTACK; | ||
179 | if (inuse > LUAI_MAXSTACK || /* handling stack overflow? */ | ||
180 | goodsize >= L->stacksize) /* would grow instead of shrink? */ | ||
181 | condmovestack(L); /* don't change stack (change only for debugging) */ | ||
150 | else | 182 | else |
151 | luaD_reallocstack(L, L->stacksize + n); | 183 | luaD_reallocstack(L, goodsize); /* shrink it */ |
152 | } | 184 | } |
153 | 185 | ||
154 | 186 | ||
@@ -427,7 +459,7 @@ static int recover (lua_State *L, int status) { | |||
427 | L->ci = ci; | 459 | L->ci = ci; |
428 | L->allowhook = ci->u.c.old_allowhook; | 460 | L->allowhook = ci->u.c.old_allowhook; |
429 | L->nny = 0; /* should be zero to be yieldable */ | 461 | L->nny = 0; /* should be zero to be yieldable */ |
430 | restore_stack_limit(L); | 462 | luaD_shrinkstack(L); |
431 | L->errfunc = ci->u.c.old_errfunc; | 463 | L->errfunc = ci->u.c.old_errfunc; |
432 | ci->callstatus |= CIST_STAT; /* call has error status */ | 464 | ci->callstatus |= CIST_STAT; /* call has error status */ |
433 | ci->u.c.status = status; /* (here it is) */ | 465 | ci->u.c.status = status; /* (here it is) */ |
@@ -499,7 +531,7 @@ int luaD_pcall (lua_State *L, Pfunc func, void *u, | |||
499 | L->ci = old_ci; | 531 | L->ci = old_ci; |
500 | L->allowhook = old_allowhooks; | 532 | L->allowhook = old_allowhooks; |
501 | L->nny = old_nny; | 533 | L->nny = old_nny; |
502 | restore_stack_limit(L); | 534 | luaD_shrinkstack(L); |
503 | } | 535 | } |
504 | L->errfunc = old_errfunc; | 536 | L->errfunc = old_errfunc; |
505 | return status; | 537 | return status; |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ldo.h,v 2.13 2009/06/08 19:35:59 roberto Exp roberto $ | 2 | ** $Id: ldo.h,v 2.14 2009/07/08 16:06:51 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 | */ |
@@ -37,6 +37,7 @@ LUAI_FUNC int luaD_poscall (lua_State *L, StkId firstResult); | |||
37 | LUAI_FUNC void luaD_reallocCI (lua_State *L, int newsize); | 37 | LUAI_FUNC void luaD_reallocCI (lua_State *L, int newsize); |
38 | LUAI_FUNC void luaD_reallocstack (lua_State *L, int newsize); | 38 | LUAI_FUNC void luaD_reallocstack (lua_State *L, int newsize); |
39 | LUAI_FUNC void luaD_growstack (lua_State *L, int n); | 39 | LUAI_FUNC void luaD_growstack (lua_State *L, int n); |
40 | LUAI_FUNC void luaD_shrinkstack (lua_State *L); | ||
40 | 41 | ||
41 | LUAI_FUNC void luaD_throw (lua_State *L, int errcode); | 42 | LUAI_FUNC void luaD_throw (lua_State *L, int errcode); |
42 | LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud); | 43 | LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud); |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: llimits.h,v 1.71 2009/06/08 19:35:59 roberto Exp roberto $ | 2 | ** $Id: llimits.h,v 1.72 2009/07/01 16:14:15 roberto Exp roberto $ |
3 | ** Limits, basic types, and some other `installation-dependent' definitions | 3 | ** Limits, basic types, and some other `installation-dependent' definitions |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -122,8 +122,8 @@ typedef lu_int32 Instruction; | |||
122 | #ifndef HARDSTACKTESTS | 122 | #ifndef HARDSTACKTESTS |
123 | #define condmovestack(L) ((void)0) | 123 | #define condmovestack(L) ((void)0) |
124 | #else | 124 | #else |
125 | #define condmovestack(L) /* realloc stack keeping its size */ \ | 125 | /* realloc stack keeping its size */ |
126 | luaD_reallocstack((L), (L)->stacksize - EXTRA_STACK - 1) | 126 | #define condmovestack(L) luaD_reallocstack((L), (L)->stacksize) |
127 | #endif | 127 | #endif |
128 | 128 | ||
129 | #endif | 129 | #endif |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lstate.c,v 2.55 2009/06/01 19:09:26 roberto Exp roberto $ | 2 | ** $Id: lstate.c,v 2.56 2009/06/18 18:59:18 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 | */ |
@@ -52,12 +52,6 @@ CallInfo *luaE_extendCI (lua_State *L) { | |||
52 | L->ci->next = ci; | 52 | L->ci->next = ci; |
53 | ci->previous = L->ci; | 53 | ci->previous = L->ci; |
54 | ci->next = NULL; | 54 | ci->next = NULL; |
55 | if (++L->nci >= LUAI_MAXCALLS) { | ||
56 | if (L->nci == LUAI_MAXCALLS) /* overflow? */ | ||
57 | luaG_runerror(L, "stack overflow"); | ||
58 | if (L->nci >= LUAI_MAXCALLS + LUAI_EXTRACALLS) /* again? */ | ||
59 | luaD_throw(L, LUA_ERRERR); /* error while handling overflow */ | ||
60 | } | ||
61 | return ci; | 55 | return ci; |
62 | } | 56 | } |
63 | 57 | ||
@@ -69,7 +63,6 @@ void luaE_freeCI (lua_State *L) { | |||
69 | while ((ci = next) != NULL) { | 63 | while ((ci = next) != NULL) { |
70 | next = ci->next; | 64 | next = ci->next; |
71 | luaM_free(L, ci); | 65 | luaM_free(L, ci); |
72 | L->nci--; | ||
73 | } | 66 | } |
74 | } | 67 | } |
75 | 68 | ||
@@ -77,12 +70,12 @@ void luaE_freeCI (lua_State *L) { | |||
77 | static void stack_init (lua_State *L1, lua_State *L) { | 70 | static void stack_init (lua_State *L1, lua_State *L) { |
78 | int i; | 71 | int i; |
79 | /* initialize stack array */ | 72 | /* initialize stack array */ |
80 | L1->stack = luaM_newvector(L, BASIC_STACK_SIZE + EXTRA_STACK, TValue); | 73 | L1->stack = luaM_newvector(L, BASIC_STACK_SIZE, TValue); |
81 | L1->stacksize = BASIC_STACK_SIZE + EXTRA_STACK; | 74 | L1->stacksize = BASIC_STACK_SIZE; |
82 | for (i = 0; i < BASIC_STACK_SIZE + EXTRA_STACK; i++) | 75 | for (i = 0; i < BASIC_STACK_SIZE; i++) |
83 | setnilvalue(L1->stack + i); /* erase new stack */ | 76 | setnilvalue(L1->stack + i); /* erase new stack */ |
84 | L1->top = L1->stack; | 77 | L1->top = L1->stack; |
85 | L1->stack_last = L1->stack+(L1->stacksize - EXTRA_STACK)-1; | 78 | L1->stack_last = L1->stack + L1->stacksize - EXTRA_STACK; |
86 | /* initialize first ci */ | 79 | /* initialize first ci */ |
87 | L1->ci->func = L1->top; | 80 | L1->ci->func = L1->top; |
88 | setnilvalue(L1->top++); /* 'function' entry for this 'ci' */ | 81 | setnilvalue(L1->top++); /* 'function' entry for this 'ci' */ |
@@ -94,7 +87,6 @@ static void stack_init (lua_State *L1, lua_State *L) { | |||
94 | static void freestack (lua_State *L) { | 87 | static void freestack (lua_State *L) { |
95 | L->ci = &L->base_ci; /* reset 'ci' list */ | 88 | L->ci = &L->base_ci; /* reset 'ci' list */ |
96 | luaE_freeCI(L); | 89 | luaE_freeCI(L); |
97 | lua_assert(L->nci == 0); | ||
98 | luaM_freearray(L, L->stack, L->stacksize); | 90 | luaM_freearray(L, L->stack, L->stacksize); |
99 | } | 91 | } |
100 | 92 | ||
@@ -131,7 +123,6 @@ static void preinit_state (lua_State *L, global_State *g) { | |||
131 | L->status = LUA_OK; | 123 | L->status = LUA_OK; |
132 | L->base_ci.next = L->base_ci.previous = NULL; | 124 | L->base_ci.next = L->base_ci.previous = NULL; |
133 | L->ci = &L->base_ci; | 125 | L->ci = &L->base_ci; |
134 | L->nci = 0; | ||
135 | L->errfunc = 0; | 126 | L->errfunc = 0; |
136 | setnilvalue(gt(L)); | 127 | setnilvalue(gt(L)); |
137 | } | 128 | } |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lstate.h,v 2.44 2009/06/01 19:09:26 roberto Exp roberto $ | 2 | ** $Id: lstate.h,v 2.45 2009/06/18 18:59:18 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 | */ |
@@ -163,7 +163,6 @@ struct lua_State { | |||
163 | StkId top; /* first free slot in the stack */ | 163 | StkId top; /* first free slot in the stack */ |
164 | global_State *l_G; | 164 | global_State *l_G; |
165 | CallInfo *ci; /* call info for current function */ | 165 | CallInfo *ci; /* call info for current function */ |
166 | int nci; /* number of total CallInfo structures linked */ | ||
167 | const Instruction *oldpc; /* last pc traced */ | 166 | const Instruction *oldpc; /* last pc traced */ |
168 | StkId stack_last; /* last free slot in the stack */ | 167 | StkId stack_last; /* last free slot in the stack */ |
169 | StkId stack; /* stack base */ | 168 | StkId stack; /* stack base */ |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ltests.c,v 2.65 2009/06/15 19:51:31 roberto Exp roberto $ | 2 | ** $Id: ltests.c,v 2.66 2009/06/17 17:53:14 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 | */ |
@@ -570,7 +570,6 @@ static int stacklevel (lua_State *L) { | |||
570 | unsigned long a = 0; | 570 | unsigned long a = 0; |
571 | lua_pushinteger(L, (L->top - L->stack)); | 571 | lua_pushinteger(L, (L->top - L->stack)); |
572 | lua_pushinteger(L, (L->stack_last - L->stack)); | 572 | lua_pushinteger(L, (L->stack_last - L->stack)); |
573 | lua_pushinteger(L, L->nci); | ||
574 | lua_pushinteger(L, (unsigned long)&a); | 573 | lua_pushinteger(L, (unsigned long)&a); |
575 | return 5; | 574 | return 5; |
576 | } | 575 | } |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lua.h,v 1.239 2009/06/17 17:49:44 roberto Exp roberto $ | 2 | ** $Id: lua.h,v 1.240 2009/06/18 18:59:18 roberto Exp roberto $ |
3 | ** Lua - An Extensible Extension Language | 3 | ** Lua - An Extensible Extension 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 |
@@ -33,7 +33,7 @@ | |||
33 | /* | 33 | /* |
34 | ** pseudo-indices | 34 | ** pseudo-indices |
35 | */ | 35 | */ |
36 | #define LUA_REGISTRYINDEX (-(LUAI_MCS_AUX) - 1) | 36 | #define LUA_REGISTRYINDEX LUAI_FIRSTPSEUDOIDX |
37 | #define LUA_ENVIRONINDEX (LUA_REGISTRYINDEX - 1) | 37 | #define LUA_ENVIRONINDEX (LUA_REGISTRYINDEX - 1) |
38 | #define LUA_GLOBALSINDEX (LUA_ENVIRONINDEX - 1) | 38 | #define LUA_GLOBALSINDEX (LUA_ENVIRONINDEX - 1) |
39 | #define lua_upvalueindex(i) (LUA_GLOBALSINDEX-(i)) | 39 | #define lua_upvalueindex(i) (LUA_GLOBALSINDEX-(i)) |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: luaconf.h,v 1.105 2009/06/18 18:19:36 roberto Exp roberto $ | 2 | ** $Id: luaconf.h,v 1.106 2009/07/01 16:16:40 roberto Exp roberto $ |
3 | ** Configuration file for Lua | 3 | ** Configuration file for Lua |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -417,31 +417,19 @@ | |||
417 | 417 | ||
418 | 418 | ||
419 | /* | 419 | /* |
420 | @@ LUAI_MAXCALLS limits the number of nested calls. | 420 | @@ LUAI_MAXSTACK limits the size of the Lua stack. |
421 | ** CHANGE it if you need really deep recursive calls. This limit is | ||
422 | ** arbitrary; its only purpose is to stop infinite recursion before | ||
423 | ** exhausting memory. | ||
424 | */ | ||
425 | #define LUAI_MAXCALLS 20000 | ||
426 | |||
427 | |||
428 | /* | ||
429 | @@ LUAI_MAXCSTACK limits the number of Lua stack slots that a C function | ||
430 | @* can use. | ||
431 | ** CHANGE it if you need a different limit. This limit is arbitrary; | 421 | ** CHANGE it if you need a different limit. This limit is arbitrary; |
432 | ** its only purpose is to stop C functions to consume unlimited stack | 422 | ** its only purpose is to stop Lua to consume unlimited stack |
433 | ** space. | 423 | ** space (and to reserve some numbers for pseudo-indices). |
434 | */ | 424 | */ |
435 | /* life is simpler if stack size fits in an int (16 is an estimate | 425 | #if LUAI_BITSINT >= 32 |
436 | for the size of a Lua value) */ | 426 | #define LUAI_MAXSTACK 1000000 |
437 | #if SHRT_MAX < (INT_MAX / 16) | ||
438 | #define LUAI_MCS_AUX SHRT_MAX | ||
439 | #else | 427 | #else |
440 | #define LUAI_MCS_AUX (INT_MAX / 16) | 428 | #define LUAI_MAXSTACK 15000 |
441 | #endif | 429 | #endif |
442 | 430 | ||
443 | /* reserve some space for pseudo-indices */ | 431 | /* reserve some space for error handling */ |
444 | #define LUAI_MAXCSTACK (LUAI_MCS_AUX - 1000) | 432 | #define LUAI_FIRSTPSEUDOIDX (-LUAI_MAXSTACK - 1000) |
445 | 433 | ||
446 | 434 | ||
447 | 435 | ||