aboutsummaryrefslogtreecommitdiff
path: root/assets/blender/newlocomotive_uvs.png
diff options
context:
space:
mode:
authorBlockhead <jbis1337@hotmail.com>2021-01-18 15:27:50 +0100
committerorwell96 <orwell@bleipb.de>2021-01-18 15:27:50 +0100
commitcdad238183e4aa62df16b2367321abf0f7a517c8 (patch)
treea997575562a110062730fedee783572ef4bd9374 /assets/blender/newlocomotive_uvs.png
parented165e1b1784f4fed38bb69441051c1ce6b137c8 (diff)
downloadadvtrains-cdad238183e4aa62df16b2367321abf0f7a517c8.tar.gz
advtrains-cdad238183e4aa62df16b2367321abf0f7a517c8.tar.bz2
advtrains-cdad238183e4aa62df16b2367321abf0f7a517c8.zip
Fix serialisation: breach of contract, file left open
Previous commit did not fix saving, but is kept because there is a corner case for which it is required (see MT forum)
Diffstat (limited to 'assets/blender/newlocomotive_uvs.png')
0 files changed, 0 insertions, 0 deletions
details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "script.h" #include <cstdarg> #include <cstring> #include <cstdio> #include <cstdlib> #include "log.h" #include <iostream> extern "C" { #include <lua.h> #include <lualib.h> #include <lauxlib.h> } 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); char buf[10000]; vsnprintf(buf, 10000, fmt, argp); va_end(argp); //errorstream<<"SCRIPT ERROR: "<<buf; throw LuaError(L, buf); } int luaErrorHandler(lua_State *L) { lua_getfield(L, LUA_GLOBALSINDEX, "debug"); if (!lua_istable(L, -1)) { lua_pop(L, 1); return 1; } lua_getfield(L, -1, "traceback"); if (!lua_isfunction(L, -1)) { lua_pop(L, 2); return 1; } lua_pushvalue(L, 1); lua_pushinteger(L, 2); lua_call(L, 2, 1); return 1; } bool script_load(lua_State *L, const char *path) { verbosestream<<"Loading and running script from "<<path<<std::endl; lua_pushcfunction(L, luaErrorHandler); int errorhandler = lua_gettop(L); int ret = luaL_loadfile(L, path) || lua_pcall(L, 0, 0, errorhandler); if(ret){ errorstream<<"========== ERROR FROM LUA ==========="<<std::endl; errorstream<<"Failed to load and run script from "<<std::endl; errorstream<<path<<":"<<std::endl; errorstream<<std::endl; errorstream<<lua_tostring(L, -1)<<std::endl; errorstream<<std::endl; errorstream<<"=======END OF ERROR FROM LUA ========"<<std::endl; lua_pop(L, 1); // Pop error message from stack lua_pop(L, 1); // Pop the error handler from stack return false; } lua_pop(L, 1); // Pop the error handler from stack return true; } lua_State* script_init() { lua_State *L = luaL_newstate(); luaL_openlibs(L); return L; } void script_deinit(lua_State *L) { lua_close(L); }