12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- local function getupvaluetable(u, func, unique)
- local i = 1
- while true do
- local name, value = debug.getupvalue(func, i)
- if name == nil then
- return
- end
- local t = type(value)
- if t == "table" then
- u[name] = value
- elseif t == "function" then
- if not unique[value] then
- unique[value] = true
- getupvaluetable(u, value, unique)
- end
- end
- i=i+1
- end
- end
- return function(skynet, source, filename , ...)
- if filename then
- filename = "@" .. filename
- else
- filename = "=(load)"
- end
- local output = {}
- local function print(...)
- local value = { ... }
- for k,v in ipairs(value) do
- value[k] = tostring(v)
- end
- table.insert(output, table.concat(value, "\t"))
- end
- local u = {}
- local unique = {}
- local funcs = { ... }
- for k, func in ipairs(funcs) do
- getupvaluetable(u, func, unique)
- end
- local p = {}
- local proto = u.proto
- if proto then
- for k,v in pairs(proto) do
- local name, dispatch = v.name, v.dispatch
- if name and dispatch and not p[name] then
- local pp = {}
- p[name] = pp
- getupvaluetable(pp, dispatch, unique)
- end
- end
- end
- local env = setmetatable( { print = print , _U = u, _P = p}, { __index = _ENV })
- local func, err = load(source, filename, "bt", env)
- if not func then
- return false, { err }
- end
- local ok, err = skynet.pcall(func)
- if not ok then
- table.insert(output, err)
- return false, output
- end
- return true, output
- end
|