diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2015-12-14 09:59:27 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2015-12-14 09:59:27 -0200 |
commit | bda090b96168eb2080259cad70f1d830e42f2cb4 (patch) | |
tree | 958fb625707c805b666d9b0c15a3b6767b46bf30 /lauxlib.c | |
parent | e3839416526b41c1d3f859a79760f8ff22794293 (diff) | |
download | lua-bda090b96168eb2080259cad70f1d830e42f2cb4.tar.gz lua-bda090b96168eb2080259cad70f1d830e42f2cb4.tar.bz2 lua-bda090b96168eb2080259cad70f1d830e42f2cb4.zip |
comments + small code changes around stack usage when 'luaL_checkstack'
raises an error (and needs the stack to create the error message...)
Diffstat (limited to 'lauxlib.c')
-rw-r--r-- | lauxlib.c | 26 |
1 files changed, 21 insertions, 5 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lauxlib.c,v 1.283 2015/10/06 16:10:22 roberto Exp roberto $ | 2 | ** $Id: lauxlib.c,v 1.284 2015/11/19 19:16:22 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 | */ |
@@ -198,6 +198,10 @@ static void tag_error (lua_State *L, int arg, int tag) { | |||
198 | } | 198 | } |
199 | 199 | ||
200 | 200 | ||
201 | /* | ||
202 | ** The use of 'lua_pushfstring' ensures this function does not | ||
203 | ** need reserved stack space when called. | ||
204 | */ | ||
201 | LUALIB_API void luaL_where (lua_State *L, int level) { | 205 | LUALIB_API void luaL_where (lua_State *L, int level) { |
202 | lua_Debug ar; | 206 | lua_Debug ar; |
203 | if (lua_getstack(L, level, &ar)) { /* check function at level */ | 207 | if (lua_getstack(L, level, &ar)) { /* check function at level */ |
@@ -207,10 +211,14 @@ LUALIB_API void luaL_where (lua_State *L, int level) { | |||
207 | return; | 211 | return; |
208 | } | 212 | } |
209 | } | 213 | } |
210 | lua_pushliteral(L, ""); /* else, no information available... */ | 214 | lua_pushfstring(L, ""); /* else, no information available... */ |
211 | } | 215 | } |
212 | 216 | ||
213 | 217 | ||
218 | /* | ||
219 | ** Again, the use of 'lua_pushvfstring' ensures this function does | ||
220 | ** not need reserved stack space when called. | ||
221 | */ | ||
214 | LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) { | 222 | LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) { |
215 | va_list argp; | 223 | va_list argp; |
216 | va_start(argp, fmt); | 224 | va_start(argp, fmt); |
@@ -349,9 +357,17 @@ LUALIB_API int luaL_checkoption (lua_State *L, int arg, const char *def, | |||
349 | } | 357 | } |
350 | 358 | ||
351 | 359 | ||
360 | /* | ||
361 | ** Ensures the stack has at least 'space' extra slots, raising | ||
362 | ** an error if it cannot fulfill the request. It adds some | ||
363 | ** extra space so that, next time it is called (this function | ||
364 | ** is typically called inside a loop), it has space to format | ||
365 | ** the error message. (In case of an error without this extra | ||
366 | ** space, Lua will generate the same 'stack overflow' error, | ||
367 | ** but without 'msg'.) | ||
368 | */ | ||
352 | LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *msg) { | 369 | LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *msg) { |
353 | /* keep some extra space to run error routines, if needed */ | 370 | const int extra = 5; /* extra space to run error routines */ |
354 | const int extra = LUA_MINSTACK; | ||
355 | if (!lua_checkstack(L, space + extra)) { | 371 | if (!lua_checkstack(L, space + extra)) { |
356 | if (msg) | 372 | if (msg) |
357 | luaL_error(L, "stack overflow (%s)", msg); | 373 | luaL_error(L, "stack overflow (%s)", msg); |
@@ -678,7 +694,7 @@ static int skipcomment (LoadF *lf, int *cp) { | |||
678 | if (c == '#') { /* first line is a comment (Unix exec. file)? */ | 694 | if (c == '#') { /* first line is a comment (Unix exec. file)? */ |
679 | do { /* skip first line */ | 695 | do { /* skip first line */ |
680 | c = getc(lf->f); | 696 | c = getc(lf->f); |
681 | } while (c != EOF && c != '\n') ; | 697 | } while (c != EOF && c != '\n'); |
682 | *cp = getc(lf->f); /* skip end-of-line, if present */ | 698 | *cp = getc(lf->f); /* skip end-of-line, if present */ |
683 | return 1; /* there was a comment */ | 699 | return 1; /* there was a comment */ |
684 | } | 700 | } |