FFI — одна из стандартных библиотек luajit.
Позволяет из Lua кода вызывать внешние C-функции и использовать структуры данных C.
В данной теме задаём вопросы по использованию FFI
Shmuel wrote:
LuaJIT FFI рассматривает переопределение статических констант и enum'ов как ошибку. На повторное определение функций почему-то не жалуется.
Это в С такая фишка, что объявление и определение - разные вещи, ЕМНИП. Определения повторять нельзя, объявления можно. Для функций заголовок без тела считается только объявлением, а константы и переменные (даже не инициализированные) считаются определениями, если нет специального ключевого слова extern
Re: luajit в фаре
Posted: Sun 11 Aug, 2013 17:23
by Shmuel
Acerbic wrote:Это в С такая фишка, что объявление и определение - разные вещи, ЕМНИП. Определения повторять нельзя, объявления можно. Для функций заголовок без тела считается только объявлением, а константы и переменные (даже не инициализированные) считаются определениями, если нет специального ключевого слова extern
Да, это так, но при использовании в Lua доставляет неудобства: нельзя (без спец-приседаний) запустить скрипт более 1 раза, нельзя перезагрузить модуль.
ffi.C и unicode/multibyte ... string
Posted: Sat 14 Dec, 2013 17:39
by EGez
Что-то никак не получается через FFI протолкнуть кириллический текст без потерь, уже даже к методам научного тыка прибегнуть пришлось ...
На примере: MessageBoxW(HWND, LPCWSTR, LPCWSTR, UINT);
Пока пришел к следующему, но в конце текста сообщения мусор, как правильно с ним работать?
Но меня терзают смутные сомнения: Почему jit их автоматически не завершает нулями при передаче в контекст c runtime? Это же стандарт в C/C++, именно поэтому мне и не пришла такая идея в голову.
Это workaround или стандартное поведение? Где-нибудь описано?
Спасибо
Re: ffi.C и unicode/multibyte ... string
Posted: Sat 14 Dec, 2013 19:37
by zg
EGez wrote:Но меня терзают смутные сомнения: Почему jit их автоматически не завершает нулями при передаче в контекст c runtime?
а как он должен догадаться?
Re: ffi.C и unicode/multibyte ... string
Posted: Sat 14 Dec, 2013 19:47
by Shmuel
EGez wrote:Но меня терзают смутные сомнения: Почему jit их автоматически не завершает нулями при передаче в контекст c runtime? Это же стандарт в C/C++, именно поэтому мне и не пришла такая идея в голову.
Это workaround или стандартное поведение? Где-нибудь описано?
LuaJIT обрабатывает то, что ему передано, и это правильно.
Данное поведение проистекает от того, что, в отличие от Си-строк, строки в Lua не содержат завершающего нуля (хотя во внутренностях Lua он имеется, но только один нулевой байт, а не два, как нужно для UTF-16).
Re: ffi.C и unicode/multibyte ... string
Posted: Sat 14 Dec, 2013 20:16
by EGez
Shmuel wrote:
LuaJIT обрабатывает то, что ему передано, и это правильно.
Данное поведение проистекает от того, что, в отличие от Си-строк, строки в Lua не содержат завершающего нуля (хотя во внутренностях Lua он имеется, но только один нулевой байт, а не два, как нужно для UTF-16).
Хм.. Я кажется понял в чем дело. Скорее дело не в том, что Lua не использует zero termination.
Поскольку Lua стринги свои не различает на широкие и узкие, в C runtime оно, похоже, передается как char[]/byte[] совершенно не задумываясь о семантике содержимого и все-таки завершенным одним \0 (т.к. char). Поэтому ANSI функции работают нормально... А функция же, которая получает от сего пойнтер параметром, ожидает, что это utf16 и интерпретирует его соответственно, ну и обламывается на одном \0.
Спасибо!
ffi.C и unicode/multibyte ... string
Posted: Mon 16 Dec, 2013 09:57
by John Doe
EGez wrote:Что-то никак не получается через FFI протолкнуть кириллический текст без потерь, уже даже к методам научного тыка прибегнуть пришлось ... :(
На примере: MessageBoxW(HWND, LPCWSTR, LPCWSTR, UINT);
Последний случай (MessageBoxA) у большинства из вас скорее всего будет работать, т.к. locale у вас "случайно" подходящая...
C:\APPs\Far3\lua51x.exe: C:\APPs\Far3\Profile\Macros\2check\ffi\MessageBoxW.lua:13: bad argument #2
to 'MessageBoxW' (cannot convert 'string' to 'const unsigned short *')
stack traceback:
[C]: in function 'MessageBoxW'
C:\APPs\Far3\Profile\Macros\2check\ffi\MessageBoxW.lua:13: in main chunk
[C]: at 0x00407bbc
Проблема только с MessageBoxW, а MessageBoxA отрабатывает нормально
C:\APPs\Far3\lua51x.exe: C:\APPs\Far3\Profile\Macros\2check\ffi\MessageBoxW.lua:13: bad argument #2
to 'MessageBoxW' (cannot convert 'string' to 'const unsigned short *')
stack traceback:
[C]: in function 'MessageBoxW'
C:\APPs\Far3\Profile\Macros\2check\ffi\MessageBoxW.lua:13: in main chunk
[C]: at 0x00407bbc
В данном случае я не пытался освоить FFI, а всего лишь хотел запустить готовый пример из первого сообщения.
Автор представляет его как рабочий, поэтому мне показалось что у меня какая-то проблема с инсталляцией.