mirror of
https://github.com/ZDoom/raze-gles.git
synced 2025-01-12 11:10:39 +00:00
Lunatic: print -> OSD_Printf, error reporting.
git-svn-id: https://svn.eduke32.com/eduke32@3319 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
255c84c5a2
commit
41bfa1b841
11 changed files with 147 additions and 18 deletions
|
@ -19,6 +19,9 @@ typedef struct
|
||||||
void L_SetupDebugTraceback(lua_State *L);
|
void L_SetupDebugTraceback(lua_State *L);
|
||||||
void L_CheckAndRegisterFunction(lua_State *L, void *regkeyaddr);
|
void L_CheckAndRegisterFunction(lua_State *L, void *regkeyaddr);
|
||||||
|
|
||||||
|
// Callback on Lua error. <str> must be used immediately or strdup'd.
|
||||||
|
void (*L_ErrorFunc)(const char *str);
|
||||||
|
|
||||||
int L_CreateState(L_State *estate, const char *name, void (*StateSetupFunc)(lua_State *));
|
int L_CreateState(L_State *estate, const char *name, void (*StateSetupFunc)(lua_State *));
|
||||||
void L_DestroyState(L_State *estate);
|
void L_DestroyState(L_State *estate);
|
||||||
int L_RunOnce(L_State *estate, const char *fn);
|
int L_RunOnce(L_State *estate, const char *fn);
|
||||||
|
|
|
@ -112,6 +112,7 @@ void L_DestroyState(L_State *estate)
|
||||||
estate->L = NULL;
|
estate->L = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void (*L_ErrorFunc)(const char *) = NULL;
|
||||||
|
|
||||||
int L_RunString(L_State *estate, char *buf, int dofreebuf)
|
int L_RunString(L_State *estate, char *buf, int dofreebuf)
|
||||||
{
|
{
|
||||||
|
@ -139,7 +140,7 @@ int L_RunString(L_State *estate, char *buf, int dofreebuf)
|
||||||
|
|
||||||
if (i == LUA_ERRSYNTAX)
|
if (i == LUA_ERRSYNTAX)
|
||||||
{
|
{
|
||||||
OSD_Printf("state \"%s\" syntax error: %s\n", estate->name,
|
OSD_Printf(OSD_ERROR "state \"%s\" syntax error: %s\n", estate->name,
|
||||||
lua_tostring(L, -1)); // get err msg
|
lua_tostring(L, -1)); // get err msg
|
||||||
lua_pop(L, 2); // pop errmsg and debug.traceback
|
lua_pop(L, 2); // pop errmsg and debug.traceback
|
||||||
return 3;
|
return 3;
|
||||||
|
@ -159,11 +160,13 @@ int L_RunString(L_State *estate, char *buf, int dofreebuf)
|
||||||
|
|
||||||
if (i == LUA_ERRRUN)
|
if (i == LUA_ERRRUN)
|
||||||
{
|
{
|
||||||
int32_t stringp = (lua_type(L, -1)==LUA_TSTRING);
|
|
||||||
|
|
||||||
// get error message if possible
|
// get error message if possible
|
||||||
OSD_Printf("state \"%s\" runtime error: %s\n", estate->name,
|
const char *errstr = (lua_type(L, -1)==LUA_TSTRING) ?
|
||||||
stringp ? lua_tostring(L, -1) : "??? (errmsg not a string)");
|
lua_tostring(L, -1) : "??? (errmsg not a string)";
|
||||||
|
|
||||||
|
OSD_Printf(OSD_ERROR "state \"%s\" runtime error: %s\n", estate->name, errstr);
|
||||||
|
if (L_ErrorFunc)
|
||||||
|
L_ErrorFunc(errstr);
|
||||||
lua_pop(L, 2); // pop errmsg and debug.traceback
|
lua_pop(L, 2); // pop errmsg and debug.traceback
|
||||||
return 4;
|
return 4;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3013,6 +3013,10 @@ void G_DisplayRest(int32_t smoothratio)
|
||||||
if (g_Debug)
|
if (g_Debug)
|
||||||
G_ShowCacheLocks();
|
G_ShowCacheLocks();
|
||||||
|
|
||||||
|
#ifdef LUNATIC
|
||||||
|
El_DisplayErrors();
|
||||||
|
#endif
|
||||||
|
|
||||||
if (VOLUMEONE)
|
if (VOLUMEONE)
|
||||||
{
|
{
|
||||||
if (ud.show_help == 0 && g_showShareware > 0 && (g_player[myconnectindex].ps->gm&MODE_MENU) == 0)
|
if (ud.show_help == 0 && g_showShareware > 0 && (g_player[myconnectindex].ps->gm&MODE_MENU) == 0)
|
||||||
|
|
|
@ -20,10 +20,8 @@ local rawset = rawset
|
||||||
local setmetatable = setmetatable
|
local setmetatable = setmetatable
|
||||||
local setfenv = setfenv
|
local setfenv = setfenv
|
||||||
local tonumber = tonumber
|
local tonumber = tonumber
|
||||||
local type = type
|
|
||||||
|
|
||||||
local print = print
|
|
||||||
local tostring = tostring
|
local tostring = tostring
|
||||||
|
local type = type
|
||||||
|
|
||||||
|
|
||||||
--== First, load the definitions common to the game's and editor's Lua interface.
|
--== First, load the definitions common to the game's and editor's Lua interface.
|
||||||
|
@ -61,6 +59,10 @@ local cansee = defs_c.cansee
|
||||||
local strip_const = defs_c.strip_const
|
local strip_const = defs_c.strip_const
|
||||||
local setmtonce = defs_c.setmtonce
|
local setmtonce = defs_c.setmtonce
|
||||||
|
|
||||||
|
-- Must be after loading "defs_common" which redefines "print" to use
|
||||||
|
-- OSD_Printf()
|
||||||
|
local print = print
|
||||||
|
|
||||||
|
|
||||||
---=== EDuke32 game definitions ===---
|
---=== EDuke32 game definitions ===---
|
||||||
|
|
||||||
|
@ -963,7 +965,7 @@ G_.error = our_error
|
||||||
G_.ipairs = ipairs
|
G_.ipairs = ipairs
|
||||||
G_.pairs = pairs
|
G_.pairs = pairs
|
||||||
G_.pcall = pcall
|
G_.pcall = pcall
|
||||||
G_.print = print -- TODO: --> initprintf or OSD_Printf; why not needed on linux?
|
G_.print = print
|
||||||
G_.module = our_module
|
G_.module = our_module
|
||||||
G_.next = next
|
G_.next = next
|
||||||
G_.require = our_require
|
G_.require = our_require
|
||||||
|
|
|
@ -16,6 +16,15 @@ local setmetatable = setmetatable
|
||||||
local decl = decl
|
local decl = decl
|
||||||
local getfenv = getfenv
|
local getfenv = getfenv
|
||||||
|
|
||||||
|
decl "void OSD_Printf(const char *fmt, ...);"
|
||||||
|
print = function(str)
|
||||||
|
str = tostring(str)
|
||||||
|
if (type(str) ~= "string") then
|
||||||
|
error("invalid argument to print: must be convertible to a string")
|
||||||
|
end
|
||||||
|
ffiC.OSD_Printf("%s\n", str)
|
||||||
|
end
|
||||||
|
|
||||||
local print=print
|
local print=print
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,7 @@ updatesectorz;
|
||||||
updatesectorbreadth;
|
updatesectorbreadth;
|
||||||
|
|
||||||
gethitickms;
|
gethitickms;
|
||||||
|
OSD_Printf;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,7 @@ updatesectorz;
|
||||||
updatesectorbreadth;
|
updatesectorbreadth;
|
||||||
|
|
||||||
gethitickms;
|
gethitickms;
|
||||||
|
OSD_Printf;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
#include <lualib.h>
|
#include <lualib.h>
|
||||||
#include <lauxlib.h>
|
#include <lauxlib.h>
|
||||||
|
|
||||||
|
#include "build.h" // printext256
|
||||||
|
|
||||||
#include "lunatic_game.h"
|
#include "lunatic_game.h"
|
||||||
|
|
||||||
#include "osd.h"
|
#include "osd.h"
|
||||||
|
@ -101,6 +103,92 @@ void El_PrintTimes(void)
|
||||||
OSD_Printf(" },\n}\n");
|
OSD_Printf(" },\n}\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////// ERROR REPORTING //////////
|
||||||
|
#define EL_MAXERRORS 2
|
||||||
|
static int32_t el_numErrors=0, el_tooMuchErrors;
|
||||||
|
static char *el_errorMsgs[EL_MAXERRORS];
|
||||||
|
|
||||||
|
// Compare against all other error messages.
|
||||||
|
// Strictly seen, this is quadratic-time, but EL_MAXERRORS is small and
|
||||||
|
// errors should be fixed anyway.
|
||||||
|
static int32_t cmp_against_others(const char *str, int32_t slen)
|
||||||
|
{
|
||||||
|
int32_t i;
|
||||||
|
for (i=0; i<el_numErrors; i++)
|
||||||
|
if (!Bstrncmp(str, el_errorMsgs[i], slen))
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void El_OnError(const char *str)
|
||||||
|
{
|
||||||
|
if (!el_tooMuchErrors)
|
||||||
|
{
|
||||||
|
char *errstr = NULL;
|
||||||
|
const char *nl = Bstrchr(str, '\n');
|
||||||
|
|
||||||
|
// First, check whether the error message matches an already saved one
|
||||||
|
if (nl)
|
||||||
|
{
|
||||||
|
// cut off string after the newline
|
||||||
|
if (cmp_against_others(str, nl-str))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// save string fully
|
||||||
|
if (cmp_against_others(str, Bstrlen(str)))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the (EL_MAXERRORS+1)'th distinct error appeared, we have too many.
|
||||||
|
if (el_numErrors==EL_MAXERRORS)
|
||||||
|
{
|
||||||
|
el_tooMuchErrors = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise, allocate storage for the potentially clipped error string...
|
||||||
|
if (nl)
|
||||||
|
{
|
||||||
|
errstr = Bmalloc(nl-str+1);
|
||||||
|
if (errstr)
|
||||||
|
{
|
||||||
|
Bmemcpy(errstr, str, nl-str);
|
||||||
|
errstr[nl-str] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
errstr = Bstrdup(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ...and save it:
|
||||||
|
if (errstr)
|
||||||
|
el_errorMsgs[el_numErrors++] = errstr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void El_ClearErrors(void)
|
||||||
|
{
|
||||||
|
int32_t i;
|
||||||
|
for (i=0; i<EL_MAXERRORS; i++)
|
||||||
|
{
|
||||||
|
Bfree(el_errorMsgs[i]);
|
||||||
|
el_errorMsgs[i] = NULL;
|
||||||
|
}
|
||||||
|
el_numErrors = el_tooMuchErrors = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void El_DisplayErrors(void)
|
||||||
|
{
|
||||||
|
int32_t i;
|
||||||
|
for (i=0; i<el_numErrors; i++)
|
||||||
|
printext256(8, 8+8*i, 242, 0, el_errorMsgs[i], 0);
|
||||||
|
if (el_tooMuchErrors)
|
||||||
|
printext256(8, 8+8*EL_MAXERRORS, 242, 0, "(more distinct errors ...)", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
////////// STATE CREATION/DESTRUCTIION //////////
|
////////// STATE CREATION/DESTRUCTIION //////////
|
||||||
|
|
||||||
|
@ -124,6 +212,8 @@ static void El_StateSetup(lua_State *L)
|
||||||
// 0: success, <0: failure
|
// 0: success, <0: failure
|
||||||
int32_t El_CreateState(L_State *estate, const char *name)
|
int32_t El_CreateState(L_State *estate, const char *name)
|
||||||
{
|
{
|
||||||
|
L_ErrorFunc = El_OnError;
|
||||||
|
|
||||||
return L_CreateState(estate, name, &El_StateSetup);
|
return L_CreateState(estate, name, &El_StateSetup);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -223,15 +313,20 @@ int32_t El_CallEvent(L_State *estate, int32_t eventidx, int32_t iActor, int32_t
|
||||||
|
|
||||||
if (i == LUA_ERRRUN)
|
if (i == LUA_ERRRUN)
|
||||||
{
|
{
|
||||||
|
const char *errstr;
|
||||||
|
|
||||||
if (lua_isboolean(L, -1))
|
if (lua_isboolean(L, -1))
|
||||||
{
|
{
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
errstr = lua_tostring(L, -1);
|
||||||
Bassert(lua_type(L, -1)==LUA_TSTRING);
|
Bassert(lua_type(L, -1)==LUA_TSTRING);
|
||||||
OSD_Printf("event \"%s\" (state \"%s\") runtime error: %s\n", EventNames[eventidx],
|
OSD_Printf(OSD_ERROR "event \"%s\" (state \"%s\") runtime error: %s\n",
|
||||||
estate->name, lua_tostring(L, -1)); // get err msg
|
EventNames[eventidx], estate->name, errstr);
|
||||||
|
if (L_ErrorFunc)
|
||||||
|
L_ErrorFunc(errstr);
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -247,6 +342,8 @@ int32_t El_CallActor(L_State *estate, int32_t actortile, int32_t iActor, int32_t
|
||||||
|
|
||||||
if (i == LUA_ERRRUN)
|
if (i == LUA_ERRRUN)
|
||||||
{
|
{
|
||||||
|
const char *errstr;
|
||||||
|
|
||||||
if (lua_isboolean(L, -1))
|
if (lua_isboolean(L, -1))
|
||||||
{
|
{
|
||||||
int32_t killit = lua_toboolean(L, -1);
|
int32_t killit = lua_toboolean(L, -1);
|
||||||
|
@ -255,8 +352,11 @@ int32_t El_CallActor(L_State *estate, int32_t actortile, int32_t iActor, int32_t
|
||||||
}
|
}
|
||||||
|
|
||||||
Bassert(lua_type(L, -1)==LUA_TSTRING);
|
Bassert(lua_type(L, -1)==LUA_TSTRING);
|
||||||
OSD_Printf("actor %d (sprite %d, state \"%s\") runtime error: %s\n", actortile, iActor,
|
errstr = lua_tostring(L, -1);
|
||||||
estate->name, lua_tostring(L, -1)); // get err msg
|
OSD_Printf(OSD_ERROR "actor %d (sprite %d, state \"%s\") runtime error: %s\n",
|
||||||
|
actortile, iActor, estate->name, errstr);
|
||||||
|
if (L_ErrorFunc)
|
||||||
|
L_ErrorFunc(errstr);
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,9 @@ extern double g_eventTotalMs[MAXEVENTS], g_actorTotalMs[MAXTILES];
|
||||||
// -- functions --
|
// -- functions --
|
||||||
void El_PrintTimes(void);
|
void El_PrintTimes(void);
|
||||||
|
|
||||||
|
void El_ClearErrors(void);
|
||||||
|
void El_DisplayErrors(void);
|
||||||
|
|
||||||
int32_t El_CreateState(L_State *estate, const char *name);
|
int32_t El_CreateState(L_State *estate, const char *name);
|
||||||
void El_DestroyState(L_State *estate);
|
void El_DestroyState(L_State *estate);
|
||||||
|
|
||||||
|
|
|
@ -16,12 +16,13 @@ end
|
||||||
local function checkfail(funcstr, expectedmsg)
|
local function checkfail(funcstr, expectedmsg)
|
||||||
local status, errmsg = pcall(DBG_.loadstring(funcstr))
|
local status, errmsg = pcall(DBG_.loadstring(funcstr))
|
||||||
if (status) then
|
if (status) then
|
||||||
print('ERROR: '..funcstr.." DIDN'T fail")
|
print('^21ERROR:^O '..funcstr.." DIDN'T fail")
|
||||||
else
|
else
|
||||||
if (expectedmsg==nil or string.find(errmsg, expectedmsg, 1, true)) then
|
if (expectedmsg==nil or string.find(errmsg, expectedmsg, 1, true)) then
|
||||||
print('SUCCESS: '..funcstr.." failed: "..errmsg)
|
print("^11SUCCESS:^O "..funcstr.." failed: "..errmsg)
|
||||||
else
|
else
|
||||||
print('ERROR*: '..funcstr.." failed: "..errmsg..
|
-- XXX: beginning with "^10" is counted as error in OSD_Printf()
|
||||||
|
print("^10ERROR*:^O "..funcstr.." failed: "..errmsg..
|
||||||
", but expected error message was: "..expectedmsg)
|
", but expected error message was: "..expectedmsg)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -182,13 +183,14 @@ checkfail("do local bt=require'bittest'; bt.QWE=1; end", "modifying module table
|
||||||
-- the cdata returned by player[] can't be made into a pointer!
|
-- the cdata returned by player[] can't be made into a pointer!
|
||||||
checkfail("do local pl=player[0]; i=pl[1]; end")
|
checkfail("do local pl=player[0]; i=pl[1]; end")
|
||||||
checkfail("do local ud=gv.ud.camera; end", "dummy variable: read access forbidden") -- test for proper decl()
|
checkfail("do local ud=gv.ud.camera; end", "dummy variable: read access forbidden") -- test for proper decl()
|
||||||
checkfail("sprite[0]:set_picnum(-10)", "attempt to set invalid picnum")
|
checkfail("sprite[0]:set_picnum(-10)", "attempt to set invalid picnums")
|
||||||
|
|
||||||
printf('ceilingbunch of sector 0: %d', getbunch(0, gv.CEILING))
|
printf('ceilingbunch of sector 0: %d', getbunch(0, gv.CEILING))
|
||||||
|
|
||||||
gameevent(gv.EVENT_JUMP,
|
gameevent(gv.EVENT_JUMP,
|
||||||
function(actori, playeri, dist)
|
function(actori, playeri, dist)
|
||||||
printf("jump i=%d p=%d d=%d", actori, playeri, dist)
|
printf("jump i=%d p=%d d=%d", actori, playeri, dist)
|
||||||
|
error("greetings from EVENT_JUMP")
|
||||||
end
|
end
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -263,6 +265,7 @@ gameactor(1680, TROOPSTRENGTH, "TROOPSTAND", -- LIZTROOP
|
||||||
if (hs.n == 300) then
|
if (hs.n == 300) then
|
||||||
printf("hitscan: %s", tostring(hs:getstats()))
|
printf("hitscan: %s", tostring(hs:getstats()))
|
||||||
hs:reset()
|
hs:reset()
|
||||||
|
error("greetings from LIZTROOP actor")
|
||||||
end
|
end
|
||||||
|
|
||||||
if (dist < 4096) then
|
if (dist < 4096) then
|
||||||
|
|
|
@ -1371,7 +1371,7 @@ static inline void prelevel(char g)
|
||||||
{
|
{
|
||||||
i = L_RunOnce(&g_ElState, "test.elua");
|
i = L_RunOnce(&g_ElState, "test.elua");
|
||||||
if (i)
|
if (i)
|
||||||
OSD_Printf("Error running the test ELua script (code %d)\n", i);
|
OSD_Printf(OSD_ERROR "Error running the test ELua script (code %d)\n", i);
|
||||||
else
|
else
|
||||||
initprintf("ELua test script run ok!\n");
|
initprintf("ELua test script run ok!\n");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue