从堆栈中抓取闭包时如何使用lua_topointer?

时间:2017-10-28 19:47:07

标签: c lua nim

所以我一直在尝试使用C绑定在nim中实现lua并且一切正常但除了我不知道如何处理传递给我的nim / c创建的procs / functions的lua函数

Lua代码:

task("custom_task", function()
    task("This is called from lua")
end)

Nim proc:

proc task*(state: lua.Pstate): cint {.cdecl.} =

  var task_name : cstring

  if lua.isstring(state, 1) == 1:
    task_name = lua.tostring(state, cint(1))

  if task_name != nil:
    echo task_name

  # this is triggered for the 2nd parameter
  if lua.isfunction(state, 2) == true:
    var test = lua.topointer(state, 2)

  result = 1

所以lua api没有tofunction方法,只有tocfunction,所以看起来获取该功能的唯一方法是使用topointer,但我可以'弄清楚如何在nim中使用它。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

lua_topointer返回的值不能用于除了hasing或output / debugging之外的任何内容。引用Lua manual

  

无法将指针转换回原始值。

     

通常,此函数仅用于散列和调试信息。

因此,如果您想使用lua函数,则必须找到不同的方法。我的建议是将函数存储在lua注册表中。然后可以通过注册表索引及其lua_State来识别该函数。

此方法的唯一问题是您必须记住从注册表中删除该功能。否则它永远不会被垃圾收集。

或者,可以lua_dump这个功能,这显然是一个相当昂贵的操作。