diff options
-rw-r--r-- | BuildTools/SCons/SConstruct | 2 | ||||
-rw-r--r-- | Sluift/.gitignore | 2 | ||||
-rw-r--r-- | Sluift/Lua/LuaUtils.cpp | 4 | ||||
-rw-r--r-- | Sluift/SConscript | 8 | ||||
-rw-r--r-- | Sluift/SluiftGlobals.h | 2 | ||||
-rw-r--r-- | Sluift/client.cpp | 2 | ||||
-rw-r--r-- | Sluift/core.lua (renamed from Sluift/boot.lua) | 41 | ||||
-rw-r--r-- | Sluift/linit.c | 37 | ||||
-rw-r--r-- | Sluift/sluift.cpp | 29 | ||||
-rw-r--r-- | Sluift/sluift.h | 4 |
10 files changed, 78 insertions, 53 deletions
diff --git a/BuildTools/SCons/SConstruct b/BuildTools/SCons/SConstruct index 9eeaabe..8c5258e 100644 --- a/BuildTools/SCons/SConstruct +++ b/BuildTools/SCons/SConstruct @@ -422,7 +422,7 @@ if env.get("lua_includedir", None) : lua_flags["CPPPATH"] = [env["lua_includedir"]] lua_conf_env.MergeFlags(lua_flags) conf = Configure(lua_conf_env) -if not env.get("lua_force_bundled", False) and conf.CheckCXXHeader("lua.hpp") and conf.CheckLib(env["lua_libname"]) : +if not env.get("lua_force_bundled", False) and conf.CheckLibWithHeader(env["lua_libname"], "lua.hpp", "cxx", autoadd = 0) : env["HAVE_LUA"] = 1 env["LUA_FLAGS"] = { "LIBS": [env["lua_libname"]] } lua_version = GetVersion(conf, "LUA_VERSION_NUM", "lua.h") diff --git a/Sluift/.gitignore b/Sluift/.gitignore index e5fd1e5..940fc86 100644 --- a/Sluift/.gitignore +++ b/Sluift/.gitignore @@ -2,6 +2,6 @@ lua.c sluift_dll.cpp sluift dll.c -boot.c +core.c dll/ exe/ diff --git a/Sluift/Lua/LuaUtils.cpp b/Sluift/Lua/LuaUtils.cpp index 7052abe..b00ab56 100644 --- a/Sluift/Lua/LuaUtils.cpp +++ b/Sluift/Lua/LuaUtils.cpp @@ -22,7 +22,7 @@ static const std::string INDENT = " "; void Swift::Lua::registerTableToString(lua_State* L, int index) { index = Lua::absoluteOffset(L, index); - lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.bootIndex); + lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); lua_getfield(L, -1, "register_table_tostring"); lua_pushvalue(L, index); if (lua_pcall(L, 1, 0, 0) != 0) { @@ -33,7 +33,7 @@ void Swift::Lua::registerTableToString(lua_State* L, int index) { void Swift::Lua::registerGetByTypeIndex(lua_State* L, int index) { index = Lua::absoluteOffset(L, index); - lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.bootIndex); + lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); lua_getfield(L, -1, "register_get_by_type_index"); lua_pushvalue(L, index); if (lua_pcall(L, 1, 0, 0) != 0) { diff --git a/Sluift/SConscript b/Sluift/SConscript index 1a29e43..c8f1108 100644 --- a/Sluift/SConscript +++ b/Sluift/SConscript @@ -32,7 +32,7 @@ elif env["SCONS_STAGE"] == "build" : "ElementConvertors/CommandConvertor.cpp", "ClientHelpers.cpp", "SluiftClient.cpp", - "boot.c", + "core.c", "client.cpp", "sluift.cpp" ] @@ -42,6 +42,8 @@ elif env["SCONS_STAGE"] == "build" : sluift_env.UseFlags(env.get("LUA_FLAGS", {})) sluift_env.UseFlags(env["SWIFTEN_FLAGS"]) sluift_env.UseFlags(env["SWIFTEN_DEP_FLAGS"]) + # Support compilation on both Lua 5.1 and Lua 5.2 + sluift_env.Append(CPPDEFINES = ["LUA_COMPAT_ALL"]) if sluift_env["PLATFORM"] == "win32" : sluift_env.Append(CPPDEFINES = ["SLUIFT_BUILD_DLL"]) @@ -62,7 +64,7 @@ elif env["SCONS_STAGE"] == "build" : f.close() sluift_env.Command("lua.c", ["#/3rdParty/Lua/src/lua.c", sluift_env.Value(sluift_env["SLUIFT_VERSION"])], env.Action(patchLua, cmdstr = "$GENCOMSTR")) - # Generate boot.cpp + # Generate core.cpp def generate_embedded_lua(env, target, source) : f = open(source[0].abspath, "r") data = f.read() @@ -70,7 +72,7 @@ elif env["SCONS_STAGE"] == "build" : f = open(target[0].abspath, "w") f.write('const char ' + source[0].name.replace(".", "_") + "[] = \"" + data.replace("\\", "\\\\").replace("\n", "\\n").replace('"', '\\"') + "\";") f.close() - sluift_env.Command("boot.c", ["boot.lua"], env.Action(generate_embedded_lua, cmdstr="$GENCOMSTR")) + sluift_env.Command("core.c", ["core.lua"], env.Action(generate_embedded_lua, cmdstr="$GENCOMSTR")) if sluift_env.get("HAVE_READLINE", False) : sluift_env.Append(CPPDEFINES = ["LUA_USE_READLINE"]) diff --git a/Sluift/SluiftGlobals.h b/Sluift/SluiftGlobals.h index 03c1c1a..18a90c2 100644 --- a/Sluift/SluiftGlobals.h +++ b/Sluift/SluiftGlobals.h @@ -19,6 +19,6 @@ namespace Swift { LuaElementConvertors elementConvertor; SimpleEventLoop eventLoop; BoostNetworkFactories networkFactories; - int bootIndex; + int coreLibIndex; }; } diff --git a/Sluift/client.cpp b/Sluift/client.cpp index 97f9106..9eac84b 100644 --- a/Sluift/client.cpp +++ b/Sluift/client.cpp @@ -419,7 +419,7 @@ static void pushEvent(lua_State* L, const SluiftClient::Event& event) { lua_pushstring(L, event.from.toString().c_str()); lua_setfield(L, -2, "from"); - lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.bootIndex); + lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); lua_getfield(L, -1, "process_pubsub_event"); lua_pushvalue(L, -3); lua_call(L, 1, 0); diff --git a/Sluift/boot.lua b/Sluift/core.lua index a28a189..e2d4f8e 100644 --- a/Sluift/boot.lua +++ b/Sluift/core.lua @@ -4,6 +4,12 @@ See the COPYING file for more information. --]] +local _G = _G +local pairs, ipairs, print, tostring, type, error = pairs, ipairs, print, tostring, type, error +local setmetatable, getmetatable = setmetatable, getmetatable +local string = string +_ENV = nil + local Client = {} local PubSub = {} local PubSubNode = {} @@ -23,11 +29,12 @@ local function merge_tables(...) end local function clone_table(table) - return merge_tables(table) + return merge_tables(table) end local function parse_options(unnamed_parameters, arg1, arg2) local options = {} + local f if type(arg1) == 'table' then options = arg1 f = arg2 @@ -103,7 +110,7 @@ local function get_by_type(table, typ) if v['_type'] == typ then return v end - end + end end local function register_get_by_type_index(table) @@ -118,6 +125,20 @@ local function register_get_by_type_index(table) return table end +local function call(options) + local f = options[1] + local result = { xpcall(f, debug.traceback) } + if options.finally then + options.finally() + end + if result[1] then + table.remove(result, 1) + return unpack(result) + else + error(result[2]) + end +end + -------------------------------------------------------------------------------- -- Client -------------------------------------------------------------------------------- @@ -128,14 +149,7 @@ function Client:connect (...) self:async_connect(options) self:wait_connected() if f then - local result = { xpcall(function() return f(self) end, debug.traceback) } - self:disconnect() - if result[1] then - table.remove(result, 1) - return unpack(result) - else - error(result[2]) - end + return call {function() return f(self) end, finally = function() self:disconnect() end} end return true end @@ -180,6 +194,11 @@ for method, event_type in pairs({messages = 'message', pubsub_events = 'pubsub'} end end +-- Process all pending events +function Client:process_events () + for event in self:events{timeout=0} do end +end + -- -- Register get_* and set_* convenience methods for some type of queries -- @@ -254,7 +273,7 @@ for _, method in ipairs({'events', 'get_next_event', 'for_each_event'}) do return event.type == 'pubsub' and event.from == node.jid and event.node == node end return node.client[method](node.client, options) - end + end end -------------------------------------------------------------------------------- diff --git a/Sluift/linit.c b/Sluift/linit.c index 8f0614b..ad27b37 100644 --- a/Sluift/linit.c +++ b/Sluift/linit.c @@ -4,33 +4,34 @@ #include "sluift.h" static const luaL_Reg lualibs[] = { - {"", luaopen_base}, - {LUA_LOADLIBNAME, luaopen_package}, - {LUA_TABLIBNAME, luaopen_table}, - {LUA_IOLIBNAME, luaopen_io}, - {LUA_OSLIBNAME, luaopen_os}, - {LUA_STRLIBNAME, luaopen_string}, - {LUA_MATHLIBNAME, luaopen_math}, - {LUA_DBLIBNAME, luaopen_debug}, - {"sluift", luaopen_sluift}, - {NULL, NULL} + {"", luaopen_base}, + {LUA_LOADLIBNAME, luaopen_package}, + {LUA_TABLIBNAME, luaopen_table}, + {LUA_IOLIBNAME, luaopen_io}, + {LUA_OSLIBNAME, luaopen_os}, + {LUA_STRLIBNAME, luaopen_string}, + {LUA_MATHLIBNAME, luaopen_math}, + {LUA_DBLIBNAME, luaopen_debug}, + {"sluift", luaopen_sluift}, + {NULL, NULL} }; LUALIB_API void luaL_openlibs (lua_State *L) { - const luaL_Reg *lib = lualibs; - for (; lib->func; lib++) { - lua_pushcfunction(L, lib->func); - lua_pushstring(L, lib->name); - lua_call(L, 1, 0); - } + const luaL_Reg *lib = lualibs; + for (; lib->func; lib++) { + lua_pushcfunction(L, lib->func); + lua_pushstring(L, lib->name); + lua_call(L, 1, 0); + } /* Import sluift into global namespace */ - lua_getfield(L, LUA_GLOBALSINDEX, "sluift"); + lua_pushglobaltable(L); + lua_getfield(L, -1, "sluift"); for (lua_pushnil(L); lua_next(L, -2); ) { lua_pushvalue(L, -2); lua_pushvalue(L, -2); - lua_settable(L, LUA_GLOBALSINDEX); + lua_settable(L, -6); lua_pop(L, 1); } } diff --git a/Sluift/sluift.cpp b/Sluift/sluift.cpp index 95e7101..e6b2bb6 100644 --- a/Sluift/sluift.cpp +++ b/Sluift/sluift.cpp @@ -40,7 +40,7 @@ namespace Swift { } } -extern "C" const char boot_lua[]; +extern "C" const char core_lua[]; /******************************************************************************* * Module functions @@ -263,21 +263,21 @@ SLUIFT_LUA_FUNCTION(IDN, stringprep) { * Module registration ******************************************************************************/ -static const luaL_reg sluift_functions[] = { {NULL, NULL} }; +static const luaL_Reg sluift_functions[] = { {NULL, NULL} }; SLUIFT_API int luaopen_sluift(lua_State* L) { // Initialize globals Sluift::globals.debug = false; Sluift::globals.timeout = -1; - luaL_register(L, "sluift", sluift_functions); + luaL_register(L, lua_tostring(L, 1), sluift_functions); - // Load bootstrap code - if (luaL_loadbuffer(L, boot_lua, strlen(boot_lua), "boot.lua") != 0) { + // Load core lib code + if (luaL_loadbuffer(L, core_lua, strlen(core_lua), "core.lua") != 0) { lua_error(L); } lua_call(L, 0, 1); - Sluift::globals.bootIndex = luaL_ref(L, LUA_REGISTRYINDEX); + Sluift::globals.coreLibIndex = luaL_ref(L, LUA_REGISTRYINDEX); // Register functions Lua::FunctionRegistry::getInstance().addFunctionsToTable(L, "Sluift"); @@ -289,14 +289,13 @@ SLUIFT_API int luaopen_sluift(lua_State* L) { lua_setfield(L, -2, "idn"); // Register convenience functions - lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.bootIndex); - lua_getfield(L, -1, "tprint"); - lua_setfield(L, -3, "tprint"); - lua_pop(L, 1); - - lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.bootIndex); - lua_getfield(L, -1, "disco"); - lua_setfield(L, -3, "disco"); + lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); + std::vector<std::string> coreLibExports = boost::assign::list_of + ("tprint")("disco"); + foreach (const std::string& coreLibExport, coreLibExports) { + lua_getfield(L, -1, coreLibExport.c_str()); + lua_setfield(L, -3, coreLibExport.c_str()); + } lua_pop(L, 1); // Set read only @@ -312,7 +311,7 @@ SLUIFT_API int luaopen_sluift(lua_State* L) { foreach (const std::string& table, tables) { Lua::FunctionRegistry::getInstance().registerTypeMetaTable(L, table); luaL_getmetatable(L, Lua::FunctionRegistry::getMetaTableNameForType(table).c_str()); - lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.bootIndex); + lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); lua_getfield(L, -1, table.c_str()); if (!lua_isnil(L, -1)) { for (lua_pushnil(L); lua_next(L, -2); ) { diff --git a/Sluift/sluift.h b/Sluift/sluift.h index b82e1c4..2613370 100644 --- a/Sluift/sluift.h +++ b/Sluift/sluift.h @@ -20,6 +20,10 @@ #include <lua.h> #endif +#if LUA_VERSION_NUM < 502 +#define lua_pushglobaltable(L) lua_pushvalue(L, LUA_GLOBALSINDEX) +#endif + #if defined(__cplusplus) extern "C" #endif |