diff options
Diffstat (limited to 'tex/context/base/luat-sto.lua')
-rw-r--r-- | tex/context/base/luat-sto.lua | 338 |
1 files changed, 169 insertions, 169 deletions
diff --git a/tex/context/base/luat-sto.lua b/tex/context/base/luat-sto.lua index 7a11b7f5e..da2467708 100644 --- a/tex/context/base/luat-sto.lua +++ b/tex/context/base/luat-sto.lua @@ -1,169 +1,169 @@ -if not modules then modules = { } end modules ['luat-sto'] = { - version = 1.001, - comment = "companion to luat-lib.mkiv", - author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", - copyright = "PRAGMA ADE / ConTeXt Development Team", - license = "see context related readme files" -} - --- we could nil some function in the productionrun - -local type, next, setmetatable, getmetatable, collectgarbage = type, next, setmetatable, getmetatable, collectgarbage -local gmatch, format = string.gmatch, string.format -local serialize, concat, sortedhash = table.serialize, table.concat, table.sortedhash -local bytecode = lua.bytecode -local strippedloadstring = utilities.lua.strippedloadstring - -local trace_storage = false -local report_storage = logs.reporter("system","storage") - -storage = storage or { } -local storage = storage - -local data = { } -storage.data = data - -storage.min = 0 -- 500 -storage.max = storage.min - 1 -storage.noftables = storage.noftables or 0 -storage.nofmodules = storage.nofmodules or 0 - -storage.mark = utilities.storage.mark -storage.allocate = utilities.storage.allocate -storage.marked = utilities.storage.marked -storage.strip = false - -directives.register("system.compile.strip", function(v) storage.strip = v end) - -function storage.register(...) - local t = { ... } - local d = t[2] - if d then - storage.mark(d) - else - report_storage("fatal error: invalid storage %a",t[1]) - os.exit() - end - data[#data+1] = t - return t -end - -local n = 0 -local function dump() - local max = storage.max - for i=1,#data do - local d = data[i] - local message, original, target = d[1], d[2] ,d[3] - local c, code, name = 0, { }, nil - -- we have a nice definer for this - for str in gmatch(target,"([^%.]+)") do - if name then - name = name .. "." .. str - else - name = str - end - c = c + 1 ; code[c] = format("%s = %s or { }",name,name) - end - max = max + 1 - if trace_storage then - c = c + 1 ; code[c] = format("print('restoring %s from slot %s')",message,max) - end - c = c + 1 ; code[c] = serialize(original,name) - if trace_storage then - report_storage('saving %a in slot %a, size %s',message,max,#code[c]) - end - -- we don't need tracing in such tables - bytecode[max] = strippedloadstring(concat(code,"\n"),storage.strip,format("slot %s (%s)",max,name)) - collectgarbage("step") - end - storage.max = max -end - -lua.registerfinalizer(dump,"dump storage") - --- to be tested with otf caching: - -function lua.collectgarbage(threshold) - local current = collectgarbage("count") - local threshold = threshold or 256 * 1024 - while true do - collectgarbage("collect") - local previous = collectgarbage("count") - if current - previous < threshold then - break - else - current = previous - end - end -end - --- -- we also need to count at generation time (nicer for message) --- --- if lua.bytecode then -- from 0 upwards --- local i, b = storage.min, lua.bytecode --- while b[i] do --- storage.noftables = i --- b[i]() --- b[i] = nil --- i = i + 1 --- end --- end - -statistics.register("stored bytecode data", function() - local nofmodules = (storage.nofmodules > 0 and storage.nofmodules) or (status.luabytecodes - lua.firstbytecode - 1) - local nofdumps = (storage.noftables > 0 and storage.noftables ) or storage.max-storage.min + 1 - local tofmodules = storage.tofmodules or 0 - local tofdumps = storage.toftables or 0 - if environment.initex then - local luautilities = utilities.lua - local nofstrippedbytes = luautilities.nofstrippedbytes - local nofstrippedchunks = luautilities.nofstrippedchunks - if nofstrippedbytes > 0 then - return format("%s modules, %s tables, %s chunks, %s chunks stripped (%s bytes)", - nofmodules, - nofdumps, - nofmodules + nofdumps, - nofstrippedchunks, - nofstrippedbytes - ) - elseif nofstrippedchunks > 0 then - return format("%s modules, %s tables, %s chunks, %s chunks stripped", - nofmodules, - nofdumps, - nofmodules + nofdumps, - nofstrippedchunks - ) - else - return format("%s modules, %s tables, %s chunks", - nofmodules, - nofdumps, - nofmodules + nofdumps - ) - end - else - return format("%s modules (%0.3f sec), %s tables (%0.3f sec), %s chunks (%0.3f sec)", - nofmodules, tofmodules, - nofdumps, tofdumps, - nofmodules + nofdumps, tofmodules + tofdumps - ) - end -end) - -if lua.bytedata then - storage.register("lua/bytedata",lua.bytedata,"lua.bytedata") -end - --- Because the storage mechanism assumes tables, we define a table for storing --- (non table) values. - -storage.shared = storage.shared or { } - -storage.register("storage/shared", storage.shared, "storage.shared") - -local mark = storage.mark - -if string.patterns then mark(string.patterns) end -if lpeg.patterns then mark(lpeg.patterns) end -if os.env then mark(os.env) end -if number.dimenfactors then mark(number.dimenfactors) end -if libraries then for k,v in next, libraries do mark(v) end end +if not modules then modules = { } end modules ['luat-sto'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- we could nil some function in the productionrun
+
+local type, next, setmetatable, getmetatable, collectgarbage = type, next, setmetatable, getmetatable, collectgarbage
+local gmatch, format = string.gmatch, string.format
+local serialize, concat, sortedhash = table.serialize, table.concat, table.sortedhash
+local bytecode = lua.bytecode
+local strippedloadstring = utilities.lua.strippedloadstring
+
+local trace_storage = false
+local report_storage = logs.reporter("system","storage")
+
+storage = storage or { }
+local storage = storage
+
+local data = { }
+storage.data = data
+
+storage.min = 0 -- 500
+storage.max = storage.min - 1
+storage.noftables = storage.noftables or 0
+storage.nofmodules = storage.nofmodules or 0
+
+storage.mark = utilities.storage.mark
+storage.allocate = utilities.storage.allocate
+storage.marked = utilities.storage.marked
+storage.strip = false
+
+directives.register("system.compile.strip", function(v) storage.strip = v end)
+
+function storage.register(...)
+ local t = { ... }
+ local d = t[2]
+ if d then
+ storage.mark(d)
+ else
+ report_storage("fatal error: invalid storage %a",t[1])
+ os.exit()
+ end
+ data[#data+1] = t
+ return t
+end
+
+local n = 0
+local function dump()
+ local max = storage.max
+ for i=1,#data do
+ local d = data[i]
+ local message, original, target = d[1], d[2] ,d[3]
+ local c, code, name = 0, { }, nil
+ -- we have a nice definer for this
+ for str in gmatch(target,"([^%.]+)") do
+ if name then
+ name = name .. "." .. str
+ else
+ name = str
+ end
+ c = c + 1 ; code[c] = format("%s = %s or { }",name,name)
+ end
+ max = max + 1
+ if trace_storage then
+ c = c + 1 ; code[c] = format("print('restoring %s from slot %s')",message,max)
+ end
+ c = c + 1 ; code[c] = serialize(original,name)
+ if trace_storage then
+ report_storage('saving %a in slot %a, size %s',message,max,#code[c])
+ end
+ -- we don't need tracing in such tables
+ bytecode[max] = strippedloadstring(concat(code,"\n"),storage.strip,format("slot %s (%s)",max,name))
+ collectgarbage("step")
+ end
+ storage.max = max
+end
+
+lua.registerfinalizer(dump,"dump storage")
+
+-- to be tested with otf caching:
+
+function lua.collectgarbage(threshold)
+ local current = collectgarbage("count")
+ local threshold = threshold or 256 * 1024
+ while true do
+ collectgarbage("collect")
+ local previous = collectgarbage("count")
+ if current - previous < threshold then
+ break
+ else
+ current = previous
+ end
+ end
+end
+
+-- -- we also need to count at generation time (nicer for message)
+--
+-- if lua.bytecode then -- from 0 upwards
+-- local i, b = storage.min, lua.bytecode
+-- while b[i] do
+-- storage.noftables = i
+-- b[i]()
+-- b[i] = nil
+-- i = i + 1
+-- end
+-- end
+
+statistics.register("stored bytecode data", function()
+ local nofmodules = (storage.nofmodules > 0 and storage.nofmodules) or (status.luabytecodes - lua.firstbytecode - 1)
+ local nofdumps = (storage.noftables > 0 and storage.noftables ) or storage.max-storage.min + 1
+ local tofmodules = storage.tofmodules or 0
+ local tofdumps = storage.toftables or 0
+ if environment.initex then
+ local luautilities = utilities.lua
+ local nofstrippedbytes = luautilities.nofstrippedbytes
+ local nofstrippedchunks = luautilities.nofstrippedchunks
+ if nofstrippedbytes > 0 then
+ return format("%s modules, %s tables, %s chunks, %s chunks stripped (%s bytes)",
+ nofmodules,
+ nofdumps,
+ nofmodules + nofdumps,
+ nofstrippedchunks,
+ nofstrippedbytes
+ )
+ elseif nofstrippedchunks > 0 then
+ return format("%s modules, %s tables, %s chunks, %s chunks stripped",
+ nofmodules,
+ nofdumps,
+ nofmodules + nofdumps,
+ nofstrippedchunks
+ )
+ else
+ return format("%s modules, %s tables, %s chunks",
+ nofmodules,
+ nofdumps,
+ nofmodules + nofdumps
+ )
+ end
+ else
+ return format("%s modules (%0.3f sec), %s tables (%0.3f sec), %s chunks (%0.3f sec)",
+ nofmodules, tofmodules,
+ nofdumps, tofdumps,
+ nofmodules + nofdumps, tofmodules + tofdumps
+ )
+ end
+end)
+
+if lua.bytedata then
+ storage.register("lua/bytedata",lua.bytedata,"lua.bytedata")
+end
+
+-- Because the storage mechanism assumes tables, we define a table for storing
+-- (non table) values.
+
+storage.shared = storage.shared or { }
+
+storage.register("storage/shared", storage.shared, "storage.shared")
+
+local mark = storage.mark
+
+if string.patterns then mark(string.patterns) end
+if lpeg.patterns then mark(lpeg.patterns) end
+if os.env then mark(os.env) end
+if number.dimenfactors then mark(number.dimenfactors) end
+if libraries then for k,v in next, libraries do mark(v) end end
|