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: