Coro в Perl 5.24
В тот момент, когда перед выпуском Perl 5.24 остались считанные дни, в рассылке
perl5-porters внезапно
вспомнили,
что в новом Perl по-прежнему остаётся сломанным модуль Coro Марка Леманна. Одна
из проблем была связана с тем, что в Perl 5.22 структура MGVTBL
(магическая
виртуальная таблица), формирующаяся во время компиляции perl, стала
константной. Coro делал переопределение в таблице, поэтому и не мог работать с
новым Perl 5.22. Было предложено откатить это изменение до выхода Perl 5.24.
Вносить подобные изменения в последние дни перед выпуском слишком рискованно,
поэтому произошёл спонтанный мозговой штурм проблемы, в результате которого
удалось выяснить очень много интересных деталей. Оказалось, что переопределение
MGVTBL
требовалось Coro только для того, чтобы переопределить работу с
хендлерами сигналов __DIE__
и __WARN__
для магического хеша %SIG
, что в
свою очередь было сделано из-за бага Perl, когда присутствует рассинхронизация
в PL_warnhook
и $SIG{__WARN__}
. Теоретически оба должны ссылаться на
хендлер обработки предупреждений, но некоторые кривые XS-программы, в том
числе входящие в базовый Perl (например, find в PerlIO::Layer), могут изменить
только PL_warnhook
, забыв про $SIG{__WARN__}
. То есть это был банальный
костыль в Coro для обхода реальной проблемы в Perl. Эта проблема была
зафиксирована в баге
#125349,
Более того, оказалось, что Coro можно было приспособить для работы с
константной MGVTBL
, Dave Mitchell и Father Chrysostomos продемонстрировали
патч, который
позволяет Coro работать без проблем на Perl 5.22.
Очевидно, что если бы этот мозговой штурм прошёл год назад, проблема была бы решена раньше и не возникло бы таких явлений как stableperl. Вероятно штурм бы и не потребовался, если бы Марк сообщил о проблеме в Perl, когда столкнулся с ней впервые.