【问题标题】:Weird results reading index 0 from the stack从堆栈中读取索引 0 的奇怪结果
【发布时间】: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 类型,为什么它的值如此奇怪地不一致?

【问题讨论】:

    标签: c++ lua


    【解决方案1】:

    0 不是有效的堆栈索引,因此您不能依赖在那里找到任何东西。这有点像拿你的lua_State 指针并取消引用(lua_State - 1) 并询问那里的价值。太垃圾了。

    来自Lua manual:

    API 中接收堆栈索引的任何函数仅适用于有效索引或可接受的索引。

    有效索引是指在栈中的一个实际位置的索引,即它的位置在 1 和栈顶之间(1 = abs(index) = top)。

    可接受的索引可以是任何有效索引,包括伪索引,但也可以是分配给堆栈,即索引到堆栈大小。

    (请注意,0 绝不是可接受的索引)

    查看源代码(参见index2addr),看起来如果Lua 是使用LUA_USE_APICHECK 构建的,您的调用会引发错误。

    【讨论】:

      猜你喜欢
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 1970-01-01
      相关资源
      最近更新 更多