Como o Xsub de Perl pode morrer?
Pergunta
Eu escrevi um invólucro Perl XS para uma biblioteca C composta por ~ 80 funções. No momento, minha estratégia geral é substituir o erro de uma função C com PL_sv_undef
e o código Perl de chamada deve verificar explicitamente se o retorno não é undef
. (Para algumas funções C, é mais complicado à medida que eu converso sua saída em um HV
/AV
e use a lista vazia para relatar o erro.)
Agora, quando me mudei para escrever scripts perl maiores usando essa biblioteca, quero simplificar o manuseio de erros e usar o habitual eval {}
/die
Mecanismo de exceção para lidar com erros.
No momento, um xsub simples nos meus Xs se parece com isso:
SV *
simple_function( param1, param2 = 0, param3 = 0)
int param1
int param2
int param3
CODE:
int rc;
rc = simple_function( param1, param2, param3 );
RETVAL = (rc == 0) ? &PL_sv_yes : &PL_sv_undef;
OUTPUT:
RETVAL
Eu vi que alguns módulos têm bandeira global como "RaiseError" para die
em erros, mas não encontrou qualquer exemplo de que possa pedir emprestado. Os poucos módulos que encontrei lidam com a bandeira "Raiseerror" dentro do .pm
, não dentro do .xs
, e, portanto, permitido usar os perl's die
. No meu caso, é bastante difícil de implementar dentro do .pm
Como muitas funções requerem verificações especiais de erro. Isso também levaria à duplicação do código, pois as verificações já estão presentes dentro do XS.
Não encontrei nada relevante no perlxs
/perlguts
documentação. Em particular, eu vi ligações para Perl_croak()
no .c
gerado do meu .xs
, mas não conseguiu localizar qualquer documentação para a função.
Qual é o análogo do XS dos Perl's die
? Ou de que outra forma o Relatório XSUB ao Perl em tempo de execução de que a função falhou e não há retval para retornar? Como definir corretamente o $@
?
Solução
Perl_croak () está documentado aqui no perlapi
página de homem. Como mostra o exemplo nessa página, você pode passar uma sequência de mensagens ou definir manualmente $@ como um objeto de exceção e passar nulo.