Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon.

Pages: 1-

Why does this cause a stack overflow? [LUA]

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.

Name: Anonymous 2013-01-08 21:21

lel no tail call optimization.

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)

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

Name: Anonymous 2013-01-08 21:58

>>4
fuck, forgot to pipe head to sort first.

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)

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.

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

Don't change these.
Name: Email:
Entire Thread Thread List