lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Hi there,

I am currently experiencing unpleasant segfaults when recursively
traversing Lua tables. This is the Lua function whose return value I'd
like to traverse:

    function foo(a)
        local table = { x="a", y="a", z="a"}
        local table2 = { 1, 2 }
        table["4"] = table2
        return table
    end

The corresponding C-code:

    #define KEY -2
    #define VAL -1

    void walk (lua_State *, int);

    void
    print_pair (lua_State *L) {

        switch (lua_type(L, KEY)) {
            case LUA_TNUMBER:
                Warn("key: %i\n", lua_tonumber(L, KEY));
                break;
            case LUA_TSTRING:
                Warn("key: %s\n", lua_tostring(L, KEY));
        }
        
        switch (lua_type(L, VAL)) {
            case LUA_TNUMBER:
                printf("val: %i (number)\n", lua_tonumber(L, VAL));
                break;
            case LUA_TSTRING:
                printf("val: %s (string)\n", lua_tostring(L, VAL));
                break;
            case LUA_TTABLE:
                walk(L, VAL);
                break;
            default:
                Warn("val: other\n");
        }
    }

    void walk (lua_State *L, int idx) {
        lua_pushnil(L);

        printf("idx=%i\n", idx);
        while (lua_next(L, idx) != 0) {
            print_pair(L);
            lua_pop(L, 1);
        }
    }

This yields the output:

    idx=1
    key: y
    val: a (string)
    key: x
    val: a (string)
    key: z
    val: a (string)
    key: 4
    idx=-1
    key: 0
    val: 0 (number)
    Segmentation fault (core dumped)

Are there some special steps I have to take when descending into a
nested table thusly? If so, I suppose it would have to happen in the
LUA_TTABLE case of print_pair(), but I don't know which.

Thanks for any help,
Tassilo
-- 
$_=q#",}])!JAPH!qq(tsuJ[{@"tnirp}3..0}_$;//::niam/s~=)]3[))_$-3(rellac(=_$({
pam{rekcahbus})(rekcah{lrePbus})(lreP{rehtonabus})!JAPH!qq(rehtona{tsuJbus#;
$_=reverse,s+(?<=sub).+q#q!'"qq.\t$&."'!#+sexisexiixesixeseg;y~\n~~dddd;eval