handle backreferences and linked lists in puke
This commit is contained in:
parent
f67c2da37f
commit
7c29c329b7
@ -45,7 +45,9 @@ function mknew(tt, more)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
linked_list = {}
|
-- intrusive singly-linked list.
|
||||||
|
-- cannot be nested!
|
||||||
|
linked_list = {is_linked_list=true}
|
||||||
mknew(linked_list, function(x)
|
mknew(linked_list, function(x)
|
||||||
x.next=nil
|
x.next=nil
|
||||||
x.tail=x
|
x.tail=x
|
||||||
@ -288,17 +290,39 @@ function fadescreen()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function puke(item, indent)
|
-- puke emits a verbose string
|
||||||
|
-- describing item, indented to
|
||||||
|
-- the specified depth (0 by
|
||||||
|
-- default). used for table
|
||||||
|
-- debugging. table-type keys
|
||||||
|
-- are not legible here
|
||||||
|
function puke(item, indent, seen)
|
||||||
|
if (type(item) ~= "table") return tostr(item)
|
||||||
|
|
||||||
|
seen = seen or {}
|
||||||
|
if (seen[item]) return "<<PREV>>"
|
||||||
|
seen[item] = true
|
||||||
|
|
||||||
indent = indent or 0
|
indent = indent or 0
|
||||||
local pfx = ""
|
local pfx = "\n"
|
||||||
for _=1,indent do
|
for _=1,indent do
|
||||||
pfx ..= " "
|
pfx ..= " "
|
||||||
end
|
end
|
||||||
if (type(item) ~= "table") return pfx..tostr(item)
|
|
||||||
ret = pfx.."{"
|
if item.is_linked_list then
|
||||||
pfx = "\n"..pfx
|
local ret,n = "linked_list <",0
|
||||||
|
item:strip(function(x)
|
||||||
|
n += 1
|
||||||
|
local masked_x = {next="<<...>>"}
|
||||||
|
setmetatable(masked_x, {__index=x})
|
||||||
|
ret ..= pfx..tostr(n)..": "..masked_x
|
||||||
|
end)
|
||||||
|
return ret..pfx..">"
|
||||||
|
end
|
||||||
|
|
||||||
|
local ret = "{"
|
||||||
for k, v := pairs(item) do
|
for k, v := pairs(item) do
|
||||||
ret ..= pfx..tostr(k)..": "..puke(v, indent+1)
|
ret ..= pfx..tostr(k)..": "..puke(v, indent+1, seen)
|
||||||
end
|
end
|
||||||
return ret..pfx.."}"
|
return ret..pfx.."}"
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user