[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