mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-22 02:53:09 +00:00
add sharetable.loadtable
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user