add sharetable.loadtable

This commit is contained in:
Cloud Wu
2019-04-23 19:58:42 +08:00
committed by 云风
parent e3c5d63a97
commit 68e94b2792
3 changed files with 81 additions and 20 deletions

View File

@@ -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);

View File

@@ -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)

View File

@@ -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)