Pygin — Python adapter

Место, где разработчики плагинов могут поделиться своим опытом.
Post Reply
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Pygin — Python adapter

Post by DrKnS »

Image

Не прошло и трёх лет, как у меня дошли руки набросать демо для Python.
Умеет добавлять пункт в меню плагинов и показывать сакральную фразу под панелями.
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

Latest post of the previous page:

379105 - это размер архива pygin.7z Не знаю как по-другому идентифицировать. Смена гуидов ничего не дала. Сейчас попробую с последней сборкой Far'а.
Last edited by techie on Fri 28 Apr, 2017 10:40, edited 1 time in total.
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

Не помогло. Вот что выводит, если кнопку Stack нажать.



Это 32-битная система, может в этом дело? Или в конфликтах с Python garbage collector?
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

Скачал PDB, подложил в %FARHOME%. Теперь Stack вот такой:

Code: Select all

0x685D1DD0 Free
0x685C99FA Free
0x685D23BD Free
0x0116F953 Plugin::ExecuteFunctionSeh<Plugin::ExecuteStruct<0,1>,GlobalInfo * &> (c:\src\unicode_far\plclass.hpp:308)
0x0116D360 seh_invoke<<lambda_aea1a5ab9ab4599c75cf5767da215209>,<lambda_e653ac410c4258a6ce9d02fe87349247>,<lambda_c78e72e91534c6804eda7df20d644122> > (c:\src\unicode_far\f
0x0116BC50 Plugin::GetGlobalInfo (c:\src\unicode_far\plclass.cpp:798)
0x0116B5BA Plugin::LoadData (c:\src\unicode_far\plclass.cpp:581)
0x0118F4B8 PluginManager::LoadPlugin (c:\src\unicode_far\plugins.cpp:235)
0x011901FD PluginManager::LoadPlugins (c:\src\unicode_far\plugins.cpp:436)
0x01054134 ControlObject::Init (c:\src\unicode_far\ctrlobj.cpp:94)
0x0114BEF6 MainProcess (c:\src\unicode_far\main.cpp:227)
0x0114E635 mainImpl (c:\src\unicode_far\main.cpp:793)
0x0114E811 wmain_seh (c:\src\unicode_far\main.cpp:823)
0x0114E90E <lambda_93e8a75ad0d6631789a8313e38bae319>::operator() (c:\src\unicode_far\main.cpp:851)
0x0114E982 seh_invoke<<lambda_93e8a75ad0d6631789a8313e38bae319>,<lambda_eb6f9db54eb0b154dda06e08ba319848>,<lambda_b1c7d289a037a6c5b48976ae0d4fd300> > (c:\src\unicode_far\f
0x0114E8B1 main (c:\src\unicode_far\main.cpp:845)
0x011F771E __scrt_common_main_seh (f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl:253)
0x7719D3B1 BaseThreadInitThunk
0x77911527 RtlInitializeExceptionChain
0x779114FA RtlInitializeExceptionChain
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

Про повторном запуске сверху добавилось ещё:

Code: Select all

0x66C0B1D4 PyUnicode_CopyCharacters
0x66C0B291 _PyUnicode_Ready
0x66BC0E66 PyWrapper_New
0x66BC1763 PyDict_New
0x66BC21F4 PyDict_GetItem
0x685D04E7 Free
0x685C8E50 Free
0x685C993F Free
0x685D23BD Free
0x0116F953 Plugin::ExecuteFunctionSeh<Plugin::ExecuteStruct<0,1>,GlobalInfo * &> (c:\src\unicode_far\plclass.hpp:308)
...
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

Лог запуска в appverif.exe -
Far.exe.0.dat.xml
(3.39 KiB) Downloaded 287 times
. Наверное, нужны символы для pygin, чтобы нарыть больше инфы?
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Python adapter

Post by DrKnS »

Как выяснилось, у них там местами весьма своеобразное понимание того, что такое reference counting.

Баг исправлен, аттач в шапке обновлён.
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

у меня показывает "Latest post of the previous page:" первым сообщением на странице вместо шапки топика.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Python adapter

Post by DrKnS »

DrKnS wrote: у них там местами весьма своеобразное понимание того, что такое reference counting
У меня продолжает подгорать от увиденного, поэтому напишу подробнее.

Как работает resource management в общем случае? Вы получаете от рантайма объект и однократно сигнализируете, когда он вам не нужен (malloc...free, new...delete, open...close etc.), после чего объект больше не жилец.
Как работает reference counting в общем случае?
Да примерно так же, только вы дополнительно сигнализируете, когда на этот объект начинает и прекращает ссылаться кто-то ещё. Объект в этом случае больше не жилец тогда, когда он не нужен никому.
Всё это отлично ложится на идиому RAII в C++: в конструкторе/операторе копирования увеличиваем счетчик, в деструкторе уменьшаем, после чего object lifetime становится проблемой индейцев и можно думать о более насущных вещах.

В C же, где RAII нет, полезных ископаемых нет, воды нет, растительности нет, населена роботами обо всем, увы, надо сигнализировать ручками.

Дядя Гвидо, похоже, проникся проблемой индейцев сишников и решил немного сократить им копипасту: если они хотят получить объект, которым явно владеет кто-то ещё - зачем утруждать несчастных? Дадим им объект, не увеличивая счетчик, все равно предыдущий владелец никуда же не денется, да? Зачем счетчик дёргать, да? И назовем это borrowed reference, шоп красиво было.
А некоторые функции (но не все) пусть сами уменьшают счетчик переданных им объектов, потому что ну кому те объекты потом нужны, да? И назовем это stealing a reference, шоп красиво было.

Как это выглядит с точки зрения здравого смысла?
А так, что время жизни объекта зависит не от его типа, а от того, какая функция вам его вернула и куда вы его потом передали.

Иными словами, чтобы получить статически корректную программу, недостаточно убедиться в отсутствии голых, необернутых в smart pointerы указателей в коде - надо полностью инкапсулировать всю эту сишную авгиеву конюшню и писать обертку для каждой Py*-функции, периодически расставляя в них костыли-инкременты.
:facepalm:
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

Крутяк. =) Я начал читать, но "ниасилил" продраться сквозь текст и кучу других вкладок, требующих внимания.

Я вот не понял - можно ли в API вставить имена для параметров в функцию, из которых будет ясно, функция берёт ссылку взаймы (borrowed, счётчик не увеличен, и пока родитель висит и ждёт в стеке, функция может делать с объектом всё что угодно) или крадёт (stealing, родитель или может отстрелиться или уже отстрелился, поэтому функции надо самой думать, как избавиться от референса).

В третьем питоне дядя Гвидо не сильно старался прикладываться, но там много чего делалось для алгоритмической оптимизации производительности - замена всего и вся на непонятные для простых смертных генераторы, и т.п. Возможно это необходимо для поддержки таких вот конструкций. Ты не хочешь запостить это в python-dev@ ? https://mail.python.org/mailman/listinfo/python-dev Я думаю многим было бы интересно прочитать ответ. Могу помочь с переводом на инглиш, если что.

Полезным эффектом будет дополнить документацию понятным объяснением зачем это нужно, в дополнение к тому, как это работает..
А так, что время жизни объекта зависит не от его типа, а от того, какая функция вам его вернула и куда вы его потом передали.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

Python adapter

Post by HaRT »

DrKnS wrote: У меня продолжает подгорать от увиденного
Не зря же Py_DECREF начинается с “Пы_ДЕЦ”.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Python adapter

Post by DrKnS »

techie wrote: можно ли в API вставить имена для параметров в функцию, из которых будет ясно
Можно, наверное. Правда, в нормальном обществе это принято просто делать разными типами, делая ошибку невозможной в принципе.
функция берёт ссылку взаймы ... или крадёт (...функции надо самой думать, как избавиться от референса).
Так думать вообще ни о чём не надо - переданный объект содержит счетчик ссылок и будет жить пока он не 0. Если он функции нужен после выхода - инкремент. Владеет ли им кто-то ещё - не её дело.

Borrowed reference экономит пару тактов процессора и одну строку в C-коде, но, учитывая, что это 1) питон и 2) апи для интеграции с другим языком, это экономия даже не на спичках, а на атомах.
Это как ехать за границу на машине и даже зная, что впереди многочасовая пробка и таможня, все равно лезть на красный, чтобы сэкономить 30 секунд.
В третьем питоне ... много чего делалось для алгоритмической оптимизации производительности
Это так аж с cамого начала.
Возможно это необходимо для поддержки таких вот конструкций.
Всё куда прозаичнее:
These functions were designed to steal a reference because of a common idiom for populating a tuple or list with newly created objects
- т. е. чтобы однострочники на сишечке проще ваять было.
Ты не хочешь запостить это в python-dev@ ?
А толку? Менять это уже 20 лет как поздно, а ответ и так известен - это C, тут так заведено.
Здесь считаем ссылки, здесь не считаем, здесь рыбу заворачивали.
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

User avatar
Sav
Posts: 53
Joined: Thu 15 Jan, 2009 15:25
Has thanked: 1 time

Python adapter

Post by Sav »

techie wrote: шаблон
Шаблон сам по себе не работает, т.к. в нем отсутствует __doc__
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Python adapter

Post by DrKnS »

Обновил архив в шапке.
Изменения преимущественно внутренние, из видимого наружу - теперь есть динамический модуль farapi, предоставляющий плагину функции Far.
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

Sav wrote:Шаблон сам по себе не работает, т.к. в нем отсутствует __doc__
Fixed, thanks. https://github.com/techtonik/discovery/ ... 193a870cd1
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

Ещё было бы удобно для сортировки версий поменять имена архивов с pygin_89f1868_090517.7z на pygin_170509_89f1868.7z
Post Reply

Return to “Разработка плагинов”