Оба perlcall (в разделе "Стратегии для хранение информации о контексте обратного вызова») и списки Extending and Embedding Perl (в разделе "Обратный вызов") 3 разных способа обработки вызовов подпрограмм Perl из XS/C:
- Немедленно: XS звонит
- Отложено: сохранение дополнительной ссылки как SV* на потом.
- Несколько: сохраните n подссылок на потом
В приведенном выше примере и подробностях для № 3 используется хэш в XS для связывания вложенной ссылки с конкретной функцией C, но они предопределяют фиксированное количество функций C, что неадекватно.
Я работаю над интерфейсом XS для библиотеки C, которая использует обратные вызовы/указатели функций с необязательными аргументами, например:
blah(custom_type *o, void (*func) (void *data, int more_data), const void * data);
C blah в этой библиотеке в конечном итоге вызовет переданную ей функцию вместе с переданными данными.
Если возможно, я хотел бы сделать сопоставление 1-к-1 C API с Perl. например
blah($o, \&func, $data);
В настоящее время у меня есть № 2 выше, но другой вызов blah() перезапишет сохраненный SV *.
Как бы я реализовал № 3 выше?