Обновить

Комментарии 6

Первый пример не компилируется:

int add(void *a, int b, int (*f)(void *ctx)) {
  return f(a, b);
}

Переменная f объявлена как указатель на функцию с одним аргументом, а вызывается с двумя. Замечание в сторону, сервис по кнопке код вполне "объяснил".

Сложным путем идет товарищ... Что мешало просто сохранить findex в стеке Lua?

При выходе из CALLBACK, где создаётся значение findex, стэк будет очищен, потому findex сделана глобальной, чтобы REAL_CALLBACK смог получить значение findex и вытащить из регистра (lua_rawgeti(L, LUA_REGISTRYINDEX, findex)) сохранённую функцию на Lua.

Ниже @4z0t верно предложил использовать lua_pushcclosure, чтобы закинуть findex в качестве upvalue для REAL_CALLBACK.

Вы кажется спутали стек C и стек Lua. Я так-то тоже самое, что и @4z0t говорю, просто о реализации этой функции вручную. Забыл, что она уже есть.

Нет, именно стэк Lua будет очищен. После CALLBACK на Lua стэке останется только одно значение &REAL_CALLBACK <code>lua_pushlightuserdata(L, &REAL_CALLBACK); return 1;</code> Автор, как вы и сказали, сложным путём реализовал аналог lua_pushcclosure.

Не понимаю к чему эти танцы с бубнами и непортируемым кодом, когда есть lua_pushcclosure...

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации