我正在尝试为运行lua脚本的进程编写调试器,并且记录的这样做(在C中)是使用lua_sethook
:
int lua_sethook (lua_State *L, lua_Hook f, int mask, int count);
lua_Hook
定义为:
typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);
钩子只获得一个lua_State
指针,这很棒,但是如何将指向调试器类的指针与它相关联,以便我可以从那里返回调试器类?
我想在这种情况下避免使用全局变量,因为我有多个lua_State
个实例。我想我可以使用lua_State *
指向调试器实例的映射,但这似乎并不高效。将它作为全局存储在lua_State *
似乎没有意义,因为为了能够检索它,我必须将至少一个值推到lua堆栈上,这似乎很难/在lua堆栈溢出的情况下无法做到。
我错过了什么吗?我怎么做到这一点?我知道,我可以用lua代码完成这个,但我想知道如何从C方面做到这一点。
答案 0 :(得分:0)
最终,您无法直接将值与钩子函数关联。
但你可以通过各种方式间接地这样做。最安全的可能是将值放在Lua注册表中的已知位置。你也可以把它变成一个全球性的。但无论如何,它都需要能够通过lua_State
对象访问。
使用已注册的Lua实例外部的数据是危险的。也就是说,您可能会想到一个关联容器,它将lua_State
指针映射到已注册的实例数据。但是,如果你尝试这个,如果在执行Lua协程期间调用了钩子函数,它可能会失败,因为它们在主线程中有单独的lua_State
个对象。