aboutsummaryrefslogtreecommitdiff
path: root/ltests.c
diff options
context:
space:
mode:
Diffstat (limited to 'ltests.c')
-rw-r--r--ltests.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/ltests.c b/ltests.c
index 63ad4498..164b5a25 100644
--- a/ltests.c
+++ b/ltests.c
@@ -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
1285static void pushcode (lua_State *L, int code) { 1286static 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*/
1293static 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
1712static int Cfunck (lua_State *L, int status, lua_KContext ctx) { 1722static 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));