Каков наилучший способ борьбы с вложенными вызовами lua_CFunction? Предположим, у меня есть две функции:Вложенные вызовы lua_CFunction
static int function2(lua_State *L) {
int i = luaL_checkint(L, 1);
/* do something */
return 1;
};
static int function1(lua_State *L) {
struct udata *u = luaL_checkudata(L, 1, UDATA_METATABLE);
int i = luaL_checkint(L, 2);
/* do something */
/* this does not work, first on call stack is udata, not int */
return function2(L);
};
Функция вызова как указано выше не работает. Один из вариантов состоит в том, чтобы изменить function2()
, чтобы использовать последний элемент (индекс -1) в стеке, но это вообще не решение, так как function2()
может вызываться из разных мест с разными столами вызовов. Другим способом было бы заменить return function2(L);
на
lua_pushcfunction(L, function2);
lua_pushvalue(L, 2);
lua_call(L, 1, 1); /* need to know number of results */
Я предполагаю, что это дает function2()
свой собственный стек вызовов, так что нет необходимости изменять его. Но это усложнение кажется слишком сложным для функций с большим количеством параметров, поскольку требует дублирования их всех в стеке.
tl; dr: Каков рекомендуемый способ/хороший способ позвонить lua_CFunction
из другого?
Спасибо за этот ответ! Я не уверен, что полностью понимаю, но посмотрю на руководство по функциям закрытия и посмотрю, смогу ли я это понять. – 1k5