Вопросы по использованию FFI
- John Doe
- Бюрократ
- Posts: 13861
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Вопросы по использованию FFI
FFI — одна из стандартных библиотек luajit.
Позволяет из Lua кода вызывать внешние C-функции и использовать структуры данных C.
В данной теме задаём вопросы по использованию FFI
Заготовка для документации: viewtopic.php?f=57&t=8418&p=147610#p147610
Примеры готовых скриптов:
Предупреждение: viewtopic.php?p=147610#p147610
Позволяет из Lua кода вызывать внешние C-функции и использовать структуры данных C.
В данной теме задаём вопросы по использованию FFI
Заготовка для документации: viewtopic.php?f=57&t=8418&p=147610#p147610
Примеры готовых скриптов:
Предупреждение: viewtopic.php?p=147610#p147610
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Re: Вопросы по использованию FFI
Latest post of the previous page:
Тут дело не в усмотрении, а во времени, которое не всегда есть.John Doe wrote:Так что оставляю на ваше усмотрение.
Заводите тикет на мантисе, может у кого-нибудь когда-нибудь руки дойдут.
- John Doe
- Бюрократ
- Posts: 13861
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
Сделал сам, сверив по MSDN содержимое указанных заголовочных файлов.
Лишнее убрал, недостающее добавил.
Строки, конфликтующие с текущим содержимым winapi.lua закомментированы.
Строки 95 и 99 надо уточнить, т.к. я не уверен что значит !defined(_M_IX86)
Лишнее убрал, недостающее добавил.
Строки, конфликтующие с текущим содержимым winapi.lua закомментированы.
Строки 95 и 99 надо уточнить, т.к. я не уверен что значит !defined(_M_IX86)
- John Doe
- Бюрократ
- Posts: 13861
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
Применил к LuaMacro\winapi.lua.
Обновлённый winapi.lua
Diff: https://github.com/svn2github/farmanager/pull/1/files
Обновлённый winapi.lua
Diff: https://github.com/svn2github/farmanager/pull/1/files
- John Doe
- Бюрократ
- Posts: 13861
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
Code: Select all
shmuel 08.03.2014 00:08:20 +0200 - build 297
1. Уточнение build 296.
shmuel 07.03.2014 22:30:54 +0200 - build 296
1. Расширение winapi.lua (от John Doe).
- John Doe
- Бюрократ
- Posts: 13861
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
Смотрю farapi.lua, и вижу что в определениях констант вместо специфических типов Far API используются стандартные.
Для чего это сделано?
Code: Select all
static const /*COLORDIALOGFLAGS*/ uint32_t
CDF_NONE = 0;
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Re: Вопросы по использованию FFI
http://luajit.org/ext_ffi_semantics.html
static const declarations only work for integer types up to 32 bits.
- John Doe
- Бюрократ
- Posts: 13861
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
Это ограничение luajit FFI?
Вообще странно, я объявляю
Возможно всё в порядке, если константа фактически умещается в 32 бита.
Не туда смотрю, ULONG как раз 32 бита
Вообще странно, я объявляю
static const ULONG SEE_MASK_NO_CONSOLE = 0x00008000;
и всё работает без ошибок.Возможно всё в порядке, если константа фактически умещается в 32 бита.
Не туда смотрю, ULONG как раз 32 бита
- John Doe
- Бюрократ
- Posts: 13861
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
И судя по другим библиотекам что мне попадались - никто особо не заботится о типе констант, а точнее чаще всего в качестве констант используются обычные числовые lua-переменные.
И в связи с этим у меня возник вопрос как правильно обращаться с константами-флагами?
Что происходит когда я передаю C-константы в функции bit.*? bit64.*?
Не происходит ли при этом лишних конвертаций из типов С в lua и обратно?
И нет ли таких конвертаций при обычном суммировании C-констант?
И в связи с этим у меня возник вопрос как правильно обращаться с константами-флагами?
Что происходит когда я передаю C-константы в функции bit.*? bit64.*?
Не происходит ли при этом лишних конвертаций из типов С в lua и обратно?
И нет ли таких конвертаций при обычном суммировании C-констант?
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Re: Вопросы по использованию FFI
1. За bit.* не беспокойтесь, библиотека встроена в LuaJIT, всё компилируется. В LuaJIT 2.1 библиотека bit работает и с 64-битными данными. А функции bit64.* просто выдадут ошибку при подаче им на вход cdata.John Doe wrote:Что происходит когда я передаю C-константы в функции bit.*? bit64.*?
Не происходит ли при этом лишних конвертаций из типов С в lua и обратно?
И нет ли таких конвертаций при обычном суммировании C-констант?
2. Нет.
3. Нет.
- John Doe
- Бюрократ
- Posts: 13861
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
Спасибо.
Ещё один вопрос возник по следуещему абзацу документации:
Не могли бы вы привести пример такого использования?
Ещё один вопрос возник по следуещему абзацу документации:
Я не понимаю как именно понимать последнее предложение.http://luajit.org/ext_ffi_semantics.html#gc wrote:Similar rules apply for Lua strings which are implicitly converted to "const char *": the string object itself must be referenced somewhere or it'll be garbage collected eventually. The pointer will then point to stale data, which may have already been overwritten. Note that string literals are automatically kept alive as long as the function containing it (actually its prototype) is not garbage collected.
Не могли бы вы привести пример такого использования?
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Re: Вопросы по использованию FFI
Понимать так: использование стринговых литералов (то-есть: "foo", 'bar', [[baz]]) полностью безопасно, за исключением случаев, когда в другую ф-цию передаётся указатель на литерал, а ф-ция, содержащая этот литерал собирается сборщиком мусора.John Doe wrote:Я не понимаю как именно понимать последнее предложение.
- John Doe
- Бюрократ
- Posts: 13861
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
Правильно ли я понял, что в первом предложении говорится о том, что опасен такой код :
Но если используется не переменная, а литерал, то это нормально, пока "жива" функция f1:
Но что если вызов f2 - завершающая команда f1?
Это ведь получится tail call?
Как поведёт себя сборщик мусора?
Это ведь получится tail call?
Как поведёт себя сборщик мусора?
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Re: Вопросы по использованию FFI
Оба примера абсолютно безопасны (даже не учитывая, что вы дважды определили local str в первой ф-ции, а это получаются две разных переменных).
Tail call, насколько я понимаю, не должен влиять на сборку мусора.
Tail call, насколько я понимаю, не должен влиять на сборку мусора.
- John Doe
- Бюрократ
- Posts: 13861
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
Я не намеренно, уже исправил (убрал local)Shmuel wrote:Оба примера абсолютно безопасны (даже не учитывая, что вы дважды определили local str в первой ф-ции, а это получаются две разных переменных).
Как я понимаю, это будет нарушением, поскольку the string object itself must be referenced somewhere or it'll be garbage collected eventually
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Re: Вопросы по использованию FFI
Сборщик мусора собирает объекты, а не переменные. ffi.cast("const char*", str) вернёт указатель на литерал, а не на переменную. Поскольку литерал собран сборщиком не будет, то ptr может быть использован безопасно.John Doe wrote:Как я понимаю, это будет нарушением, поскольку the string object itself must be referenced somewhere or it'll be garbage collected eventually
- John Doe
- Бюрократ
- Posts: 13861
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Вопросы по использованию FFI
Хм.Сборщик мусора собирает объекты, а не переменные
Я был уверерен что в данном случае объект-строка потеряв референс (str=nil) становится мусором и может быть собрана сборщиком.
Разве не это имеется ввиду в цитате the string object itself must be referenced somewhere or it'll be garbage collected eventually?