Handle LuaErrors in Lua -> C++ calls on LuaJIT
authorShadowNinja <shadowninja@minetest.net>
Wed, 18 Dec 2013 21:35:55 +0000 (16:35 -0500)
committerShadowNinja <shadowninja@minetest.net>
Wed, 18 Dec 2013 21:35:55 +0000 (16:35 -0500)
18 files changed:
src/cmake_config.h.in
src/config.h
src/exceptions.h
src/game.cpp
src/script/common/c_content.cpp
src/script/common/c_internal.cpp
src/script/common/c_internal.h
src/script/common/c_types.cpp
src/script/common/c_types.h
src/script/cpp_api/s_base.cpp
src/script/cpp_api/s_inventory.cpp
src/script/cpp_api/s_nodemeta.cpp
src/script/cpp_api/s_server.cpp
src/script/lua_api/l_base.h
src/script/lua_api/l_craft.cpp
src/script/lua_api/l_item.cpp
src/script/lua_api/l_noise.cpp
src/server.h

index 7cc2fb99eefaaa8e224c072e18dddecb2ac6d362..75e448f79b0c414fe634c50fe1b774a061cef290 100644 (file)
@@ -12,6 +12,7 @@
 #define CMAKE_USE_FREETYPE @USE_FREETYPE@
 #define CMAKE_STATIC_SHAREDIR "@SHAREDIR@"
 #define CMAKE_USE_LEVELDB @USE_LEVELDB@
+#define CMAKE_USE_LUAJIT @USE_LUAJIT@
 
 #ifdef NDEBUG
        #define CMAKE_BUILD_TYPE "Release"
index 652c9008a52b76c40b6b7e3151ab5e56d41c250d..1c0aac4f2d5f4652843fb563ec4a0cb54dc2d5db 100644 (file)
@@ -14,6 +14,7 @@
 #define USE_FREETYPE 0
 #define STATIC_SHAREDIR ""
 #define USE_LEVELDB 0
+#define USE_LUAJIT 0
 
 #ifdef USE_CMAKE_CONFIG_H
        #include "cmake_config.h"
@@ -33,6 +34,8 @@
        #define STATIC_SHAREDIR CMAKE_STATIC_SHAREDIR
        #undef USE_LEVELDB
        #define USE_LEVELDB CMAKE_USE_LEVELDB
+       #undef USE_LUAJIT
+       #define USE_LUAJIT CMAKE_USE_LUAJIT
 #endif
 
 #endif
index 085b424177af20c1bc861afe5ea1d5f619caacc6..6fb97f3ed3758a52db40d5905519b229b9339ede 100644 (file)
@@ -21,132 +21,99 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #define EXCEPTIONS_HEADER
 
 #include <exception>
+#include <string>
+
 
 class BaseException : public std::exception
 {
 public:
-       BaseException(const char *s)
+       BaseException(const std::string s) throw()
        {
                m_s = s;
        }
+       ~BaseException() throw() {}
        virtual const char * what() const throw()
        {
-               return m_s;
+               return m_s.c_str();
        }
-       const char *m_s;
+protected:
+       std::string m_s;
 };
 
-class AsyncQueuedException : public BaseException
-{
+class AsyncQueuedException : public BaseException {
 public:
-       AsyncQueuedException(const char *s):
-               BaseException(s)
-       {}
+       AsyncQueuedException(std::string s): BaseException(s) {}
 };
 
-class NotImplementedException : public BaseException
-{
+class NotImplementedException : public BaseException {
 public:
-       NotImplementedException(const char *s):
-               BaseException(s)
-       {}
+       NotImplementedException(std::string s): BaseException(s) {}
 };
 
-class AlreadyExistsException : public BaseException
-{
+class AlreadyExistsException : public BaseException {
 public:
-       AlreadyExistsException(const char *s):
-               BaseException(s)
-       {}
+       AlreadyExistsException(std::string s): BaseException(s) {}
 };
 
-class VersionMismatchException : public BaseException
-{
+class VersionMismatchException : public BaseException {
 public:
-       VersionMismatchException(const char *s):
-               BaseException(s)
-       {}
+       VersionMismatchException(std::string s): BaseException(s) {}
 };
 
-class FileNotGoodException : public BaseException
-{
+class FileNotGoodException : public BaseException {
 public:
-       FileNotGoodException(const char *s):
-               BaseException(s)
-       {}
+       FileNotGoodException(std::string s): BaseException(s) {}
 };
 
-class SerializationError : public BaseException
-{
+class SerializationError : public BaseException {
 public:
-       SerializationError(const char *s):
-               BaseException(s)
-       {}
+       SerializationError(std::string s): BaseException(s) {}
 };
 
-class LoadError : public BaseException
-{
+class LoadError : public BaseException {
 public:
-       LoadError(const char *s):
-               BaseException(s)
-       {}
+       LoadError(std::string s): BaseException(s) {}
 };
 
-class ContainerFullException : public BaseException
-{
+class ContainerFullException : public BaseException {
 public:
-       ContainerFullException(const char *s):
-               BaseException(s)
-       {}
+       ContainerFullException(std::string s): BaseException(s) {}
 };
 
-class SettingNotFoundException : public BaseException
-{
+class SettingNotFoundException : public BaseException {
 public:
-       SettingNotFoundException(const char *s):
-               BaseException(s)
-       {}
+       SettingNotFoundException(std::string s): BaseException(s) {}
 };
 
-class InvalidFilenameException : public BaseException
-{
+class InvalidFilenameException : public BaseException {
 public:
-       InvalidFilenameException(const char *s):
-               BaseException(s)
-       {}
+       InvalidFilenameException(std::string s): BaseException(s) {}
 };
 
-class ProcessingLimitException : public BaseException
-{
+class ProcessingLimitException : public BaseException {
 public:
-       ProcessingLimitException(const char *s):
-               BaseException(s)
-       {}
+       ProcessingLimitException(std::string s): BaseException(s) {}
 };
 
-class CommandLineError : public BaseException
-{
+class CommandLineError : public BaseException {
 public:
-       CommandLineError(const char *s):
-               BaseException(s)
-       {}
+       CommandLineError(std::string s): BaseException(s) {}
 };
 
-class ItemNotFoundException : public BaseException
-{
+class ItemNotFoundException : public BaseException {
 public:
-       ItemNotFoundException(const char *s):
-               BaseException(s)
-       {}
+       ItemNotFoundException(std::string s): BaseException(s) {}
+};
+
+class ServerError : public BaseException {
+public:
+       ServerError(std::string s): BaseException(s) {}
 };
 
 // Only used on Windows (SEH)
-class FatalSystemException : public BaseException
-{
+class FatalSystemException : public BaseException {
 public:
-       FatalSystemException(const char *s):
-               BaseException(s)
-       {}
+       FatalSystemException(std::string s): BaseException(s) {}
 };
 
 /*
@@ -159,7 +126,7 @@ public:
        InvalidPositionException():
                BaseException("Somebody tried to get/set something in a nonexistent position.")
        {}
-       InvalidPositionException(const char *s):
+       InvalidPositionException(std::string s):
                BaseException(s)
        {}
 };
index cc5d3d81d056600056305225457068374b4d6061..6f48870ad37ea9fb252b02aef2e48a24b7e2f715 100644 (file)
@@ -3438,14 +3438,12 @@ void the_game(
                                L" running a different version of Minetest.";
                errorstream<<wide_to_narrow(error_message)<<std::endl;
        }
-       catch(ServerError &e)
-       {
+       catch(ServerError &e) {
                error_message = narrow_to_wide(e.what());
-               errorstream<<wide_to_narrow(error_message)<<std::endl;
+               errorstream << "ServerError: " << e.what() << std::endl;
        }
-       catch(ModError &e)
-       {
-               errorstream<<e.what()<<std::endl;
+       catch(ModError &e) {
+               errorstream << "ModError: " << e.what() << std::endl;
                error_message = narrow_to_wide(e.what()) + wgettext("\nCheck debug.txt for details.");
        }
 
index d5847904200f826bf8c9008a3e01e8ff9022dd66..cf9f28d309c587adfffc1c238f81483d4b6e4876 100644 (file)
@@ -653,7 +653,7 @@ ItemStack read_item(lua_State* L, int index,Server* srv)
        }
        else
        {
-               throw LuaError(L, "Expecting itemstack, itemstring, table or nil");
+               throw LuaError(NULL, "Expecting itemstack, itemstring, table or nil");
        }
 }
 
index 2866cfe86449cc7f78f7b07fe8ae787ba81c7d26..90846676ffebcecc6d33a1083b25b88927df5846 100644 (file)
@@ -55,6 +55,18 @@ int script_error_handler(lua_State *L) {
        return 1;
 }
 
+int script_exception_wrapper(lua_State *L, lua_CFunction f)
+{
+       try {
+               return f(L);  // Call wrapped function and return result.
+       } catch (const char *s) {  // Catch and convert exceptions.
+               lua_pushstring(L, s);
+       } catch (LuaError& e) {
+               lua_pushstring(L, e.what());
+       }
+       return lua_error(L);  // Rethrow as a Lua error.
+}
+
 void script_error(lua_State *L)
 {
        const char *s = lua_tostring(L, -1);
index eb6aa06e87e762c408384fcdf5d5c40d800a83a9..f3ef18d70e3e9d081b3acc62e008f6f32932d2ed 100644 (file)
@@ -66,6 +66,7 @@ enum RunCallbacksMode
 
 std::string script_get_backtrace(lua_State *L);
 int script_error_handler(lua_State *L);
+int script_exception_wrapper(lua_State *L, lua_CFunction f);
 void script_error(lua_State *L);
 void script_run_callbacks(lua_State *L, int nargs,
                RunCallbacksMode mode);
index a6faf98197f17eaafe3a922b9baa6bdb7968a7b7..6ffad1cb1eb5a09bfa65cb5539de9e2dc696ed08 100644 (file)
@@ -23,10 +23,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "common/c_internal.h"
 #include "itemdef.h"
 
-LuaError::LuaError(lua_State *L, const std::string &s)
+LuaError::LuaError(lua_State *L, const std::string &s) :
+       ServerError(s)
 {
-       m_s = "LuaError: " + s;
-       if (L) m_s += '\n' + script_get_backtrace(L);
+       if (L) {
+               m_s += '\n' + script_get_backtrace(L);
+       }
 }
 
 struct EnumString es_ItemType[] =
index bc9f1cb9671d7b8916c20b69678f37324bb3f469..709d4f34b12ea2f2d339cdd9a76d08bd457b2f1d 100644 (file)
@@ -26,6 +26,8 @@ extern "C" {
 
 #include <iostream>
 
+#include "exceptions.h"
+
 struct EnumString
 {
        int num;
@@ -50,7 +52,7 @@ public:
        }
 };
 
-class LuaError : public std::exception
+class LuaError : public ServerError
 {
 public:
        LuaError(lua_State *L, const std::string &s);
@@ -61,7 +63,6 @@ public:
        {
                return m_s.c_str();
        }
-       std::string m_s;
 };
 
 
index b957dc64fe0c196ffb850c605a846360f1a4efe9..898271743ee099ad1793aa9827cb9022c414373f 100644 (file)
@@ -29,6 +29,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 extern "C" {
 #include "lualib.h"
+#if USE_LUAJIT
+       #include "luajit.h"
+#endif
 }
 
 #include <stdio.h>
@@ -73,6 +76,14 @@ ScriptApiBase::ScriptApiBase()
        lua_pushlightuserdata(m_luastack, this);
        lua_setfield(m_luastack, LUA_REGISTRYINDEX, "scriptapi");
 
+       // If we are using LuaJIT add a C++ wrapper function to catch
+       // exceptions thrown in Lua -> C++ calls
+#if USE_LUAJIT
+       lua_pushlightuserdata(m_luastack, (void*) script_exception_wrapper);
+       luaJIT_setmode(m_luastack, -1, LUAJIT_MODE_WRAPCFUNC | LUAJIT_MODE_ON);
+       lua_pop(m_luastack, 1);
+#endif
+
        m_server = 0;
        m_environment = 0;
        m_guiengine = 0;
index 4ee6e4be0fd6a5be973a34ede5c16d08ee5c0a25..8542f0292356973c563e892962b05b346c578c1b 100644 (file)
@@ -54,7 +54,7 @@ int ScriptApiDetached::detached_inventory_AllowMove(
        if(lua_pcall(L, 7, 1, errorhandler))
                scriptError();
        if(!lua_isnumber(L, -1))
-               throw LuaError(L, "allow_move should return a number");
+               throw LuaError(NULL, "allow_move should return a number");
        int ret = luaL_checkinteger(L, -1);
        lua_pop(L, 2); // Pop integer and error handler
        return ret;
@@ -86,7 +86,7 @@ int ScriptApiDetached::detached_inventory_AllowPut(
        if(lua_pcall(L, 5, 1, errorhandler))
                scriptError();
        if(!lua_isnumber(L, -1))
-               throw LuaError(L, "allow_put should return a number");
+               throw LuaError(NULL, "allow_put should return a number");
        int ret = luaL_checkinteger(L, -1);
        lua_pop(L, 2); // Pop integer and error handler
        return ret;
@@ -118,7 +118,7 @@ int ScriptApiDetached::detached_inventory_AllowTake(
        if(lua_pcall(L, 5, 1, errorhandler))
                scriptError();
        if(!lua_isnumber(L, -1))
-               throw LuaError(L, "allow_take should return a number");
+               throw LuaError(NULL, "allow_take should return a number");
        int ret = luaL_checkinteger(L, -1);
        lua_pop(L, 2); // Pop integer and error handler
        return ret;
index 1f04383f171f4dc62077062ee28b768402573501..d8fd4dcfe4166314cbbc63a3acedfb9798c6c680 100644 (file)
@@ -61,7 +61,7 @@ int ScriptApiNodemeta::nodemeta_inventory_AllowMove(v3s16 p,
                scriptError();
        lua_remove(L, errorhandler); // Remove error handler
        if(!lua_isnumber(L, -1))
-               throw LuaError(L, "allow_metadata_inventory_move should return a number");
+               throw LuaError(NULL, "allow_metadata_inventory_move should return a number");
        int num = luaL_checkinteger(L, -1);
        lua_pop(L, 1); // Pop integer
        return num;
@@ -99,7 +99,7 @@ int ScriptApiNodemeta::nodemeta_inventory_AllowPut(v3s16 p,
                scriptError();
        lua_remove(L, errorhandler); // Remove error handler
        if(!lua_isnumber(L, -1))
-               throw LuaError(L, "allow_metadata_inventory_put should return a number");
+               throw LuaError(NULL, "allow_metadata_inventory_put should return a number");
        int num = luaL_checkinteger(L, -1);
        lua_pop(L, 1); // Pop integer
        return num;
@@ -137,7 +137,7 @@ int ScriptApiNodemeta::nodemeta_inventory_AllowTake(v3s16 p,
                scriptError();
        lua_remove(L, errorhandler); // Remove error handler
        if(!lua_isnumber(L, -1))
-               throw LuaError(L, "allow_metadata_inventory_take should return a number");
+               throw LuaError(NULL, "allow_metadata_inventory_take should return a number");
        int num = luaL_checkinteger(L, -1);
        lua_pop(L, 1); // Pop integer
        return num;
index 4baf90636bcd9027ef29c67548a81215ebcafa5e..98320b5785fcdd919a7ef96bb8cfcb0428678b3b 100644 (file)
@@ -33,7 +33,7 @@ bool ScriptApiServer::getAuth(const std::string &playername,
        getAuthHandler();
        lua_getfield(L, -1, "get_auth");
        if(lua_type(L, -1) != LUA_TFUNCTION)
-               throw LuaError(L, "Authentication handler missing get_auth");
+               throw LuaError(NULL, "Authentication handler missing get_auth");
        lua_pushstring(L, playername.c_str());
        if(lua_pcall(L, 1, 1, errorhandler))
                scriptError();
@@ -48,13 +48,13 @@ bool ScriptApiServer::getAuth(const std::string &playername,
        std::string password;
        bool found = getstringfield(L, -1, "password", password);
        if(!found)
-               throw LuaError(L, "Authentication handler didn't return password");
+               throw LuaError(NULL, "Authentication handler didn't return password");
        if(dst_password)
                *dst_password = password;
 
        lua_getfield(L, -1, "privileges");
        if(!lua_istable(L, -1))
-               throw LuaError(L, "Authentication handler didn't return privilege table");
+               throw LuaError(NULL, "Authentication handler didn't return privilege table");
        if(dst_privs)
                readPrivileges(-1, *dst_privs);
        lua_pop(L, 1);
@@ -74,7 +74,7 @@ void ScriptApiServer::getAuthHandler()
        }
        lua_remove(L, -2); // Remove minetest
        if(lua_type(L, -1) != LUA_TTABLE)
-               throw LuaError(L, "Authentication handler table not valid");
+               throw LuaError(NULL, "Authentication handler table not valid");
 }
 
 void ScriptApiServer::readPrivileges(int index, std::set<std::string> &result)
@@ -108,7 +108,7 @@ void ScriptApiServer::createAuth(const std::string &playername,
        lua_getfield(L, -1, "create_auth");
        lua_remove(L, -2); // Remove auth handler
        if(lua_type(L, -1) != LUA_TFUNCTION)
-               throw LuaError(L, "Authentication handler missing create_auth");
+               throw LuaError(NULL, "Authentication handler missing create_auth");
        lua_pushstring(L, playername.c_str());
        lua_pushstring(L, password.c_str());
        if(lua_pcall(L, 2, 0, errorhandler))
@@ -128,7 +128,7 @@ bool ScriptApiServer::setPassword(const std::string &playername,
        lua_getfield(L, -1, "set_password");
        lua_remove(L, -2); // Remove auth handler
        if(lua_type(L, -1) != LUA_TFUNCTION)
-               throw LuaError(L, "Authentication handler missing set_password");
+               throw LuaError(NULL, "Authentication handler missing set_password");
        lua_pushstring(L, playername.c_str());
        lua_pushstring(L, password.c_str());
        if(lua_pcall(L, 2, 1, errorhandler))
index 808043bd49c318848799362ee023ac71a460186a..694ce5a1e3b1709c9a2681b8ef49be1f8613067a 100644 (file)
@@ -48,7 +48,7 @@ protected:
                ScriptApiBase *scriptIface = getScriptApiBase(L);
                T *scriptIfaceDowncast = dynamic_cast<T*>(scriptIface);
                if (!scriptIfaceDowncast) {
-                       throw LuaError(L, "Requested unavailable ScriptApi - core engine bug!");
+                       throw LuaError(NULL, "Requested unavailable ScriptApi - core engine bug!");
                }
                return scriptIfaceDowncast;
        }
index 035abb78d97c19fa775fc12e6c5786cdf9627b24..ef13aa82ce69f1d2aab81b8dab3e4c09f3d39cb7 100644 (file)
@@ -150,16 +150,16 @@ int ModApiCraft::l_register_craft(lua_State *L)
        if(type == "shaped"){
                std::string output = getstringfield_default(L, table, "output", "");
                if(output == "")
-                       throw LuaError(L, "Crafting definition is missing an output");
+                       throw LuaError(NULL, "Crafting definition is missing an output");
 
                int width = 0;
                std::vector<std::string> recipe;
                lua_getfield(L, table, "recipe");
                if(lua_isnil(L, -1))
-                       throw LuaError(L, "Crafting definition is missing a recipe"
+                       throw LuaError(NULL, "Crafting definition is missing a recipe"
                                        " (output=\"" + output + "\")");
                if(!readCraftRecipeShaped(L, -1, width, recipe))
-                       throw LuaError(L, "Invalid crafting recipe"
+                       throw LuaError(NULL, "Invalid crafting recipe"
                                        " (output=\"" + output + "\")");
 
                CraftReplacements replacements;
@@ -167,7 +167,7 @@ int ModApiCraft::l_register_craft(lua_State *L)
                if(!lua_isnil(L, -1))
                {
                        if(!readCraftReplacements(L, -1, replacements))
-                               throw LuaError(L, "Invalid replacements"
+                               throw LuaError(NULL, "Invalid replacements"
                                                " (output=\"" + output + "\")");
                }
 
@@ -181,17 +181,17 @@ int ModApiCraft::l_register_craft(lua_State *L)
        else if(type == "shapeless"){
                std::string output = getstringfield_default(L, table, "output", "");
                if(output == "")
-                       throw LuaError(L, "Crafting definition (shapeless)"
+                       throw LuaError(NULL, "Crafting definition (shapeless)"
                                        " is missing an output");
 
                std::vector<std::string> recipe;
                lua_getfield(L, table, "recipe");
                if(lua_isnil(L, -1))
-                       throw LuaError(L, "Crafting definition (shapeless)"
+                       throw LuaError(NULL, "Crafting definition (shapeless)"
                                        " is missing a recipe"
                                        " (output=\"" + output + "\")");
                if(!readCraftRecipeShapeless(L, -1, recipe))
-                       throw LuaError(L, "Invalid crafting recipe"
+                       throw LuaError(NULL, "Invalid crafting recipe"
                                        " (output=\"" + output + "\")");
 
                CraftReplacements replacements;
@@ -199,7 +199,7 @@ int ModApiCraft::l_register_craft(lua_State *L)
                if(!lua_isnil(L, -1))
                {
                        if(!readCraftReplacements(L, -1, replacements))
-                               throw LuaError(L, "Invalid replacements"
+                               throw LuaError(NULL, "Invalid replacements"
                                                " (output=\"" + output + "\")");
                }
 
@@ -224,12 +224,12 @@ int ModApiCraft::l_register_craft(lua_State *L)
        else if(type == "cooking"){
                std::string output = getstringfield_default(L, table, "output", "");
                if(output == "")
-                       throw LuaError(L, "Crafting definition (cooking)"
+                       throw LuaError(NULL, "Crafting definition (cooking)"
                                        " is missing an output");
 
                std::string recipe = getstringfield_default(L, table, "recipe", "");
                if(recipe == "")
-                       throw LuaError(L, "Crafting definition (cooking)"
+                       throw LuaError(NULL, "Crafting definition (cooking)"
                                        " is missing a recipe"
                                        " (output=\"" + output + "\")");
 
@@ -240,7 +240,7 @@ int ModApiCraft::l_register_craft(lua_State *L)
                if(!lua_isnil(L, -1))
                {
                        if(!readCraftReplacements(L, -1, replacements))
-                               throw LuaError(L, "Invalid replacements"
+                               throw LuaError(NULL, "Invalid replacements"
                                                " (cooking output=\"" + output + "\")");
                }
 
@@ -254,7 +254,7 @@ int ModApiCraft::l_register_craft(lua_State *L)
        else if(type == "fuel"){
                std::string recipe = getstringfield_default(L, table, "recipe", "");
                if(recipe == "")
-                       throw LuaError(L, "Crafting definition (fuel)"
+                       throw LuaError(NULL, "Crafting definition (fuel)"
                                        " is missing a recipe");
 
                float burntime = getfloatfield_default(L, table, "burntime", 1.0);
@@ -264,7 +264,7 @@ int ModApiCraft::l_register_craft(lua_State *L)
                if(!lua_isnil(L, -1))
                {
                        if(!readCraftReplacements(L, -1, replacements))
-                               throw LuaError(L, "Invalid replacements"
+                               throw LuaError(NULL, "Invalid replacements"
                                                " (fuel recipe=\"" + recipe + "\")");
                }
 
@@ -274,7 +274,7 @@ int ModApiCraft::l_register_craft(lua_State *L)
        }
        else
        {
-               throw LuaError(L, "Unknown crafting definition type: \"" + type + "\"");
+               throw LuaError(NULL, "Unknown crafting definition type: \"" + type + "\"");
        }
 
        lua_pop(L, 1);
index 512cd7398cd24d141cb01665fb053ab5b67a0d36..4b5c8979244b692ecbfcfac74692ea6aa8b8e58e 100644 (file)
@@ -470,7 +470,7 @@ int ModApiItemMod::l_register_item_raw(lua_State *L)
                name = lua_tostring(L, -1);
                verbosestream<<"register_item_raw: "<<name<<std::endl;
        } else {
-               throw LuaError(L, "register_item_raw: name is not defined or not a string");
+               throw LuaError(NULL, "register_item_raw: name is not defined or not a string");
        }
 
        // Check if on_use is defined
@@ -500,7 +500,7 @@ int ModApiItemMod::l_register_item_raw(lua_State *L)
                content_t id = ndef->set(f.name, f);
 
                if(id > MAX_REGISTERED_CONTENT){
-                       throw LuaError(L, "Number of registerable nodes ("
+                       throw LuaError(NULL, "Number of registerable nodes ("
                                        + itos(MAX_REGISTERED_CONTENT+1)
                                        + ") exceeded (" + name + ")");
                }
index 4b0c7932ddb31ee83c29c06e94d20453f519c3fc..4ca9992af5db7f2a688a3ae96feb279fc0ae3255 100644 (file)
@@ -330,10 +330,10 @@ int LuaPseudoRandom::l_next(lua_State *L)
                max = luaL_checkinteger(L, 3);
        if(max < min){
                errorstream<<"PseudoRandom.next(): max="<<max<<" min="<<min<<std::endl;
-               throw LuaError(L, "PseudoRandom.next(): max < min");
+               throw LuaError(NULL, "PseudoRandom.next(): max < min");
        }
        if(max - min != 32767 && max - min > 32767/5)
-               throw LuaError(L, "PseudoRandom.next() max-min is not 32767"
+               throw LuaError(NULL, "PseudoRandom.next() max-min is not 32767"
                                " and is > 32768/5. This is disallowed due to"
                                " the bad random distribution the"
                                " implementation would otherwise make.");
index e71a811ea163a2d1c92675779cefb920e4b09462..28678f59c7e4f8dbbceb638d683fda526cb3e7df 100644 (file)
@@ -55,23 +55,6 @@ class ServerEnvironment;
 struct SimpleSoundSpec;
 
 
-class ServerError : public std::exception
-{
-public:
-       ServerError(const std::string &s)
-       {
-               m_s = "ServerError: ";
-               m_s += s;
-       }
-       virtual ~ServerError() throw()
-       {}
-       virtual const char * what() const throw()
-       {
-               return m_s.c_str();
-       }
-       std::string m_s;
-};
-
 /*
        Some random functions
 */