]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/script.cpp
Merge pull request #500 from doserj/server_report_missing_deps
[dragonfireclient.git] / src / script.cpp
index 8b1b7013e9ff7210854c9fefde58ca57f1b4b701..b238e1be70c3833d7c6ac4eaeb92d9b5b993de12 100644 (file)
@@ -3,16 +3,16 @@ Minetest-c55
 Copyright (C) 2011 celeron55, Perttu Ahola <celeron55@gmail.com>
 
 This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
 (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License along
+You should have received a copy of the GNU Lesser 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.
 */
@@ -35,13 +35,19 @@ 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)){
-                               m_s += lua_tostring(L, -1);
+                               s += lua_tostring(L, -1);
                        }
                        lua_pop(L, 1);
                }
@@ -50,6 +56,7 @@ LuaError::LuaError(lua_State *L, const std::string &s)
                }
        }
        lua_pop(L, 1);
+       return s;
 }
 
 void script_error(lua_State *L, const char *fmt, ...)
@@ -82,20 +89,25 @@ int luaErrorHandler(lua_State *L) {
 
 bool script_load(lua_State *L, const char *path)
 {
-       infostream<<"Loading and running script from "<<path<<std::endl;
+       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<<"Failed to load and run script from "<<path<<":"<<std::endl;
-               errorstream<<"[LUA] "<<std::endl;
-               errorstream<<"[LUA] "<<lua_tostring(L, -1)<<std::endl;
-               errorstream<<"[LUA] "<<std::endl;
+               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;
 }