Pygin — Python adapter
Python adapter
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.
Python adapter
Не помогло. Вот что выводит, если кнопку Stack нажать.
Это 32-битная система, может в этом дело? Или в конфликтах с Python garbage collector?
Это 32-битная система, может в этом дело? Или в конфликтах с Python garbage collector?
Python adapter
Скачал 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
Python adapter
Про повторном запуске сверху добавилось ещё:
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)
...
Python adapter
Лог запуска в appverif.exe -
. Наверное, нужны символы для pygin, чтобы нарыть больше инфы?- DrKnS
- Posts: 6114
- Joined: Thu 04 Aug, 2005 06:44
- Location: Kyiv
- Has thanked: 12 times
- Been thanked: 426 times
Python adapter
Как выяснилось, у них там местами весьма своеобразное понимание того, что такое reference counting.
Баг исправлен, аттач в шапке обновлён.
Баг исправлен, аттач в шапке обновлён.
Python adapter
у меня показывает "Latest post of the previous page:" первым сообщением на странице вместо шапки топика.
- DrKnS
- Posts: 6114
- Joined: Thu 04 Aug, 2005 06:44
- Location: Kyiv
- Has thanked: 12 times
- Been thanked: 426 times
Python adapter
У меня продолжает подгорать от увиденного, поэтому напишу подробнее.
Как работает 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*-функции, периодически расставляя в них костыли-инкременты.
Python adapter
Крутяк. =) Я начал читать, но "ниасилил" продраться сквозь текст и кучу других вкладок, требующих внимания.
Я вот не понял - можно ли в API вставить имена для параметров в функцию, из которых будет ясно, функция берёт ссылку взаймы (borrowed, счётчик не увеличен, и пока родитель висит и ждёт в стеке, функция может делать с объектом всё что угодно) или крадёт (stealing, родитель или может отстрелиться или уже отстрелился, поэтому функции надо самой думать, как избавиться от референса).
В третьем питоне дядя Гвидо не сильно старался прикладываться, но там много чего делалось для алгоритмической оптимизации производительности - замена всего и вся на непонятные для простых смертных генераторы, и т.п. Возможно это необходимо для поддержки таких вот конструкций. Ты не хочешь запостить это в python-dev@ ? https://mail.python.org/mailman/listinfo/python-dev Я думаю многим было бы интересно прочитать ответ. Могу помочь с переводом на инглиш, если что.
Полезным эффектом будет дополнить документацию понятным объяснением зачем это нужно, в дополнение к тому, как это работает..
Я вот не понял - можно ли в API вставить имена для параметров в функцию, из которых будет ясно, функция берёт ссылку взаймы (borrowed, счётчик не увеличен, и пока родитель висит и ждёт в стеке, функция может делать с объектом всё что угодно) или крадёт (stealing, родитель или может отстрелиться или уже отстрелился, поэтому функции надо самой думать, как избавиться от референса).
В третьем питоне дядя Гвидо не сильно старался прикладываться, но там много чего делалось для алгоритмической оптимизации производительности - замена всего и вся на непонятные для простых смертных генераторы, и т.п. Возможно это необходимо для поддержки таких вот конструкций. Ты не хочешь запостить это в python-dev@ ? https://mail.python.org/mailman/listinfo/python-dev Я думаю многим было бы интересно прочитать ответ. Могу помочь с переводом на инглиш, если что.
Полезным эффектом будет дополнить документацию понятным объяснением зачем это нужно, в дополнение к тому, как это работает..
А так, что время жизни объекта зависит не от его типа, а от того, какая функция вам его вернула и куда вы его потом передали.
- HaRT
- Moderator
- Posts: 10806
- Joined: Tue 30 Aug, 2005 17:21
- Has thanked: 220 times
- Been thanked: 357 times
- DrKnS
- Posts: 6114
- Joined: Thu 04 Aug, 2005 06:44
- Location: Kyiv
- Has thanked: 12 times
- Been thanked: 426 times
Python adapter
Можно, наверное. Правда, в нормальном обществе это принято просто делать разными типами, делая ошибку невозможной в принципе.
Так думать вообще ни о чём не надо - переданный объект содержит счетчик ссылок и будет жить пока он не 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
А толку? Менять это уже 20 лет как поздно, а ответ и так известен - это C, тут так заведено.Ты не хочешь запостить это в python-dev@ ?
Здесь считаем ссылки, здесь не считаем, здесь рыбу заворачивали.
Python adapter
Ещё было бы удобно для сортировки версий поменять имена архивов с pygin_89f1868_090517.7z на pygin_170509_89f1868.7z