Гарантированно ли указатель lua_State, переданный в lua_CFunctions, указывает на то же состояние, которое использовалось для вызова функции?

Контекст: я работаю над набором привязок, и многие из моих функций ссылаются на "глобальное" состояние Lua. (На самом деле это не глобальный код в разрабатываемом мной коде, а локальный для конкретного экземпляра среды выполнения, настолько глобальный, что все функции обратного вызова имеют доступ к общему состоянию.)

В документации Lua, похоже, не указано, передан ли указатель на lua_CFunction гарантированно будет указатель на точно такой же lua_State объект как был использован для вызова функции (непосредственно через lua_cpcall() или косвенно, вызывая код Lua, который вызывает функцию C).

Небольшой тест показывает, что указатели ссылаются на один и тот же объект, но я не знаю, гарантировано ли это.

#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 - и на самом деле я ожидаю, что это работает таким образом - но документация явно не говорит ни о том, ни о другом.

Эти указатели гарантированно равны? Если нет, то при каких обстоятельствах они могут отличаться?

1 ответ

Решение

Если ваша функция C вызывается из кода Lua, то аргумент lua_State будет потоком Lua вызывающей функции Lua.

Если ваш код Lua не использует сопрограммы, существует только один поток, поэтому вы всегда получите глобальное состояние.

Ответ Дуга верен, но для дальнейшего уточнения указатель состояния, как гарантированно, не будет одинаковым и, скорее всего, будет другим, когда вы используете сопрограммы.

Для примера того, как это происходит не так, посмотрите на проблему, с которой я столкнулся всего несколько часов назад.

Другие вопросы по тегам