[Moscow.pm] Fun 2
Dmitry Karasik
dmitry на karasik.eu.org
Пн Мар 16 10:27:12 PDT 2009
On 16 мар 09 at 14:42, ) wrote:
> Приношу извинения, что вклиниваюсь, но на форуме vingrad.ru попался ,
> print():
> unless(&{print 'XXX'}) {print 'false'} else {print 'true'};
> Мне не удалось узнать причину такого поведения функции print(). Буду ,
> -то меня просветит!
Причина в специальной ветке в перле которая отрабатывает общий вызов
процедуры (pp_entersub). Поскольку перл это стековая машина, то сначала
то что надо вызвать кладется на стек а pp_entersub это в свою очередь
вызывает. Если на стеке лежит sv_yes (специальная константа которая
наряду с sv_no, sv_undef итд часто используется в XS для удобства),
то никакого вызова не происходит. Тайный смысл тут состоит в том, что это
часть отработки use, который суть require+import. Если в заюзаном модуле
нет sub import, тогда парсер вместо опкода для вызова import кладет
этот самый sv_yes на стек, который впоследствии благополучно игнорируется.
На мой взгляд далеко не самая изящная схема.
Т.е. фишка не в особом поведении print, т.к. и opendir и вообще любой
XS код который на выходе сделает XPUSHs(&PL_sv_yes) дадут тот же эффект.
Фишка в том что entersub с необычными параметрами ведет себя необычно,
что вообще-то строго говоря баг. OTOH, dreck in, dreck out.
--
Sincerely,
Dmitry Karasik
Подробная информация о списке рассылки Moscow-pm