X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fscript.cpp;h=a159f2288e044ebc5ca387dd491cb0af95c5d395;hb=c0530921ffac89c2249500ba0a1bddd9d288cfbe;hp=edfc596b8f4a114f045c32565d323695fa9359c5;hpb=bfc68d31510bbd40732c19ada51d4683cb050de2;p=dragonfireclient.git diff --git a/src/script.cpp b/src/script.cpp index edfc596b8..a159f2288 100644 --- a/src/script.cpp +++ b/src/script.cpp @@ -31,87 +31,83 @@ extern "C" { #include } +LuaError::LuaError(lua_State *L, const std::string &s) +{ + m_s = "LuaError: "; + m_s += s + "\n"; + m_s += script_get_backtrace(L); +} + +std::string script_get_backtrace(lua_State *L) +{ + std::string s; + lua_getfield(L, LUA_GLOBALSINDEX, "debug"); + if(lua_istable(L, -1)){ + lua_getfield(L, -1, "traceback"); + if(lua_isfunction(L, -1)){ + lua_call(L, 0, 1); + if(lua_isstring(L, -1)){ + s += lua_tostring(L, -1); + } + lua_pop(L, 1); + } + else{ + lua_pop(L, 1); + } + } + lua_pop(L, 1); + return s; +} + void script_error(lua_State *L, const char *fmt, ...) { va_list argp; va_start(argp, fmt); - vfprintf(stderr, fmt, argp); + char buf[10000]; + vsnprintf(buf, 10000, fmt, argp); va_end(argp); - lua_close(L); - exit(EXIT_FAILURE); + //errorstream<<"SCRIPT ERROR: "<': /* end of arguments */ - goto endargs; - default: - script_error(L, "invalid option (%c)", *(sig - 1)); - } +int luaErrorHandler(lua_State *L) { + lua_getfield(L, LUA_GLOBALSINDEX, "debug"); + if (!lua_istable(L, -1)) { + lua_pop(L, 1); + return 1; } -endargs: - - nres = strlen(sig); /* number of expected results */ - - if (lua_pcall(L, narg, nres, 0) != 0) /* do the call */ - script_error(L, "error calling '%s': %s", func, lua_tostring(L, -1)); - - nres = -nres; /* stack index of first result */ - while (*sig) { /* repeat for each result */ - switch (*sig++) { - case 'd': /* double result */ - if (!lua_isnumber(L, nres)) - script_error(L, "wrong result type"); - *va_arg(vl, double *) = lua_tonumber(L, nres); - break; - case 'i': /* int result */ - if (!lua_isnumber(L, nres)) - script_error(L, "wrong result type"); - *va_arg(vl, int *) = lua_tointeger(L, nres); - break; - case 's': /* string result */ - if (!lua_isstring(L, nres)) - script_error(L, "wrong result type"); - *va_arg(vl, const char **) = lua_tostring(L, nres); - break; - default: - script_error(L, "invalid option (%c)", *(sig - 1)); - } - nres++; + lua_getfield(L, -1, "traceback"); + if (!lua_isfunction(L, -1)) { + lua_pop(L, 2); + return 1; } - - va_end(vl); + lua_pushvalue(L, 1); + lua_pushinteger(L, 2); + lua_call(L, 2, 1); + return 1; } bool script_load(lua_State *L, const char *path) { - infostream<<"Loading and running script from "<