检查Lua C中的保护模式

时间:2013-01-28 23:29:44

标签: lua

在Lua C处理程序中,我在抛出错误之前在注册表中设置了一个标志。如果使用pcall从Lua调用处理程序,我想确保设置(或清除)此标志。以下是更多细节:

我使用handle从C调用了一个基本的Lua函数lua_pcall

function handle()
  c_handle()
end

C中的句柄具有下面的基本结构,我们希望在抛出错误之前设置一个标志以区分错误。

int c_handle(lua_State *L)
{
  if (condition) {
    set a flag in registry
    throw error with lua_error
}

我遇到的问题是我要么不设置注册表标志,要么清除它,如果Lua用pcall调用处理程序:

function handle()
  pcall(c_handle)
end

1 个答案:

答案 0 :(得分:1)

您可以对脚本进行沙箱处理并将pcall替换为您自己的版本,以便回拨c_handle(),如下所示:

local newenv = {
    pcall = function(f, arg1, arg2, ...)
        if pcall(f, arg1, arg2, ...) then
            c_handle(true) -- no error, pass true to c_handle
        else
            c_handle(false) -- error, pass false to c_handle
        end if
    end
}
setmetatable(newenv, {__index = _G})
setfenv(1, newenv)

现在,当您进行受保护的通话时,它将通过c_handle

修改

对于将参数传递给C函数的语法不太确定,但我认为这将是它的基本要点。