lua_gettop返回0,但是堆栈不会表现为空

时间:2019-01-20 19:09:07

标签: c++ lua

当我运行以下代码时:

pState = luaL_newstate();
if( !pState )
    return false;

luaL_requiref( pState, "_G", luaopen_base, 1 );
luaL_requiref( pState, "table", luaopen_table, 1 );
luaL_requiref( pState, "string", luaopen_string, 1 );
luaL_requiref( pState, "math", luaopen_math, 1 );
luaL_requiref( pState, "debug", luaopen_debug, 1 );
luaL_requiref( pState, "package", luaopen_package, 1 );
lua_pop( pState, 6 );
// Clear stack 
lua_settop( pState, 0 );

//...

lua_newtable( pState );
lib_indx = lua_gettop( pState );
CLuaManager::PrintStack( pState );

lib_indx的值为0,我的PrintStack函数(与documentation中的函数相同)表明堆栈为空。但是,如果我尝试执行任何使用该值在堆栈顶部的操作,它们将像表在堆栈顶部那样工作。例如,以下代码:

lua_newtable( pState );
lib_indx = lua_gettop( pState );
lua_setglobal( pState, "TestTable" );

不会导致错误,并且可以通过脚本访问表“ TestTable”:

function dump(o)
   if type(o) == 'table' then
      local s = '{ '
      for k,v in pairs(o) do
         if type(k) ~= 'number' then k = '"'..k..'"' end
         s = s .. '['..k..'] = ' .. dump(v) .. ','
      end
      return s .. '} '
   else
      return tostring(o)
   end
end

print("TestTable:", dump(TestTable))

对行lua_setglobal( pState, "TestTable" );进行注释会导致TestTable: nil的输出,而对注释不注释会导致TestTable: { }。这表明表已被设置为全局值TestTable。但是,lib_indx仍为零!那么Lua在哪里找到桌子?

1 个答案:

答案 0 :(得分:0)

我发现了行为的根源。错位的lua_pop显然导致堆栈的大小为负数,因此将新表添加到了堆栈中,但是索引意外。