diff --git a/lualib-src/lua-sharetable.c b/lualib-src/lua-sharetable.c index 720274ae..7b6c2671 100644 --- a/lualib-src/lua-sharetable.c +++ b/lualib-src/lua-sharetable.c @@ -145,17 +145,15 @@ load_matrixfile(lua_State *L) { luaL_openlibs(L); const char * source = (const char *)lua_touserdata(L, 1); if (source[0] == '@') { - if (luaL_loadfilex_(L, source+1, NULL) || lua_pcall(L, 0, LUA_MULTRET, 0)) { + if (luaL_loadfilex_(L, source+1, NULL) != LUA_OK) lua_error(L); - } } else { - if (luaL_dostring(L, source) != LUA_OK) { + if (luaL_loadstring(L, source) != LUA_OK) lua_error(L); - } - } - if (lua_gettop(L) == 0) { - luaL_error(L, "No table returns"); } + lua_replace(L, 1); + if (lua_pcall(L, lua_gettop(L) - 1, 1, 0) != LUA_OK) + lua_error(L); lua_gc(L, LUA_GCCOLLECT, 0); lua_pushcfunction(L, make_matrix); lua_insert(L, -2); @@ -170,9 +168,41 @@ matrix_from_file(lua_State *L) { return luaL_error(L, "luaL_newstate failed"); } const char * source = luaL_checkstring(L, 1); + int top = lua_gettop(L); lua_pushcfunction(mL, load_matrixfile); lua_pushlightuserdata(mL, (void *)source); - int ok = lua_pcall(mL, 1, 1, 0); + if (top > 1) { + if (!lua_checkstack(mL, top + 1)) { + return luaL_error(L, "Too many argument %d", top); + } + int i; + for (i=2;i<=top;i++) { + switch(lua_type(L, i)) { + case LUA_TBOOLEAN: + lua_pushboolean(mL, lua_toboolean(L, i)); + break; + case LUA_TNUMBER: + if (lua_isinteger(L, i)) { + lua_pushinteger(mL, lua_tointeger(L, i)); + } else { + lua_pushnumber(mL, lua_tonumber(L, i)); + } + break; + case LUA_TLIGHTUSERDATA: + lua_pushlightuserdata(mL, lua_touserdata(L, i)); + break; + case LUA_TFUNCTION: + if (lua_iscfunction(L, i) && lua_getupvalue(L, i, 1) == NULL) { + lua_pushcfunction(mL, lua_tocfunction(L, i)); + break; + } + return luaL_argerror(L, i, "Only support light C function"); + default: + return luaL_argerror(L, i, "Type invalid"); + } + } + } + int ok = lua_pcall(mL, top, 1, 0); if (ok != LUA_OK) { lua_pushstring(L, lua_tostring(mL, -1)); lua_close(mL); diff --git a/lualib/skynet/sharetable.lua b/lualib/skynet/sharetable.lua index 58aa56e5..a86533bc 100644 --- a/lualib/skynet/sharetable.lua +++ b/lualib/skynet/sharetable.lua @@ -24,20 +24,36 @@ local function sharetable_service() end end - function sharetable.load(source, filename, datasource) + function sharetable.loadfile(source, filename, ...) close_matrix(files[filename]) - if datasource == nil then - skynet.error("Load file : " .. filename) - datasource = "@" .. filename - else - skynet.error("Load chunk with name : " .. filename) - end - - local m = core.matrix(datasource) + local m = core.matrix("@" .. filename, ...) files[filename] = m skynet.ret() end + function sharetable.loadstring(source, filename, datasource, ...) + close_matrix(files[filename]) + local m = core.matrix(datasource, ...) + files[filename] = m + skynet.ret() + end + + local function loadtable(filename, ptr, len) + close_matrix(files[filename]) + local m = core.matrix([[ + local unpack, ptr, len = ... + return unpack(ptr, len) + ]], skynet.unpack, ptr, len) + files[filename] = m + end + + function sharetable.loadtable(source, filename, ptr, len) + local ok, err = pcall(loadtable, filename, ptr, len) + skynet.trash(ptr, len) + assert(ok, err) + skynet.ret() + end + local function query_file(source, filename) local m = files[filename] local ptr = m:getptr() @@ -160,8 +176,17 @@ local sharetable = setmetatable ( {} , { __gc = report_close, }) -function sharetable.load(filename, source) - skynet.call(sharetable.address, "lua", "load", filename, source) +function sharetable.loadfile(filename, ...) + skynet.call(sharetable.address, "lua", "loadfile", filename, ...) +end + +function sharetable.loadstring(filename, source, ...) + skynet.call(sharetable.address, "lua", "loadstring", filename, source, ...) +end + +function sharetable.loadtable(filename, tbl) + assert(type(tbl) == "table") + skynet.call(sharetable.address, "lua", "loadtable", filename, skynet.pack(tbl)) end function sharetable.query(filename) diff --git a/test/testsharetable.lua b/test/testsharetable.lua index 61f0ee37..016a286b 100644 --- a/test/testsharetable.lua +++ b/test/testsharetable.lua @@ -2,7 +2,13 @@ local skynet = require "skynet" local sharetable = require "skynet.sharetable" skynet.start(function() - sharetable.load("test", "return { x=1,y={ 'hello world' },['hello world'] = true }") + -- You can also use sharetable.loadfile / sharetable.loadstring + sharetable.loadtable ("test", { x=1,y={ 'hello world' },['hello world'] = true }) + local t = sharetable.query("test") + for k,v in pairs(t) do + print(k,v) + end + sharetable.loadstring ("test", "return { ... }", 1,2,3) local t = sharetable.query("test") for k,v in pairs(t) do print(k,v)