inject.lua 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. local function getupvaluetable(u, func, unique)
  2. local i = 1
  3. while true do
  4. local name, value = debug.getupvalue(func, i)
  5. if name == nil then
  6. return
  7. end
  8. local t = type(value)
  9. if t == "table" then
  10. u[name] = value
  11. elseif t == "function" then
  12. if not unique[value] then
  13. unique[value] = true
  14. getupvaluetable(u, value, unique)
  15. end
  16. end
  17. i=i+1
  18. end
  19. end
  20. return function(skynet, source, filename , ...)
  21. if filename then
  22. filename = "@" .. filename
  23. else
  24. filename = "=(load)"
  25. end
  26. local output = {}
  27. local function print(...)
  28. local value = { ... }
  29. for k,v in ipairs(value) do
  30. value[k] = tostring(v)
  31. end
  32. table.insert(output, table.concat(value, "\t"))
  33. end
  34. local u = {}
  35. local unique = {}
  36. local funcs = { ... }
  37. for k, func in ipairs(funcs) do
  38. getupvaluetable(u, func, unique)
  39. end
  40. local p = {}
  41. local proto = u.proto
  42. if proto then
  43. for k,v in pairs(proto) do
  44. local name, dispatch = v.name, v.dispatch
  45. if name and dispatch and not p[name] then
  46. local pp = {}
  47. p[name] = pp
  48. getupvaluetable(pp, dispatch, unique)
  49. end
  50. end
  51. end
  52. local env = setmetatable( { print = print , _U = u, _P = p}, { __index = _ENV })
  53. local func, err = load(source, filename, "bt", env)
  54. if not func then
  55. return false, { err }
  56. end
  57. local ok, err = skynet.pcall(func)
  58. if not ok then
  59. table.insert(output, err)
  60. return false, output
  61. end
  62. return true, output
  63. end