[Moscow.pm] Perl/XS Create closure

Ruslan Zakirov ruz на bestpractical.com
Пн Ноя 26 09:01:40 PST 2012


2012/11/26 Mons Anderson <mons на cpan.org>:
> Хочу создать анонимную сабу (callback) внутри XS.
>
> т.е. то, что на перле записывается как
>
> package My::Test;
>
> sub test {
> my $var = shift;
> return sub {
> return $var;
> }
> }
>
> package main;
>
> my $cb = My::Test::test("arg");
> $cb->(); # "arg";
> $cb->(); # "arg";
>
> как реализовать это на XS?
> У меня получилось что-то такое, но оно жутко бажное и падучее (под
> дебаггером, например)
>
> XS(cb_test) {
> dVAR;
> dXSARGS;
> dORIGMARK;
> SAVECOMPPAD();
> PAD_SET_CUR_NOSAVE(CvPADLIST( (CV *) SvRV( PAD_SVl(1) ) ),1);
> SV *sv = PAD_SVl(1);
> ST(0) = sv;
> XSRETURN(1);
> SP = ORIGMARK;
> PUSHs(&PL_sv_yes);
> }
>
> void test(SV *var)
> PPCODE:
> CV *myxs = newXS(0,cb_test,__FILE__);
> CvPADLIST(myxs) = pad_new(padnew_SAVE|padnew_SAVESUB);
> PAD_SETSV( pad_add_name_pvs("var", 0,0,0), var );
> SV *cb = newRV_noinc( (SV *) myxs );
> ST(0) = cb;
> XSRETURN(1);
>
> Ткните меня пожалуйста в документацию и примеры того, где это делается.
>

Я не удивлен, что что-то падает. Прикрепить padlist к XS sub'е - это
умно, но скорее всего не жизнеспособно. Просто потому что perl сам
этого не делает. Может и заработает, если долго курить сорцы.

При определенных условиях можно сделать как в [1]. Смотри
xs_make_accessor и соответственно xs_accessor. Там генерируется
именованый альяс к XS функции и на этот альяс можно повесить i32
значение. Вот только отследить удаление функции не получится. Придется
делать пул по значению, если этого достаточно для задачи.

[1] http://cpansearch.perl.org/src/RUZ/Class-Accessor-Fast-XS-0.04/XS.xs

Ты чего оптимизируешь? Может можно по другому?

> --
> Best wishes,
> Vladimir V. Perepelitsa aka Mons Anderson
> <inthrax на gmail.com>, <mons на cpan.org>
> http://github.com/Mons
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>



-- 
Best regards, Ruslan.


Подробная информация о списке рассылки Moscow-pm