检测lua表爬行中的无限循环

时间:2013-06-26 14:28:43

标签: c api recursion lua self-reference

我正在尝试使用lua c api抓取全局命名空间及其所有内容。我遇到的一个问题是表中的自引用。我使用扁平表方法来确定是否存在条目,但这对于嵌套数字表失败,例如:

a = {[1] = {[1]={[1]=true}}}

如果keyname为1将为false,则会触发重复条目,因为它会多次出现。为了避免这种情况,我采用了使用lua_topointer的方法并将引用存储在映射中并像这样检查(其中varUnit只是一个跟踪已加载变量的结构):

    lua_pushvalue(L, -1);
    const void* kp = lua_topointer(L, -1);
    var->kpointer = kp;
    varUnit->addPointer(kp);
    lua_pop(L, 1);
    lua_pushvalue(L, -2);
    const void* vp = lua_topointer(L, -1);
    var->vpointer = vp;
    varUnit->addPointer(vp);
    lua_pop(L, 1);

然后我稍后检查该变量是否存在,如果存在,我就不再走下台了。但是,在处理自引用表时,这并没有停止无限递归。这里有更好的方法/一些有缺陷的逻辑吗?给定表的第二次遇到会给我一个不同的指针吗?我已经看到了多种基于lua的方法来抓取表,但不是任何基于c的方法。

编辑: 封闭的问题,是一个愚蠢的错误,我在指向变量的指针之前检查指针是否重复。

1 个答案:

答案 0 :(得分:0)

我不确定你的意思是“使用扁平的桌子方法”;但是在代码中的某处,您必须检查给定值是否为表(因此您可以在其中进行检查)。最简单的方法是保留一组已经访问过的表,对于你找到的表,首先检查它是否已经存在,这样你就不会抓取它两次了。