Ho scritto un wrapper Perl XS per una libreria C costituita da circa ~ 80 funzioni. In questo momento la mia strategia generale è di sostituire l'errore da una funzione C con PL_sv_undef
e il codice Perl di chiamata deve verificare esplicitamente se il ritorno non è undef
. (Per alcune funzioni C è più complicato come posso convertire la loro produzione in un HV
/AV
e utilizzare lista vuota per segnalare l'errore.)Come può morire XSUB di Perl?
Ora, come mi sono trasferito a scrivere script Perl più grandi con quella libreria, voglio semplificare la gestione degli errori e utilizzare ad es il solito eval {}
/die
meccanismo simile a per gestire gli errori.
Al momento una semplice XSUB nei miei XS quella faccia:
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
ho visto che alcuni moduli hanno flag globale come "RaiseError" per die
su errori, ma non sono riusciti a trovare alcun esempio che posso preso in prestito da. I pochi moduli che ho trovati gestiscono il flag "RaiseError" all'interno di .pm
, non all'interno di .xs
e quindi autorizzato ad usare il Perl die
. Nel mio caso è piuttosto difficile implementare all'interno dello .pm
poiché molte funzioni richiedono controlli degli errori particolari. Che porterebbe anche alla duplicazione del codice poiché i controlli sono già presenti all'interno di XS.
Non ho trovato nulla di rilevante nella documentazione perlxs
/perlguts
. In particolare, ho visto le chiamate a Perl_croak()
nello .c
generato dal mio .xs
, ma non sono riuscito a trovare alcuna documentazione per la funzione.
Qual è l'analogo XS di Perl die
? O in quale altro modo il XSUB può segnalare al runtime Perl che la funzione non è riuscita e non c'è nessun RETVAL da restituire? Come impostare correttamente il [email protected]
?
Solo una domanda. Perché * morire * e non * morire *? O era un altro ingegno di Larry? – Dummy00001
No, [Zefram] (http://search.cpan.org/~zefram). È l'uso di [hackish] (http://catb.org/jargon/html/writing-style.html) perché deriva dalla parola chiave 'die'. – daxim