[Moscow.pm] Perl/XS Create closure

Mons Anderson mons на cpan.org
Пн Ноя 26 07:00:52 PST 2012


Хочу создать анонимную сабу (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);

Ткните меня пожалуйста в документацию и примеры того, где это делается.


-- 
Best wishes,
Vladimir V. Perepelitsa aka Mons Anderson
<inthrax на gmail.com>, <mons на cpan.org>
http://github.com/Mons
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20121126/c2ba43bd/attachment-0001.html>


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