summaryrefslogtreecommitdiffstats
path: root/Sluift
diff options
context:
space:
mode:
authorRemko Tronçon <git@el-tramo.be>2013-12-26 15:56:45 (GMT)
committerRemko Tronçon <git@el-tramo.be>2013-12-27 23:06:53 (GMT)
commit5a89265623214164fa7ce36721de05183d53058d (patch)
tree1cb061f1c314668396dd0e16047d995641631d4f /Sluift
parent806efd2603a4083ca433501dcd6e5b8479db0b39 (diff)
downloadswift-5a89265623214164fa7ce36721de05183d53058d.zip
swift-5a89265623214164fa7ce36721de05183d53058d.tar.bz2
Sluift: Refactoring
- Rename boot.lua to core.lua - Support Lua 5.2 - Support version prefixes for sluift module - Add Client:process_events Change-Id: I3fa6d06d1dbdf86f65b9f4203bd2ec5b5526b104
Diffstat (limited to 'Sluift')
-rw-r--r--Sluift/.gitignore2
-rw-r--r--Sluift/Lua/LuaUtils.cpp4
-rw-r--r--Sluift/SConscript8
-rw-r--r--Sluift/SluiftGlobals.h2
-rw-r--r--Sluift/client.cpp2
-rw-r--r--Sluift/core.lua (renamed from Sluift/boot.lua)41
-rw-r--r--Sluift/linit.c37
-rw-r--r--Sluift/sluift.cpp29
-rw-r--r--Sluift/sluift.h4
9 files changed, 77 insertions, 52 deletions
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