|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file:
-- http://anggtwu.net/LUA/PrintFunction1.lua.html
-- http://anggtwu.net/LUA/PrintFunction1.lua
-- (find-angg "LUA/PrintFunction1.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- This file defines the class PrintFunction, that prints functions
-- and stack frames either in a very compact format that looks like
-- this (that I took from a pretraceback),
--
-- [ C ] C function (unknown name)
-- [Lua] stdin line 1
-- (find-luatb "~/LUA/lua50init.lua 2325 2329 global run_repl3_now")
-- (find-luatb "~/LUA/Repl3.lua 146 148 method repl")
--
-- or, with the method :v(), in a low-level "vertical" format that
-- looks like this:
--
-- { "currentline"=2329,
-- "func"=<function: 0x560195e1d770>,
-- "lastlinedefined"=2330,
-- "linedefined"=2325,
-- "name"="run_repl3_now",
-- "namewhat"="global",
-- "nups"=0,
-- "short_src"="/home/edrx/LUA/lua50init.lua",
-- "source"="@/home/edrx/LUA/lua50init.lua",
-- "what"="Lua"
-- }
--
-- debug.getinfo only fills the fields "name" and "namewhat" for stack
-- frames, so
--
-- PrintFunction.from(run_repl3_now)
--
-- returns just:
--
-- (find-luatb "~/LUA/lua50init.lua 2325 2330")
--
-- instead of:
--
-- (find-luatb "~/LUA/lua50init.lua 2325 2329 global run_repl3_now")
--
-- PrintFunction was inspired by the traceback in Prosody,
--
-- http://angg.twu.net/LUA/Prosody1.lua.html
-- (find-angg "LUA/Prosody1.lua")
--
-- but I changed the output format completely.
--
-- Based on/supersedes:
-- (find-angg "LUA/DGetInfo1.lua" "DGetInfo")
-- See:
-- (find-angg "LUA/PreTraceback1.lua")
-- (find-TH "Repl3" "PrintFunction1.lua")
-- (find-lua51manual "#pdf-debug.getinfo")
-- (find-lua51manual "#pdf-debug.getlocal")
--
-- (defun e () (interactive) (find-angg "LUA/PrintFunction1.lua"))
-- «.PrintFunction» (to "PrintFunction")
-- «.PrintFunction-tests» (to "PrintFunction-tests")
-- ____ _ _ _____ _ _
-- | _ \ _ __(_)_ __ | |_| ___| _ _ __ ___| |_(_) ___ _ __
-- | |_) | '__| | '_ \| __| |_ | | | | '_ \ / __| __| |/ _ \| '_ \
-- | __/| | | | | | | |_| _|| |_| | | | | (__| |_| | (_) | | | |
-- |_| |_| |_|_| |_|\__|_| \__,_|_| |_|\___|\__|_|\___/|_| |_|
--
-- Also here: (find-angg "LUA/lua50init.lua" "PrintFunction")
-- «PrintFunction» (to ".PrintFunction")
PrintFunction = Class {
type = "PrintFunction",
from = function (f) return PrintFunction(debug.getinfo(f, "nSluf")) end,
fromts = function (o) return PrintFunction.from(getmetatable(o).__tostring) end,
tostring = function (f) return tostring(PrintFunction.from(f)) end,
__tostring = function (pf) return pf:tostring() end,
__index = {
v = function (pf) return VTable(copy(pf)) end,
tostring = function (pf) return pf:_any() end,
_shortsrc0 = function (pf) return ee_shorten(pf.short_src) end,
_shortsrc0 = function (pf) return ee_shorten(pf.source:sub(2)) end,
_shortsrc = function (pf) return pf.short_src and pf:_shortsrc0() end,
_name0 = function (pf) return pf.name and format("%q", pf.name) end,
_name = function (pf) return pf:_name0() or "(unknown name)" end,
_linedef = function (pf) return pf.linedefined end,
_linelast = function (pf) return pf.lastlinedefined end,
_linecurr0 = function (pf) return pf.currentline end,
_linecurr = function (pf) return pf:_linecurr0()~=-1 and pf:_linecurr0() end,
_line1 = function (pf) return pf:_linedef() end,
_line2 = function (pf) return pf:_linecurr() or pf:_linelast() end,
_tailcall0 = function (pf) return "[Lua] tail call" end,
_main0 = function (pf) return "[Lua] "..pf:_shortsrc()
.." line "..pf:_linecurr() end,
_C0 = function (pf) return "[ C ] "..pf.namewhat
.." C function "..pf:_name() end,
_tbbody0 = function (pf) return (pf:_shortsrc() or "")
.." "..(pf:_line1() or "")
.." "..(pf:_line2() or "")
.." "..(pf.namewhat or "")
.." "..(pf.name or "") end,
_tbbody = function (pf) return rtrim(pf:_tbbody0()) end,
_findluatb = function (pf) return format('(find-luatb \"%s\")', pf:_tbbody()) end,
_any = function (pf)
if pf.short_src == "[C]" then return pf:_C0() end
if pf.what == "main" then return pf:_main0() end
if pf.short_src == "(tail call)" then return pf:_tailcall0() end
return pf:_findluatb()
end,
},
}
-- «PrintFunction-tests» (to ".PrintFunction-tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "PrintFunction1.lua"
= VTable(debug.getinfo(split, "nSluf"))
= VTable(debug.getinfo(print, "nSluf"))
pf = PrintFunction.from(split)
pf = PrintFunction.from(print)
pf = PrintFunction.from(PrintFunction.__index.v)
= pf:v()
= PrintFunction.from(split)
= PrintFunction.from(print)
= PrintFunction.from(PrintFunction.__index.v)
= PrintFunction.fromts(VList {})
= DGetInfo.fromfunction(split)
DGetInfo.__index.method = "printfunction"
DGetInfo.__index.printfunction = function (dgi)
return ":: "..PrintFunction(copy(dgi)):tostring()
end
run_repl2_now()
-- (find-angg "LUA/DGetInfo1.lua" "DGetInfos-tests")
--]]
-- (find-angg "LUA/DGetInfo1.lua" "DGetInfos")
-- Local Variables:
-- coding: utf-8-unix
-- End: