5 luatexja.debug = ltjdbg
6 local table, string = table, string
8 -------------------- pretty-print
10 local function get_serialize_param()
11 return table.serialize_functions,
12 table.serialize_compact,
13 table.serialize_inline
15 local function set_serialize_param(s_f, s_c, s_i)
16 table.serialize_functions = s_f
17 table.serialize_compact = s_c
18 table.serialize_inline = s_i
21 local function normal_serialize(t)
22 local s_f, s_c, s_i = get_serialize_param()
23 set_serialize_param(true, true, true)
24 local ret = table.serialize(t, false, false, true)
25 set_serialize_param(s_f, s_c, s_i)
29 local function table_tosource(t)
30 if not next(t) then return "{}" end
31 local res_n = "\127"..normal_serialize({t}).."\127"
32 local s, e, cap = res_n:find("\127{\n ({ .* }),\n}\127")
33 if s == 1 and e == res_n:len() then return cap
34 else return normal_serialize(t)
37 ltjdbg.table_tosource = table_tosource
39 local function function_tosource(f)
40 local res = normal_serialize({f})
41 return res:sub(4, res:len() - 3)
43 ltjdbg.function_tosource = function_tosource
45 --! 値 v をそれを表すソース文字列に変換する.
46 --! lualibs の table.serialize() の処理を利用している.
47 local function tosource(v)
49 if tv == "function" then return function_tosource(v)
50 elseif tv == "table" then return table_tosource(v)
51 elseif tv == "string" then return string.format('%q', v)
52 else return tostring(v)
55 ltjdbg.tosource = tosource
57 local function coerce(f, v)
58 if f == "q" then return "s", tosource(v)
59 elseif f == "s" then return f, tostring(v)
60 else return f, tonumber(v) or 0
64 local function do_pformat(fmt, ...)
65 fmt = fmt:gsub("``", "\127"):gsub("`", "%%"):gsub("\127", "`")
66 local i, na, a = 0, {}, {...}
67 local function proc(p, f)
68 i = i + 1; f, na[i] = coerce(f, a[i])
71 fmt = fmt:gsub("(%%[-+#]?[%d%.]*)([a-zA-Z])", proc)
72 return fmt:format(unpack(na))
75 --! string.format() の拡張版. 以下の点が異なる.
76 --! - %q は全ての型について tosource() に変換
77 --! - <%> の代わりに <`> も使える (TeX での使用のため)
78 --! - %d, %s 等でキャストを行う
79 local function pformat(fmt, ...)
80 if type(fmt) == "string" then
81 return do_pformat(fmt, ...)
86 ltjdbg.pformat = pformat
88 -------------------- 所要時間合計
91 local gettime = socket.gettime
93 local function start_time_measure(n)
94 if not time_stat[n] then
95 time_stat[n] = {1, -gettime()}
97 local t = time_stat[n]
98 t[1], t[2] = t[1]+1, t[2]-gettime()
101 local function stop_time_measure(n)
102 local t = time_stat[n]
103 t[2] = t[2] + gettime()
106 local function print_measure()
108 for i,v in pairs(time_stat) do
109 temp[#temp+1] = { i, v[1], v[2], v[2]/v[1] }
111 table.sort(temp, function (a,b) return (a[4]>b[4]) end)
113 print('desc', 'ave. (us)', 'times', 'total (ms)')
114 for _,v in ipairs(temp) do
115 print ((v[1] .. ' '):sub(1,16), 1000000*v[4], v[2], 1000*v[3])
118 if luatexja.base then
119 luatexja.base.start_time_measure = start_time_measure
120 luatexja.base.stop_time_measure = stop_time_measure
121 luatexbase.add_to_callback('stop_run', print_measure, 'luatexja.time_measure', 1)
122 luatexbase.add_to_callback('pre_linebreak_filter',
124 start_time_measure('tex_linebreak'); return p
126 'measure_tex_linebreak', 20000)
130 -------------------- debug logging
132 local debug_show_term = true
133 local debug_show_log = true
135 local function show_term(v)
138 ltjdbg.show_term = show_term
139 --! デバッグログをログファイルに出力するか
143 ltjdbg.show_log = show_log
145 local function write_debug_log(s)
147 if debug_show_term and debug_show_log then
148 texio.write_nl("term and log", s)
149 elseif debug_show_term and not debug_show_log then
150 texio.write_nl("term", s)
151 elseif not debug_show_term and debug_show_log then
152 texio.write_nl("log", s)
156 --! デバッグログ出力. 引数は pformat() と同じ.
157 local function out_debug(...)
158 if debug_show_term or debug_show_log then
159 write_debug_log("%DEBUG:"..pformat(...))
163 --! デバッグログ出力, パッケージ名付き.
164 local function package_debug(pkg, ...)
165 if debug_show_term or debug_show_log then
166 write_debug_log("%DEBUG("..pkg.."):"..pformat(...))
170 --! パッケージ名付きデバッグログ出力器を得る.
171 local function debug_logger(pkg)
172 return function(...) package_debug(pkg, ...) end
175 if luatexja.base then
176 luatexja.base.out_debug = out_debug
177 luatexja.base.package_debug = package_debug
178 luatexja.base.debug_logger = debug_logger
179 luatexja.base.show_term = show_term
180 luatexja.base.show_log = show_log
184 -------------------- all done