[CSM] Don't load the IO library. (#6087)
authorred-001 <red-001@outlook.ie>
Thu, 4 Jan 2018 07:21:12 +0000 (07:21 +0000)
committerLoïc Blot <nerzhul@users.noreply.github.com>
Thu, 4 Jan 2018 07:21:12 +0000 (08:21 +0100)
* [CSM] Don't load the IO library.

* Rename the function to match the Lua API function name and add a missing `const`

* Add a comment to explain some strange code and fix the other issues pointed out by shadowninja.

src/script/cpp_api/s_async.cpp
src/script/cpp_api/s_base.cpp
src/script/cpp_api/s_base.h
src/script/scripting_client.cpp
src/script/scripting_mainmenu.cpp
src/script/scripting_server.cpp

index 93a200c22366dfac217fc1696a9525a44887e049..5f1f9297e9820b4b68220d7a545897df963e3344 100644 (file)
@@ -198,6 +198,7 @@ void AsyncEngine::prepareEnvironment(lua_State* L, int top)
 AsyncWorkerThread::AsyncWorkerThread(AsyncEngine* jobDispatcher,
                const std::string &name) :
        Thread(name),
+       ScriptApiBase(ScriptingType::Async),
        jobDispatcher(jobDispatcher)
 {
        lua_State *L = getStack();
index c0d9a4f103c9b593745c87a15fdbbce57dbef3ad..1decb836db0e3c8392042a1e781e6d946ff3fcca 100644 (file)
@@ -71,7 +71,8 @@ public:
        ScriptApiBase
 */
 
-ScriptApiBase::ScriptApiBase()
+ScriptApiBase::ScriptApiBase(ScriptingType type):
+               m_type(type)
 {
 #ifdef SCRIPTAPI_LOCK_DEBUG
        m_lock_recursion_count = 0;
@@ -82,7 +83,10 @@ ScriptApiBase::ScriptApiBase()
 
        lua_atpanic(m_luastack, &luaPanic);
 
-       luaL_openlibs(m_luastack);
+       if (m_type == ScriptingType::Client)
+               clientOpenLibs(m_luastack);
+       else
+               luaL_openlibs(m_luastack);
 
        // Make the ScriptApiBase* accessible to ModApiBase
        lua_pushlightuserdata(m_luastack, this);
@@ -106,7 +110,10 @@ ScriptApiBase::ScriptApiBase()
        lua_newtable(m_luastack);
        lua_setglobal(m_luastack, "core");
 
-       lua_pushstring(m_luastack, DIR_DELIM);
+       if (m_type == ScriptingType::Client)
+               lua_pushstring(m_luastack, "/");
+       else
+               lua_pushstring(m_luastack, DIR_DELIM);
        lua_setglobal(m_luastack, "DIR_DELIM");
 
        lua_pushstring(m_luastack, porting::getPlatformName());
@@ -128,6 +135,28 @@ int ScriptApiBase::luaPanic(lua_State *L)
        return 0;
 }
 
+void ScriptApiBase::clientOpenLibs(lua_State *L)
+{
+       static const std::vector<std::pair<std::string, lua_CFunction>> m_libs = {
+               { "", luaopen_base },
+               { LUA_LOADLIBNAME, luaopen_package },
+               { LUA_TABLIBNAME,  luaopen_table   },
+               { LUA_OSLIBNAME,   luaopen_os      },
+               { LUA_STRLIBNAME,  luaopen_string  },
+               { LUA_MATHLIBNAME, luaopen_math    },
+               { LUA_DBLIBNAME,   luaopen_debug   },
+#if USE_LUAJIT
+               { LUA_JITLIBNAME,  luaopen_jit     },
+#endif
+       };
+       
+       for (const std::pair<std::string, lua_CFunction> &lib : m_libs) {
+           lua_pushcfunction(L, lib.second);
+           lua_pushstring(L, lib.first.c_str());
+           lua_call(L, 1, 0);
+       }
+}
+
 void ScriptApiBase::loadMod(const std::string &script_path,
                const std::string &mod_name)
 {
index a170f82dc7113d128d0fd884c05137cb244c51a7..18cb841cf877fbcae5dfa17d551d627ea62612a2 100644 (file)
@@ -23,15 +23,19 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <string>
 #include <thread>
 #include <mutex>
+#include <unordered_map>
 #include "util/basic_macros.h"
 
 extern "C" {
 #include <lua.h>
+#include <lualib.h>
 }
 
 #include "irrlichttypes.h"
 #include "common/c_types.h"
 #include "common/c_internal.h"
+#include "debug.h"
+#include "cmake_config.h"
 
 #define SCRIPTAPI_LOCK_DEBUG
 #define SCRIPTAPI_DEBUG
@@ -54,9 +58,10 @@ extern "C" {
        setOriginFromTableRaw(index, __FUNCTION__)
 
 enum class ScriptingType: u8 {
+       Async,
        Client,
-       Server,
-       MainMenu
+       MainMenu,
+       Server
 };
 
 class Server;
@@ -70,7 +75,12 @@ class ServerActiveObject;
 
 class ScriptApiBase {
 public:
-       ScriptApiBase();
+       ScriptApiBase(ScriptingType type);
+       // fake constructor to allow script API classes (e.g ScriptApiEnv) to virtually inherit from this one.
+       ScriptApiBase()
+       {
+               FATAL_ERROR("ScriptApiBase created without ScriptingType!");
+       }
        virtual ~ScriptApiBase();
        DISABLE_CLASS_COPY(ScriptApiBase);
 
@@ -91,7 +101,6 @@ public:
 
        IGameDef *getGameDef() { return m_gamedef; }
        Server* getServer();
-       void setType(ScriptingType type) { m_type = type; }
        ScriptingType getType() { return m_type; }
 #ifndef SERVER
        Client* getClient();
@@ -101,6 +110,8 @@ public:
        void setOriginDirect(const char *origin);
        void setOriginFromTableRaw(int index, const char *fxn);
 
+       void clientOpenLibs(lua_State *L);
+
 protected:
        friend class LuaABM;
        friend class LuaLBM;
index 29836c47b516a8b0b0fdaa582d0a7d6405affc66..14cdc199b61d3c6ca971e16e1a697a8b574e5cd1 100644 (file)
@@ -33,10 +33,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "lua_api/l_localplayer.h"
 #include "lua_api/l_camera.h"
 
-ClientScripting::ClientScripting(Client *client)
+ClientScripting::ClientScripting(Client *client):
+       ScriptApiBase(ScriptingType::Client)
 {
        setGameDef(client);
-       setType(ScriptingType::Client);
 
        SCRIPTAPI_PRECHECKHEADER
 
@@ -59,9 +59,6 @@ ClientScripting::ClientScripting(Client *client)
        lua_pushstring(L, "client");
        lua_setglobal(L, "INIT");
 
-       lua_pushstring(L, "/");
-       lua_setglobal(L, "DIR_DELIM");
-
        infostream << "SCRIPTAPI: Initialized client game modules" << std::endl;
 }
 
index b8a44205a9fc962c9853087b43aa42b69396ef7d..0ff60951bd04b18bc31c9c85db285478ddda5c88 100644 (file)
@@ -34,10 +34,10 @@ extern "C" {
 #define MAINMENU_NUM_ASYNC_THREADS 4
 
 
-MainMenuScripting::MainMenuScripting(GUIEngine* guiengine)
+MainMenuScripting::MainMenuScripting(GUIEngine* guiengine):
+               ScriptApiBase(ScriptingType::MainMenu)
 {
        setGuiEngine(guiengine);
-       setType(ScriptingType::MainMenu);
 
        SCRIPTAPI_PRECHECKHEADER
 
index 095216a74cb4c6ad46eb07e3b05e95bcbe1d9112..1eee24c61a0f35ecd6076f3f7c6ce9d9b8245aa4 100644 (file)
@@ -48,10 +48,10 @@ extern "C" {
 #include "lualib.h"
 }
 
-ServerScripting::ServerScripting(Server* server)
+ServerScripting::ServerScripting(Server* server):
+               ScriptApiBase(ScriptingType::Server)
 {
        setGameDef(server);
-       setType(ScriptingType::Server);
 
        // setEnv(env) is called by ScriptApiEnv::initializeEnvironment()
        // once the environment has been created