A quick port of my pico-8 variable inspector, I find useful for debugging.
It has a few more colours for readability, and can display userdata.
To use, hit Esc to break out of your program and enter:
dbg(v) |
Where v is the value to inspect.
You can drill into values by clicking the "+" (or collapse them again by clicking "-").
Mouse wheel to scroll up and down.
Press Esc when done.
-- debug inspector
-- lines to display and scroll offset
local dbg_lines,dbg_s={},0,false
-- add item to display
function dadd(n,v,i,p)
-- insertion sort in name order
while p>1
and dbg_lines[p-1].i==i
and type(dbg_lines[p-1].n)==type(n)
and dbg_lines[p-1].n>n do
p-=1
end
add(dbg_lines,{n=n,v=v,x=(type(v)=="table" or type(v)=="userdata") and "+" or " ",i=i},p)
end
-- expand/collapse item
function dexp(l,p)
if l.x=="+" then
-- add item properties to expand
if type(l.v)=="userdata" then
if l.v:height() and l.v:height()>1 then
for i=0,l.v:height()-1 do
p+=1
dadd(i,l.v:row(i),l.i.." ",p)
end
elseif l.v:width() then
for i=0,l.v:width()-1 do
p+=1
dadd(i,l.v[i],l.i.." ",p)
end
end
else
for n,v in pairs(l.v) do
p+=1
dadd(n,v,l.i.." ",p)
end
end
l.x="-"
elseif l.x=="-" then
-- delete nested lines to collapse
while p<#dbg_lines and #dbg_lines[p+1].i>#dbg_lines[p].i do
deli(dbg_lines,p+1)
end
l.x="+"
end
end
-- handle input
function dinp()
-- get mouse state
local x,y,b,_,w=mouse()
-- handle mouse click
local click=b==1
if click and not dbg_click then
local i=(y-14)\9+1
local p=dbg_s+i
local l=dbg_lines[p]
if l and(x-220)\5==#l.i then
dexp(l,p)
end
end
-- mouse wheel scrolls
dbg_s=max(min(dbg_s-w*4,#dbg_lines-27),0)
dbg_click=click
end
function dtostr(v,nopreview)
if type(v)=="userdata" then
local w,h,t,d=v:attribs()
local r=t
if h==1 then
r..="["..w.."]"
if w<=16 and not nopreview then
if t=="f64" then r..=" ("..string.format("%.2f",v[0])
else r..=" ("..v[0]
end
for i=1,w-1 do
if t=="f64" then r..=","..string.format("%.2f",v[i])
else r..=","..v[0]
end
end
r..=")"
end
else
r..="["..w.."x"..h.."]"
end
return r
elseif type(v)=="table" then
if #v>0 then
local r="["..#v.."]"
if #v<=16 and not nopreview then
r..=" ("..dtostr(v[1], true)
for i=2,#v do
r..=","..dtostr(v[i], true)
end
r..=")"
end
return r
else
return "{}"
end
else
return tostr(v)
end
end
-- draw UI
function dui()
while true do
rectfill(220,10,470,260,1)
for i=1,27 do
local l=dbg_lines[i+dbg_s]
if l then
local x,y=220,(i-1)*9+14
x+=#l.i*5
local lx=x
print(l.x,x,y,10)
x+=5
print(l.n,x,y,12)
x=max(x+#tostr(l.n)*5,lx+25)
print(sub(dtostr(l.v),1,(470-x)\5),x,y,7)
end
end
dinp()
flip()
end
end
function dbg(v,n)
dadd(n or "value",v,"",#dbg_lines+1)
cursor()
pal()
clip()
dui()
end |
would be great to integrate this with yotta (https://www.lexaloffle.com/bbs/?tid=140833) for easier installation.
[Please log in to post a comment]




