diff options
Diffstat (limited to 'ltests.c')
| -rw-r--r-- | ltests.c | 27 |
1 files changed, 20 insertions, 7 deletions
| @@ -121,7 +121,8 @@ static void warnf (void *ud, const char *msg, int tocont) { | |||
| 121 | strcat(buff, msg); /* add new message to current warning */ | 121 | strcat(buff, msg); /* add new message to current warning */ |
| 122 | if (!tocont) { /* message finished? */ | 122 | if (!tocont) { /* message finished? */ |
| 123 | lua_unlock(L); | 123 | lua_unlock(L); |
| 124 | if (lua_getglobal(L, "_WARN") == LUA_TNIL) | 124 | lua_getglobal(L, "_WARN"); |
| 125 | if (!lua_toboolean(L, -1)) | ||
| 125 | lua_pop(L, 1); /* ok, no previous unexpected warning */ | 126 | lua_pop(L, 1); /* ok, no previous unexpected warning */ |
| 126 | else { | 127 | else { |
| 127 | badexit("Unhandled warning in store mode: %s\naborting...\n", | 128 | badexit("Unhandled warning in store mode: %s\naborting...\n", |
| @@ -1282,10 +1283,19 @@ static int getindex_aux (lua_State *L, lua_State *L1, const char **pc) { | |||
| 1282 | } | 1283 | } |
| 1283 | 1284 | ||
| 1284 | 1285 | ||
| 1285 | static void pushcode (lua_State *L, int code) { | 1286 | static const char *const statcodes[] = {"OK", "YIELD", "ERRRUN", |
| 1286 | static const char *const codes[] = {"OK", "YIELD", "ERRRUN", | 1287 | "ERRSYNTAX", MEMERRMSG, "ERRGCMM", "ERRERR"}; |
| 1287 | "ERRSYNTAX", MEMERRMSG, "ERRGCMM", "ERRERR"}; | 1288 | |
| 1288 | lua_pushstring(L, codes[code]); | 1289 | /* |
| 1290 | ** Avoid these stat codes from being collected, to avoid possible | ||
| 1291 | ** memory error when pushing them. | ||
| 1292 | */ | ||
| 1293 | static void regcodes (lua_State *L) { | ||
| 1294 | unsigned int i; | ||
| 1295 | for (i = 0; i < sizeof(statcodes) / sizeof(statcodes[0]); i++) { | ||
| 1296 | lua_pushboolean(L, 1); | ||
| 1297 | lua_setfield(L, LUA_REGISTRYINDEX, statcodes[i]); | ||
| 1298 | } | ||
| 1289 | } | 1299 | } |
| 1290 | 1300 | ||
| 1291 | 1301 | ||
| @@ -1508,7 +1518,7 @@ static int runC (lua_State *L, lua_State *L1, const char *pc) { | |||
| 1508 | lua_pushnumber(L1, (lua_Number)getnum); | 1518 | lua_pushnumber(L1, (lua_Number)getnum); |
| 1509 | } | 1519 | } |
| 1510 | else if EQ("pushstatus") { | 1520 | else if EQ("pushstatus") { |
| 1511 | pushcode(L1, status); | 1521 | lua_pushstring(L1, statcodes[status]); |
| 1512 | } | 1522 | } |
| 1513 | else if EQ("pushstring") { | 1523 | else if EQ("pushstring") { |
| 1514 | lua_pushstring(L1, getstring); | 1524 | lua_pushstring(L1, getstring); |
| @@ -1710,7 +1720,7 @@ static int Cfunc (lua_State *L) { | |||
| 1710 | 1720 | ||
| 1711 | 1721 | ||
| 1712 | static int Cfunck (lua_State *L, int status, lua_KContext ctx) { | 1722 | static int Cfunck (lua_State *L, int status, lua_KContext ctx) { |
| 1713 | pushcode(L, status); | 1723 | lua_pushstring(L, statcodes[status]); |
| 1714 | lua_setglobal(L, "status"); | 1724 | lua_setglobal(L, "status"); |
| 1715 | lua_pushinteger(L, ctx); | 1725 | lua_pushinteger(L, ctx); |
| 1716 | lua_setglobal(L, "ctx"); | 1726 | lua_setglobal(L, "ctx"); |
| @@ -1865,6 +1875,9 @@ int luaB_opentests (lua_State *L) { | |||
| 1865 | void *ud; | 1875 | void *ud; |
| 1866 | lua_atpanic(L, &tpanic); | 1876 | lua_atpanic(L, &tpanic); |
| 1867 | lua_setwarnf(L, &warnf, L); | 1877 | lua_setwarnf(L, &warnf, L); |
| 1878 | lua_pushboolean(L, 0); | ||
| 1879 | lua_setglobal(L, "_WARN"); /* _WARN = false */ | ||
| 1880 | regcodes(L); | ||
| 1868 | atexit(checkfinalmem); | 1881 | atexit(checkfinalmem); |
| 1869 | lua_assert(lua_getallocf(L, &ud) == debug_realloc); | 1882 | lua_assert(lua_getallocf(L, &ud) == debug_realloc); |
| 1870 | lua_assert(ud == cast_voidp(&l_memcontrol)); | 1883 | lua_assert(ud == cast_voidp(&l_memcontrol)); |
