【发布时间】:2014-05-03 03:54:20
【问题描述】:
通常 Lua 堆栈从索引 1 开始。但是,在读取调用 cfunction 提供的堆栈地址 0 时,我注意到了一个奇怪的现象。
--lua tables defined via Lua C API
h{ }
u{ }
f{ u{ s{} } }
--table calls
h(2)
u(3)
f.u.s(4)
上述所有表(h、u 和嵌套的s)都有一个指向同一个 cfunction 的 __call 元方法。从那个 cfunction 我正在读取/转储传递的堆栈:
while(start_index <= lua_gettop(state)) {
switch(lua_type(state, start_index)) {
case LUA_TNUMBER:
std::cout << "LUA_TNUMBER:"<<lua_tonumber(state, start_index);
break;
//... dump for all the other types
当start_index从1开始时,输出如预期:LUA_TABLE LUA_TNUMBER:3;它包含包含元方法(或者我认为)和参数3 的表。
但是,当start_index 从 0 开始时,我想结果不是有效的 Lua 类型,但确实如此。结果不一致:从 Lua 调用时,索引 0 始终是 LUA_TNUMBER,其值为 5。
但是,当使用 pcall (lua_getfield, lua_pushnumber, lua_pcall) 从 C++ 调用时,索引 0 生成相同的 LUA_TNUMBER(5) 调用 f.u.s,但 LUA_TABLE 生成 h 和 u。
索引 0 是什么,为什么它是有效的 Lua 类型,为什么它的值如此奇怪地不一致?
【问题讨论】: