2010-09-02 9 views
5

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]?

risposta

6

Perl_croak() è documentato here nella pagina man perlapi. Come mostra l'esempio in quella pagina, è possibile passargli una stringa di messaggi, oppure è possibile impostare manualmente $ @ su un oggetto di eccezione e passare NULL.

+0

Solo una domanda. Perché * morire * e non * morire *? O era un altro ingegno di Larry? – Dummy00001

+1

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

Problemi correlati