From a491594775cb32773798a4acb5e278e0765a498e Mon Sep 17 00:00:00 2001 From: chrox Date: Fri, 3 Oct 2014 16:07:38 +0800 Subject: [PATCH] trace package loading process in koreader --- utils/trace_require.lua | 47 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 utils/trace_require.lua diff --git a/utils/trace_require.lua b/utils/trace_require.lua new file mode 100644 index 000000000..a5e00668d --- /dev/null +++ b/utils/trace_require.lua @@ -0,0 +1,47 @@ +-- trace package loading flow with require call +-- usage: ./luajit -lutils/trace_require reader.lua ../../test + +local math = require("math") +local _require = require + +local loaded_modules = {} +local highlight = "*" +-- timing threshold for highlight annotation +local threshold = 0.001 +-- whether to trace loaded packages +local trace_loaded = false +local indent = string.rep(" ", 4) + +local level = 0 +function require(module) + level = level + 1 + local x = os.clock() + local info = debug.getinfo(2) + -- this is a protected call of require + if info.short_src == "[C]" then + info = debug.getinfo(3) + end + local loaded = loaded_modules[module] + if not loaded then + print(string.format("%s%s:%s => %s", + indent:rep(level), info.short_src, info.currentline, module)) + elseif trace_loaded then + print(string.format("%s%s:%s -> %s", + indent:rep(level), info.short_src, info.currentline, module)) + end + -- protect require call in case we cannot raise call level when errors happen + local ok, loaded_module = pcall(_require, module) + if not ok then + level = level - 1 + error(loaded_module) + end + local elapse = os.clock() - x + local annot = highlight:rep(math.ceil(math.log10(elapse/threshold))) or "" + if not loaded then + print(string.format("%s%s loading time: %.3f", + annot .. indent:rep(level):sub(#annot + 1), module, elapse)) + end + loaded_modules[module] = true + level = level - 1 + return loaded_module +end