4

コンテキスト: 私は一連のバインディングに取り組んでおり、関数の多くは「グローバル」な Lua 状態を参照しています。(私が開発しているコードでは実際にはグローバルではありませんが、特定のランタイム インスタンスに対してローカルであるため、すべてのコールバック関数が共有状態にアクセスできるという点でグローバルです。)

lua_CFunctionLua のドキュメントでは、a に渡されたポインターが、関数の呼び出しに使用されたものとまったく同じオブジェクトへのポインターであることが保証されているかどうかを指定していないようですlua_State(直接lua_cpcall()または C 関数を呼び出す Lua コードを呼び出すことによって間接的に)。

小さなテストでは、ポインターが同じオブジェクトを参照していることが示されていますが、これが保証されているかどうかはわかりません。

#include <stdio.h>
#include <lua5.1/lua.h>
#include <lua5.1/lauxlib.h>

static lua_State *state;

static int test_fn(lua_State *L)
{
    printf("global:%p local:%p\n", state, L);
    return 0;
}

int main(int argc, char const **argv)
{
    state = luaL_newstate();

    luaL_openlibs(state);
    lua_register(state, "test_fn", test_fn);

    luaL_dostring(state, "test_fn()");

    lua_close(state);
}

出力例:

global:0x87ef008 local:0x87ef008

Lua が関数にその関数への引数のみを含むスタックを与えることは知っていますが、独立したスタックを追跡している別の状態ポインターをその関数に渡すことでこれを実装できるのではないかと少し不安になります。また、別の方法を必要としない他の方法をいくつでも実装できますlua_State-実際、私はそれがこの方法で機能することを期待しています-しかし、ドキュメントではどちらの方法も明示的に述べていないようです.

これらのポインタは等しいことが保証されていますか? そうでない場合、どのような状況で異なる可能性がありますか?

4

2 に答える 2