Advertisement
airevent

lua trace

Dec 2nd, 2011
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.00 KB | None | 0 0
  1. -- экранировать символы, которые могут привести к ошибке синтаксиса
  2. function string:escape()
  3.     return (self:gsub("\\", "\\\\"):gsub("\"", "\\\""):
  4.         gsub("\r", "\\r"):gsub("\n", "\\n"):gsub("\t", "\\t"):
  5.         gsub("%c", function(s) return "\\" .. s:byte() end))
  6. end
  7.  
  8. -- развернуть переменную
  9. -- [*] - уже выводили, [@] - не вывели т.к. skipt
  10. -- nil, boolean, number, string, function, userdata, thread, table
  11. local function _trace( essence, lib, reclvl, skipt )
  12.     local t = type(essence)
  13.    
  14.     if t == "string" then -- mt строки не нужна
  15.         essence = essence:escape()
  16.         io.write('"' .. essence .. '"')
  17.     else
  18.         local mt = getmetatable(essence)
  19.        
  20.         if mt and mt.class then
  21.             io.write("class: ", mt.class)
  22.         else
  23.             io.write(tostring(essence))
  24.         end
  25.        
  26.         local extra_mt = false -- вывести метатаблицу, если true
  27.  
  28.         if t == "table" then
  29.             if lib[essence] then -- уже выводили
  30.                 io.write(" [*t]")
  31.             elseif skipt then -- не разворачивать
  32.                 io.write(" [@t]")
  33.             else
  34.                 lib[essence] = true
  35.                 extra_mt = true -- уже добавили в lib, но метатаблицу ещё не вывели, оповестить mt
  36.                 for k,v in pairs(essence) do
  37.                     io.write("\n")
  38.                     io.write(string.rep("\t", reclvl))
  39.                     _trace(k, lib, reclvl+1, true)
  40.                     io.write(" => ")
  41.                     _trace(v, lib, reclvl+1)
  42.                 end
  43.             end
  44.         end
  45.        
  46.         if mt then
  47.             if lib[essence] and not extra_mt then
  48.                 io.write(" [*mt]")
  49.             elseif skipt then
  50.                 io.write(" [@mt]")
  51.             else
  52.                 lib[essence] = true
  53.                 io.write("\n")
  54.                 io.write(string.rep("\t", reclvl))
  55.                 io.write("*mt* => ")
  56.                 _trace(mt, lib, reclvl+1)
  57.             end
  58.         end
  59.     end
  60. end
  61.  
  62. function trace( ... )
  63.     local n = select("#", ...) -- сколько аргументов
  64.     local lib = {}
  65.    
  66.     for i=1,n do
  67.         local essence = (select(i, ...))
  68.         _trace(essence, lib, 1)
  69.         io.write("\n")
  70.     end
  71. end
  72.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement