[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