Why does this cause a stack overflow? [LUA]
1
Name:
Anonymous
2013-01-08 21:18
function printtable (t)
for i,v in pairs (t) do
strbuf = ""
for iter=1, tabs, 1 do
strbuf = strbuf .. '\t'
end
print(strbuf, v)
if type(v) == "table" then
tabs = tabs + 1
printtable(v)
end
tabs = tabs - 1
end
end
tabs=0
printtable(_G)
It shouldn't recurse that much.
2
Name:
Anonymous
2013-01-08 21:21
le l no tail call optimization.
3
Name:
Anonymous
2013-01-08 21:42
>>2
True, and there are some other vulgarities in that program, but I still don't see why it causes a stack overflow. Unless Lua is batshit crazy and has hundreds of tables nested inside each other in the global table (or a circular reference somewhere), I'm not seeing why it would cause a stack overflow.
...there does seem to be a circular reference or something, look at the output of this program:
function printtable (t, tabs)
for i,v in pairs (t) do
local strbuf = ""
for iter=1, tabs, 1 do
strbuf = strbuf .. '\t'
end
print(strbuf, v)
if type(v) == "table" then
printtable(v, (tabs + 1))
end
end
end
printtable(_G, 0)
4
Name:
Anonymous
2013-01-08 21:54
Further fucking source of confusion: Why isn't lua global.lua | head -n 1000 | uniq -d detecting these obvious duplicates? init.lua seems to be the source of the circular definition, btw.
./?.lua;/usr/local/share/luajit-2.0.0/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua
table: 0x40635b30
table: 0x40636728
function: builtin#33
function: builtin#36
function: builtin#30
function: builtin#34
function: builtin#31
function: builtin#32
table: 0x4063a568
function: builtin#153
function: builtin#154
function: builtin#152
function: builtin#156
function: builtin#158
function: builtin#159
function: builtin#157
function: builtin#160
function: builtin#162
function: builtin#161
function: builtin#155
table: 0x4063aaa0
function: builtin#163
table: 0x40638a28
function: builtin#39
function: builtin#45
inf
function: builtin#41
function: builtin#64
function: builtin#44
function: builtin#49
function: builtin#63
function: builtin#59
3.1415926535898
function: builtin#62
function: builtin#57
function: builtin#60
function: builtin#38
function: builtin#40
function: builtin#55
function: builtin#48
function: builtin#59
function: builtin#47
function: builtin#58
function: builtin#37
function: builtin#61
function: builtin#43
function: builtin#52
function: builtin#54
function: builtin#51
function: builtin#42
function: builtin#53
function: builtin#50
function: builtin#46
function: builtin#56
table: 0x40636ac0
table: 0x40636f88
function: 0x4063ab48
./?.lua;/usr/local/share/luajit-2.0.0/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua
table: 0x40635b30
table: 0x40636728
function: builtin#33
function: builtin#36
function: builtin#30
function: builtin#34
function: builtin#31
function: builtin#32
table: 0x4063a568
function: builtin#153
function: builtin#154
function: builtin#152
function: builtin#156
function: builtin#158
function: builtin#159
function: builtin#157
function: builtin#160
function: builtin#162
function: builtin#161
function: builtin#155
table: 0x4063aaa0
function: builtin#163
table: 0x40638a28
function: builtin#39
function: builtin#45
inf
function: builtin#41
function: builtin#64
function: builtin#44
function: builtin#49
function: builtin#63
function: builtin#59
3.1415926535898
function: builtin#62
function: builtin#57
function: builtin#60
function: builtin#38
function: builtin#40
function: builtin#55
function: builtin#48
function: builtin#59
function: builtin#47
function: builtin#58
function: builtin#37
function: builtin#61
function: builtin#43
function: builtin#52
function: builtin#54
function: builtin#51
function: builtin#42
function: builtin#53
function: builtin#50
function: builtin#46
function: builtin#56
table: 0x40636ac0
table: 0x40636f88
function: 0x4063ab48
./?.lua;/usr/local/share/luajit-2.0.0/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua
...etc
5
Name:
Anonymous
2013-01-08 21:58
>>4
fuck, forgot to pipe
head to
sort first.
6
Name:
Anonymous
2013-01-08 22:09
Well whatever, I give up, but here's the least retarded version of the program:
function printtable (t, tabs)
for i,v in pairs (t) do
for iter=1, tabs, 1 do
io.write('\t')
end
print(v)
if type(v) == "table" then
printtable(v, (tabs + 1))
end
end
end
printtable(_G, 0)
7
Name:
Anonymous
2013-01-08 22:36
>>1
You need to either not call it on cyclic structures or add in cycle detection which either represents cyclic structures in a reasonable way or aborts.
8
Name:
Anonymous
2013-01-09 0:39
>>7 thanks, you tipped me off to the obvious solution:
Make a table of all the tables that have been printed, and don't print the same ones twice. This program won't show all of the relationships between tables, but at least the output is concise:
function printtable_m ()
local memo = {}
return function (t, tabs)
for i,v in pairs (t) do
for iter=1, tabs, 1 do
io.write('\t')
end
print(v)
if type(v) == "table" then
if memo[v] then break else
memo[v] = true
printtable(v, (tabs + 1))
end
end
end
end
end
printtable = printtable_m()
printtable(_G, 0)
produces:
table: 0x41a59728
function: builtin#33
function: builtin#36
function: builtin#30
function: builtin#34
function: builtin#31
function: builtin#32
function: builtin#2
function: builtin#18
function: builtin#17
table: 0x41a5a958
function: builtin#116
file (0x7f77cd5fc360)
function: builtin#111
function: builtin#113
function: builtin#117
function: builtin#109
function: builtin#112
function: builtin#114
function: builtin#110
function: builtin#115
function: builtin#119
function: builtin#118
file (0x7f77cd5fc280)
file (0x7f77cd5fc1a0)
function: builtin#12
function: builtin#21
table: 0x41a5db90
untitled.lua
luajit
function: builtin#7
function: builtin#29
function: builtin#20
function: builtin#26
function: 0x41a59e10
function: builtin#11
function: 0x41a5e900
function: 0x41a5e8e0
function: builtin#5
table: 0x41a5d1e0
x64
LuaJIT 2.0.0
20000
function: builtin#150
function: builtin#147
Linux
function: builtin#148
function: builtin#149
function: builtin#151
table: 0x41a5d568
function: builtin#153
function: builtin#154
function: builtin#152
function: builtin#156
function: builtin#158
function: builtin#159
function: builtin#157
function: builtin#160
function: builtin#162
function: builtin#161
function: builtin#155
table: 0x41a5daa0
function: builtin#163
table: 0x41a5cc20
function: builtin#71
function: builtin#69
function: builtin#72
function: builtin#67
function: builtin#75
function: builtin#74
function: builtin#70
function: builtin#66
function: builtin#65
function: builtin#68
function: builtin#76
function: builtin#73
table: 0x41a59ac0
table: 0x41a59f88
function: 0x41a5db48
./?.lua;/usr/local/share/luajit-2.0.0/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua
table: 0x41a58b30
table: 0x41a59728
function: 0x41a59be8
function: 0x41a59b50
./?.so;/usr/local/lib/lua/5.1/?.so;/usr/local/lib/lua/5.1/loadall.so
function: 0x41a59b98
table: 0x41a59c30
function: 0x41a59c80
function: 0x41a59ca8
function: 0x41a59cd0
function: 0x41a59cf8
/
;
?
!
-
function: builtin#19
table: 0x41a5c608
function: builtin#146
function: builtin#138
function: builtin#139
function: builtin#140
function: builtin#141
function: builtin#137
function: builtin#131
function: builtin#136
function: builtin#143
function: builtin#133
function: builtin#142
function: builtin#144
function: builtin#145
function: builtin#132
function: builtin#135
function: builtin#134
function: builtin#22
function: builtin#14
function: builtin#24
function: builtin#13
function: builtin#15
table: 0x41a5a1c0
function: builtin#93
function: builtin#99
function: builtin#97
function: builtin#92
function: builtin#95
function: builtin#94
function: builtin#98
function: builtin#96
function: 0x41a59e58
Lua 5.1
function: builtin#28
function: builtin#27
function: builtin#25
function: builtin#4
table: 0x41a5ba28
function: builtin#39
function: builtin#45
inf
function: builtin#41
function: builtin#64
function: builtin#44
function: builtin#49
function: builtin#63
function: builtin#59
3.1415926535898
function: builtin#62
function: builtin#57
function: builtin#60
function: builtin#38
function: builtin#40
function: builtin#55
function: builtin#48
function: builtin#59
function: builtin#47
function: builtin#58
function: builtin#37
function: builtin#61
function: builtin#43
function: builtin#52
function: builtin#54
function: builtin#51
function: builtin#42
function: builtin#53
function: builtin#50
function: builtin#46
function: builtin#56
function: builtin#23
table: 0x41a5ae98
function: builtin#120
function: builtin#122
function: builtin#130
function: builtin#124
function: builtin#129
function: builtin#121
function: builtin#127
function: builtin#125
function: builtin#128
function: builtin#126
function: builtin#123
table: 0x41a57958
table: 0x41a59728
function: builtin#16
table: 0x41a5b378
function: builtin#86
function: builtin#83
function: builtin#91
function: builtin#81
function: builtin#90
function: builtin#77
function: builtin#89
function: builtin#85
function: builtin#87
function: builtin#82
function: builtin#78
function: builtin#79
function: builtin#84
function: builtin#89
function: builtin#80
function: builtin#3
function: builtin#8
function: builtin#10
function: builtin#9
maple@pancake:/tmp$ lua untitled.lua | sort | uniq -d
function: builtin#59
function: builtin#89
Newer Posts