2013-04-19 9 views
7

Ho una funzione di codifica complessa in Pure Perl che sto convertendo in XS nella speranza di ottenere un incremento delle prestazioni.Dal codice XS di Perl, come faccio a chiamarmi in modo ricorsivo?

La funzione che sto convertendo in XS deve chiamarsi in modo ricorsivo. Posso vedere come usare call_sv [grazie a "man perlcall"] per chiamare le funzioni Pure Perl.

Ma come diavolo mi chiamo (o qualsiasi altra funzione XS) dall'interno di XS?

(P.S. L'efficienza è molto desiderabile ...)

qualcuno può gettare un suggerimento? O un esempio? P-p-p-per favore!

AGGIORNAMENTO: La prima risposta era assolutamente corretta. Chiamare a ricorsive pure funzioni C funziona bene.

+0

cross-postato in Perlmonks: http://perlmonks.org/?node_id=1029459 – salva

risposta

9

No. XS è un meccanismo per fornire un'interfaccia Perl ad una funzione C. Non chiamare la funzione XS dalla funzione C (per la quale si utilizza call_sv o simile); chiama la funzione C dalla funzione XS.

Scrivere la funzione C ricorsiva e tenerla al di fuori del codice XS (prima della riga MODULE = o in un numero separato .c). Chiamalo da un sottile XS wrapper.

+0

Ah ... in effetti ho considerato molto questo approccio. Il problema è che sto usando croak come meccanismo di gestione delle eccezioni, e pure-C non mi permetterà di farlo, vero? –

+0

Inoltre, la funzione di analisi è guidata da strutture hash Perl (per la codifica) e sta costruendo strutture hash (per la decodifica). Quindi sto analizzando e lavorando con le strutture SV in tutto il codice. Avere la funzione principale in XS significa che XS gestirà tutti i miei file di intestazione, e posso usare mortali per assicurarmi che i miei buffer SV siano conteggiati correttamente. Quindi abbandonare XS sarebbe la mia ultima risorsa! –

+0

@ the.jxc: è possibile utilizzare le strutture dati e le funzioni Perl dall'API Perl C nelle funzioni C, non è un problema. – salva

Problemi correlati