[Moscow.pm] Perl/XS Create closure

Mons Anderson mons на cpan.org
Вт Ноя 27 05:19:57 PST 2012


Руслан, огромное тебе спасибо.

Я крутился вокруг да около, но все никак не мог наткнуться на правильный
кусочек кода )
оказывается указатель на CV * нам просто передается в XS(...) {...}
А я блин искал его в стеке и в падлистах.

и в результате есть как минимум 3 способа:

1. CvXSUBANY(cv).any_ptr = (void *) ...;
2. sv_magicext((SV *) cv, NULL, PERL_MAGIC_ext, &null_mg_vtbl, (void *)...,
0);
3. CvPADLIST(cv) = pad_new ...

Я пока заюзал первый, по крайней мере могу с чего-то уже начать. а там
посмотрю.

Вот работающий пример:
https://gist.github.com/4154184




2012/11/27 Ruslan Zakirov <ruz на bestpractical.com>

> 2012/11/27 Mons Anderson <mons на cpan.org>:
> > 2012/11/27 Ruslan Zakirov <ruz на bestpractical.com>
> >>
> >>
> >> А следующее не подходит почему?
> >>
> >> AE::io( $fileno, $flag, sub { on_event($fileno, $flag) } );
> >>
> >> Накладные расходы вызова сабы?
> >>
> >>
> > потому что on_event - сишная функция. и вот как-раз у меня не получается
> так
> > собрать анонимную функцию, находясь внутри XS.
> > т.е. грубо говоря
> >
> > у меня есть
> > void on_event( ... ) { ... }
> >
> > я могу сделать:
> > PUSHMARK(SP);
> > EXTEND(SP,3);
> > PUSHs( sv_fileno );
> > PUSHs( sv_flag );
> > PUSHs( ??? );
> > PUTBACK;
> > call_pv( "AE::io", G_VOID )
> >
> > А что мне передать как 3й аргумент?
>
> RV на CV :) Все равно придется обернуть on_event или оно работает со
> стеком?
>
> Вот еще про замыкания в XS:
>
> http://perl-users.jp/articles/advent-calendar/2010/english/3
>
> > --
> > 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 mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>



-- 
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/20121127/875b83bb/attachment-0001.html>


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