在 Lua C 中检查保护模式。

在Lua的C处理程序中,在引发错误之前在注册表中设置一个标志。我希望确保在从Lua中使用pcall调用处理程序时设置(或清除)此标志。以下是更多详细信息:

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

function handle()
  c_handle()
end

在C中,handle具有以下基本结构,在其中我们希望在引发错误之前设置一个标志以区分该错误与其他错误。

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
点赞
用户1031671
用户1031671

你可以将脚本设置为沙箱模式,并且用你自己的版本替换 pcall 函数,让它回调到 c_handle(),如下所示:

local newenv = {
    pcall = function(f, arg1, arg2, ...)
        if pcall(f, arg1, arg2, ...) then
            c_handle(true) -- 没有错误,传递 true 给 c_handle
        else
            c_handle(false) -- 有错误,传递 false 给 c_handle
        end if
    end
}
setmetatable(newenv, {__index = _G})
setfenv(1, newenv)

现在当你进行受保护的调用时,它将通过 c_handle 进行。

编辑

不确定如何传递参数给 C 函数的语法,但这大概就是它的基本意思。

2013-01-29 02:18:54