From 5c508e45a7b7f7c717384fc4926f2475993bef41 Mon Sep 17 00:00:00 2001 From: hqwrong Date: Thu, 20 Oct 2016 09:52:52 +0800 Subject: [PATCH 1/4] pcall->xpcall --- lualib/snax/interface.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lualib/snax/interface.lua b/lualib/snax/interface.lua index 740f09d9..5efb7410 100644 --- a/lualib/snax/interface.lua +++ b/lualib/snax/interface.lua @@ -84,7 +84,7 @@ return function (name , G, loader) end setmetatable(G, { __index = env , __newindex = init_system }) - local ok, err = pcall(mainfunc) + local ok, err = xpcall(mainfunc, debug.traceback) setmetatable(G, nil) assert(ok,err) From d637d720db90f6ba869c6a1ebbbc04548087d8d9 Mon Sep 17 00:00:00 2001 From: hqwrong Date: Thu, 3 Nov 2016 14:55:42 +0800 Subject: [PATCH 2/4] snax loader --- lualib/snax/interface.lua | 43 ++++++++++++++++++--------------------- service/snaxd.lua | 4 +++- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/lualib/snax/interface.lua b/lualib/snax/interface.lua index 5efb7410..e8c8d596 100644 --- a/lualib/snax/interface.lua +++ b/lualib/snax/interface.lua @@ -1,8 +1,24 @@ local skynet = require "skynet" +local function dft_loader(path, name, G) + local errlist = {} + + for pat in string.gmatch(path,"[^;]+") do + local filename = string.gsub(pat, "?", name) + local f , err = loadfile(filename, "bt", G) + if f then + return f, pat + else + table.insert(errlist, err) + end + end + + error(table.concat(errlist, "\n")) +end + return function (name , G, loader) - loader = loader or loadfile - local mainfunc + loader = loader or dft_loader + local mainfunc local function func_id(id, group) local tmp = {} @@ -61,27 +77,8 @@ return function (name , G, loader) local pattern - do - local path = assert(skynet.getenv "snax" , "please set snax in config file") - - local errlist = {} - - for pat in string.gmatch(path,"[^;]+") do - local filename = string.gsub(pat, "?", name) - local f , err = loader(filename, "bt", G) - if f then - pattern = pat - mainfunc = f - break - else - table.insert(errlist, err) - end - end - - if mainfunc == nil then - error(table.concat(errlist, "\n")) - end - end + local path = assert(skynet.getenv "snax" , "please set snax in config file") + mainfunc, pattern = loader(path, name, G) setmetatable(G, { __index = env , __newindex = init_system }) local ok, err = xpcall(mainfunc, debug.traceback) diff --git a/service/snaxd.lua b/service/snaxd.lua index 1b8ddee6..5aaa3353 100644 --- a/service/snaxd.lua +++ b/service/snaxd.lua @@ -5,7 +5,9 @@ local profile = require "profile" local snax = require "snax" local snax_name = tostring(...) -local func, pattern = snax_interface(snax_name, _ENV) +local loaderpath = skynet.getenv"snax_loader" +local loader = loaderpath and assert(dofile(loaderpath)) or require"snax.loader" +local func, pattern = snax_interface(snax_name, _ENV, loader) local snax_path = pattern:sub(1,pattern:find("?", 1, true)-1) .. snax_name .. "/" package.path = snax_path .. "?.lua;" .. package.path From 6fd1072fde3f739d1d0a402b093857f1b325c12d Mon Sep 17 00:00:00 2001 From: hqwrong Date: Fri, 30 Dec 2016 15:23:40 +0800 Subject: [PATCH 3/4] fix snax hotfix --- lualib/snax/hotfix.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lualib/snax/hotfix.lua b/lualib/snax/hotfix.lua index f56a5072..3262dafd 100644 --- a/lualib/snax/hotfix.lua +++ b/lualib/snax/hotfix.lua @@ -53,8 +53,8 @@ local function collect_all_uv(funcs) end local function loader(source) - return function (filename, ...) - return load(source, "=patch", ...) + return function (path, name, G) + return load(source, "=patch", "bt", G) end end From f25e396181d06e1b2eea006abaed11db8d49cf5a Mon Sep 17 00:00:00 2001 From: hqwrong Date: Wed, 8 Feb 2017 17:50:31 +0800 Subject: [PATCH 4/4] 1. snax hotfix recursively patch func 2. load hotfix source with _ENV instead of empty table --- lualib/snax/hotfix.lua | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/lualib/snax/hotfix.lua b/lualib/snax/hotfix.lua index 3262dafd..a73d680e 100644 --- a/lualib/snax/hotfix.lua +++ b/lualib/snax/hotfix.lua @@ -68,10 +68,10 @@ local function find_func(funcs, group , name) end local dummy_env = {} +for k,v in pairs(_ENV) do dummy_env[k] = v end -local function patch_func(funcs, global, group, name, f) - local desc = assert(find_func(funcs, group, name) , string.format("Patch mismatch %s.%s", group, name)) - local i = 1 +local function _patch(global, f) + local i = 1 while true do local name, value = debug.getupvalue(f, i) if name == nil then @@ -81,9 +81,18 @@ local function patch_func(funcs, global, group, name, f) if old_uv then debug.upvaluejoin(f, i, old_uv.func, old_uv.index) end + else + if type(value) == "function" then + _patch(global, value) + end end i = i + 1 end +end + +local function patch_func(funcs, global, group, name, f) + local desc = assert(find_func(funcs, group, name) , string.format("Patch mismatch %s.%s", group, name)) + _patch(global, f) desc[4] = f end