From b454395a8da4013aff2ecd64cd7eafc01fc6a5a2 Mon Sep 17 00:00:00 2001 From: Steven Barth Date: Sun, 1 Jun 2008 12:12:18 +0000 Subject: * Performance optimizations * libs/core: Added bytecode stripping function to luci.util * libs/core: Added smart indexcache that automatically updates cached index-files on change * libs/web: Enabled template caching support * Core Translation part 4 --- libs/core/luasrc/fs.lua | 1 + libs/core/luasrc/util.lua | 72 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) (limited to 'libs/core') diff --git a/libs/core/luasrc/fs.lua b/libs/core/luasrc/fs.lua index 5c1f2a051..35b8289af 100644 --- a/libs/core/luasrc/fs.lua +++ b/libs/core/luasrc/fs.lua @@ -27,6 +27,7 @@ limitations under the License. module("luci.fs", package.seeall) require("posix") +posix.umask("rwx------") -- Glob glob = posix.glob diff --git a/libs/core/luasrc/util.lua b/libs/core/luasrc/util.lua index 0559fff6f..0a30b163a 100644 --- a/libs/core/luasrc/util.lua +++ b/libs/core/luasrc/util.lua @@ -96,6 +96,13 @@ function contains(table, value) end +-- Dumps and strips a Lua-Function +function dump(f) + local d = string.dump(f) + return d and strip_bytecode(d) +end + + -- Dumps a table to stdout (useful for testing and debugging) function dumptable(t, i) i = i or 0 @@ -181,12 +188,77 @@ function split(str, pat, max, regex) return t end + +-- Bytecode stripping function by Peter Cawley from http://lua-users.org/lists/lua-l/2008-02/msg01158.html +function strip_bytecode(dump) + local version, format, endian, int, size, ins, num = dump:byte(5, 11) + local subint + if endian == 1 then + subint = function(dump, i, l) + local val = 0 + for n = l, 1, -1 do + val = val * 256 + dump:byte(i + n - 1) + end + return val, i + l + end + else + subint = function(dump, i, l) + local val = 0 + for n = 1, l, 1 do + val = val * 256 + dump:byte(i + n - 1) + end + return val, i + l + end + end + + local strip_function + strip_function = function(dump) + local count, offset = subint(dump, 1, size) + local stripped, dirty = string.rep("\0", size), offset + count + offset = offset + count + int * 2 + 4 + offset = offset + int + subint(dump, offset, int) * ins + count, offset = subint(dump, offset, int) + for n = 1, count do + local t + t, offset = subint(dump, offset, 1) + if t == 1 then + offset = offset + 1 + elseif t == 4 then + offset = offset + size + subint(dump, offset, size) + elseif t == 3 then + offset = offset + num + end + end + count, offset = subint(dump, offset, int) + stripped = stripped .. dump:sub(dirty, offset - 1) + for n = 1, count do + local proto, off = strip_function(dump:sub(offset, -1)) + stripped, offset = stripped .. proto, offset + off - 1 + end + offset = offset + subint(dump, offset, int) * int + int + count, offset = subint(dump, offset, int) + for n = 1, count do + offset = offset + subint(dump, offset, size) + size + int * 2 + end + count, offset = subint(dump, offset, int) + for n = 1, count do + offset = offset + subint(dump, offset, size) + size + end + stripped = stripped .. string.rep("\0", int * 3) + return stripped, offset + end + + return dump:sub(1,12) .. strip_function(dump:sub(13,-1)) +end + + -- Removes whitespace from beginning and end of a string function trim(str) local s = str:gsub("^%s*(.-)%s*$", "%1") return s end + -- Updates given table with new values function update(t, updates) for k, v in pairs(updates) do -- cgit v1.2.3