summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/base/luat-tra.lua
blob: 7fc97319563c87d2390a8a532ea595ff6acf0122 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
-- filename : luat-tra.lua
-- comment  : companion to luat-lib.tex
-- author   : Hans Hagen, PRAGMA-ADE, Hasselt NL
-- copyright: PRAGMA ADE / ConTeXt Development Team
-- license  : see context related readme files

if not versions then versions = { } end versions['luat-tra'] = 1.001

debugger = { }

do

    local counters = { }
    local names    = { }
    local getinfo  = debug.getinfo

    local function hook()
        local f = getinfo(2,"f").func
        if f then
            if counters[f] == nil then
                counters[f] = 1
--~                 names[f] = debug.getinfo(2,"Sn")
                names[f] = debug.getinfo(2,"n")
--~                 names[f] = debug.getinfo(f)
            else
                counters[f] = counters[f] + 1
            end
        end
    end

    local function getname(func)
        local n = names[func]
        if n then
            if n.what == "C" then
                return n.name or '<luacall>'
            else
                -- source short_src linedefined what name namewhat nups func
                local name = n.name or n.namewhat or n.what
                if not name or name == "" then name = "?" end
                return string.format("%s : %s : %s", n.short_src or "unknown source", n.linedefined or "--", name)
            end
        else
            return "unknown"
        end
    end

    function debugger.showstats(printer,threshold)
        printer   = printer   or texio.write or print
        threshold = threshold or 0
        local total, grandtotal, functions = 0, 0, 0
        printer("\n") -- ugly but ok
        for func, count in pairs(counters) do
            if count > threshold then
                local name = getname(func)
                if name ~= "(for generator)" then
                    printer(string.format("%8i  %s\n", count, getname(func)))
                    total = total + count
                end
            end
            grandtotal = grandtotal + count
            functions = functions + 1
        end
        printer(string.format("functions: %s, total: %s, grand total: %s, threshold: %s\n", functions, total, grandtotal, threshold))
    end

    function debugger.savestats(filename,threshold)
        local f = io.open(filename,'w')
        if f then
            debugger.showstats(function(str) f:write(str) end,threshold)
            f:close()
        end
    end

    function debugger.enable()
        debug.sethook(hook,"c")
    end

    function debugger.disable()
        debug.sethook()
    --~ counters[debug.getinfo(2,"f").func] = nil
    end

    function debugger.tracing()
        local n = tonumber(os.env['MTX.TRACE.CALLS']) or tonumber(os.env['MTX_TRACE_CALLS']) or 0
        if n > 0 then
            function debugger.tracing() return true  end ; return true
        else
            function debugger.tracing() return false end ; return false
        end
    end

end

--~ debugger.enable()

--~ print(math.sin(1*.5))
--~ print(math.sin(1*.5))
--~ print(math.sin(1*.5))
--~ print(math.sin(1*.5))
--~ print(math.sin(1*.5))

--~ debugger.disable()

--~ print("")
--~ debugger.showstats()
--~ print("")
--~ debugger.showstats(print,3)