X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fscript%2Fcpp_api%2Fs_base.h;h=4837f4f993f9366bacc068619b3c870d3c2cf27d;hb=d6050bee5187d0d456e9d95406fc74ba163ea3aa;hp=75552cc34f9bac163ba91fc14110b879834cde39;hpb=371b39a09a0bf248d674fae718f5ff369e895b66;p=minetest.git diff --git a/src/script/cpp_api/s_base.h b/src/script/cpp_api/s_base.h index 75552cc34..4837f4f99 100644 --- a/src/script/cpp_api/s_base.h +++ b/src/script/cpp_api/s_base.h @@ -17,44 +17,104 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef S_BASE_H_ -#define S_BASE_H_ +#pragma once #include #include +#include +#include +#include +#include "util/basic_macros.h" extern "C" { #include +#include } #include "irrlichttypes.h" -#include "jthread/jmutex.h" -#include "jthread/jmutexautolock.h" #include "common/c_types.h" #include "common/c_internal.h" +#include "debug.h" +#include "config.h" #define SCRIPTAPI_LOCK_DEBUG +#define SCRIPTAPI_DEBUG + +// MUST be an invalid mod name so that mods can't +// use that name to bypass security! +#define BUILTIN_MOD_NAME "*builtin*" + +#define PCALL_RES(RES) { \ + int result_ = (RES); \ + if (result_ != 0) { \ + scriptError(result_, __FUNCTION__); \ + } \ +} + +#define runCallbacks(nargs, mode) \ + runCallbacksRaw((nargs), (mode), __FUNCTION__) + +#define setOriginFromTable(index) \ + setOriginFromTableRaw(index, __FUNCTION__) + +enum class ScriptingType: u8 { + Async, + Client, + MainMenu, + Server +}; class Server; +#ifndef SERVER +class Client; +#endif +class IGameDef; class Environment; class GUIEngine; 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); - bool loadMod(const std::string &scriptpath, const std::string &modname); - bool loadScript(const std::string &scriptpath); + // These throw a ModError on failure + void loadMod(const std::string &script_path, const std::string &mod_name); + void loadScript(const std::string &script_path); + +#ifndef SERVER + void loadModFromMemory(const std::string &mod_name); +#endif + + void runCallbacksRaw(int nargs, + RunCallbacksMode mode, const char *fxn); /* object */ void addObjectReference(ServerActiveObject *cobj); void removeObjectReference(ServerActiveObject *cobj); + IGameDef *getGameDef() { return m_gamedef; } + Server* getServer(); + ScriptingType getType() { return m_type; } +#ifndef SERVER + Client* getClient(); +#endif + + std::string getOrigin() { return m_last_run_mod; } + void setOriginDirect(const char *origin); + void setOriginFromTableRaw(int index, const char *fxn); + + void clientOpenLibs(lua_State *L); + protected: friend class LuaABM; + friend class LuaLBM; friend class InvRef; friend class ObjectRef; friend class NodeMetaRef; @@ -66,11 +126,10 @@ class ScriptApiBase { { return m_luastack; } void realityCheck(); - void scriptError(); + void scriptError(int result, const char *fxn); void stackDump(std::ostream &o); - Server* getServer() { return m_server; } - void setServer(Server* server) { m_server = server; } + void setGameDef(IGameDef* gamedef) { m_gamedef = gamedef; } Environment* getEnv() { return m_environment; } void setEnv(Environment* env) { m_environment = env; } @@ -78,19 +137,23 @@ class ScriptApiBase { GUIEngine* getGuiEngine() { return m_guiengine; } void setGuiEngine(GUIEngine* guiengine) { m_guiengine = guiengine; } - void objectrefGetOrCreate(ServerActiveObject *cobj); - void objectrefGet(u16 id); + void objectrefGetOrCreate(lua_State *L, ServerActiveObject *cobj); - JMutex m_luastackmutex; + std::recursive_mutex m_luastackmutex; + std::string m_last_run_mod; + bool m_secure = false; #ifdef SCRIPTAPI_LOCK_DEBUG - bool m_locked; + int m_lock_recursion_count; + std::thread::id m_owning_thread; #endif + private: - lua_State* m_luastack; + static int luaPanic(lua_State *L); - Server* m_server; - Environment* m_environment; - GUIEngine* m_guiengine; -}; + lua_State *m_luastack = nullptr; -#endif /* S_BASE_H_ */ + IGameDef *m_gamedef = nullptr; + Environment *m_environment = nullptr; + GUIEngine *m_guiengine = nullptr; + ScriptingType m_type; +};