Lua,c ++和消失的元数据

rap*_*tor 5 c++ lua metatable

背景

我和Watusimoto在Bitfighter游戏上合作.我们使用LuaWrapper的变体将我们的c ++对象与游戏中的Lua对象连接起来.我们还使用称为lua-vec的Lua变体来加速向量操作.

我们一直在努力解决一段时间没有找到错误的bug.将发生随机崩溃,表明腐败的元数据.有关Watusimoto的帖子,请参阅此处.我不确定这是因为一个腐败的metatable,并且看到了一些我想在这里问的非常奇怪的行为.

问题表现形式

作为一个例子,我们创建一个对象并将其添加到这样的级别:

t = TextItem.new()
t:setText("hello")
levelgen:addItem(t)
Run Code Online (Sandbox Code Playgroud)

但是,游戏有时会(并非总是)崩溃.出错:

attempt to call missing or unknown method 'addItem' (a nil value)
Run Code Online (Sandbox Code Playgroud)

使用上面提到的Watusimoto帖子中给出的建议,我已将最后一行更改为以下内容:

local ok, res = pcall(function() levelgen:addItem(t) end)

if not ok then
    local s = "Invalid levelgen value: "..tostring(levelgen).." "..type(levelgen).."\n"

    for k, v in pairs(getmetatable(levelgen)) do 
        s = s.."meta "..tostring(k).." "..tostring(v).."\n"
    end

    error(res..s)
end
Run Code Online (Sandbox Code Playgroud)

这打印出metatable,levelgen如果错误的话从它调用一个方法.

然而,这很疯狂,当它失败并打印出metatable时,metatable 正是应该如何(使用正确的addItem调用和所有内容).如果我levelgen在脚本加载时打印metatable ,并且在上面使用它时失败pcall,它们是相同的,每个调用和指向userdata的指针是相同的,应该是它.

好像metatable levelgen是随意地自发消失的.

有谁会知道发生了什么?

谢谢

注意:仅在levelgen对象中不会发生这种情况.例如,它也发生在TestItem上面提到的对象上.事实上,同样的代码在我的计算机上levelgen:addItem(t)崩溃但在另一个开发人员的计算机上崩溃,并且该行t:setText("hello")具有相同的错误消息missing or unknown method 'setText' (a nil value)

rap*_*tor 1

与上游(commit 3c54015)LuaWrapper合并后,这个问题消失了。这似乎是 LuaWrapper 中的一个错误。

谢谢亚历克斯!