2

Lua C ハンドラで、エラーをスローする前にレジストリにフラグを設定しました。ハンドラーがpcall. 詳細は次のとおりです。

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
4

1 に答える 1

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 関数に渡すための構文についてはよくわかりませんが、それが基本的な要点になると思います。

于 2013-01-29T02:18:54.187 に答える