Perl newXS () с добавлением закрытия

Я хочу встроить Perl в приложение c ++ и ищу метод для вызова в c ++ из perl через newXS (). Помимо указателя на функцию мне нужно связать пользовательский указатель на резюме, созданное newXS (). Указатель содержит контекст C ++. Я не хочу использовать глобалы для этого. Есть ли общий способ сделать это?

В более широком смысле вопрос, может быть, погода есть возможность добавить закрытие в резюме, созданное newXS () и как ссылаться на него, когда вызывается функция c, которая была зарегистрирована с ней. CvPADLIST() может показаться идеальным местом, однако для XSubs, по-видимому, он недопустим, если установлен PERL_IMPLICIT_CONTEXT (комментарий в начале pad.cl perl. Может быть, его можно игнорировать?). Есть ли какое-то другое место, где я могу разместить CV локальные данные?

6

Решение

Там есть ANY слот в CV которые могут быть использованы для пользовательских данных и доступны с CvXSUBANY(cv), Например:

CvXSUBANY(cv).any_ptr = my_ptr;

Этот слот обычно используется для хранения индекса XS ALIASes и указатель на функцию для XS ИНТЕРФЕЙСЫ.

3

Другие решения

Одна возможность заключается в прикреплении PERL_MAGIC_ext магия для SV, как описано в perlguts:

int  m_free (pTHX_ SV *sv, MAGIC* mg){ ... }
STATIC MGVTBL my_vtbl = { 0, 0, 0, 0, m_free, 0, 0, 0 };
struct ctx;

XS(XS_some_func)
{
...
MAGIC *mg;
if ((mg = mg_findext((SV*)cv, PERL_MAGIC_ext, &my_vtbl))) {
ctx *priv = (ctx *)mg->mg_ptr;
}
...
}

И назначение магии при создании резюме через newXS ():

   ctx c;
...
CV *cv = newXS(index, XS_some_func, __FILE__);
MAGIC *mg = sv_magicext((SV *)cv,
0,
PERL_MAGIC_ext,
&my_vtbl,
(const char*)&c,
sizeof(c));
5

Самый простой (и, скорее всего, лучший) подход, вероятно, заключался бы в том, чтобы сделать контекст явным — предоставить объектно-ориентированный API и использовать методы вместо функций. Когда в Perl коде new экземпляр класса создан, вы помещаете контекст в этот объект. Когда ваш XSUB вызывается как метод для этого объекта, он получает контекст в качестве первого параметра (т.е. ST(0)).

Это в основном эквивалентно комментариям Мельпомены с точки зрения XS / C ++, но не требует дополнительного закрытия оболочки.

Если существует только один контекст на процесс, использование глобальных переменных также будет законным — возможно, неизбежным злом. Сравните также Безопасное хранение статических данных в XS.

Я не знаю механизма прямой связи дополнительных данных с xsubs. Может быть возможно использовать некоторую магию с CV, но это звучит излишне сложно, если вы не можете позволить себе поместить свой контекст в объект Perl.

2
По вопросам рекламы [email protected]