2013-04-19 11 views
7

Mam złożoną funkcję kodowania w Pure Perl, którą konwertuję do XS w nadziei na uzyskanie poprawy wydajności.Od kodu X X, jak rekurencyjnie nazywam siebie?

Funkcja, którą konwertuję do XS, musi rekurencyjnie wywoływać samą siebie. Widzę, jak używać call_sv [dzięki "man perlcall"] do wywoływania funkcji Pure Perl.

Ale jak do cholery nazywam siebie (lub jakąkolwiek inną funkcję XS) z poziomu XS?

(PS: Wydajność jest bardzo pożądane ...)

Czy ktoś mógłby rzucić mi wskazówkę? Lub przykład? P-p-p-proszę!

AKTUALIZACJA: Pierwsza odpowiedź była absolutnie poprawna. Wywołanie rekursywnych czystych funkcji C działa dobrze.

+0

opublikowano w Perlmonks: http://perlmonks.org/?node_id=1029459 – salva

Odpowiedz

9

Nie. XS to mechanizm zapewniający interfejs Perla do funkcji C. Nie wywołuj funkcji XS z funkcji C (dla której używałbyś funkcji call_sv lub podobnej); wywołaj funkcję C z funkcji XS.

Zapisz rekursywną funkcję C i pozostaw ją poza kodem XS (przed linią MODULE = lub w oddzielnej). Nazwij to z cienkiego opakowania XS.

+0

Ah ... w istocie bardzo uważałem to podejście. Problem polega na tym, że używam rechot jako mechanizmu obsługi wyjątków, a pure-C nie pozwoli mi tego zrobić, prawda? –

+0

Ponadto, funkcja parsowania jest sterowana przez struktury mieszające Perla (dla kodowania) i konstruuje struktury haszujące (dla dekodowania). Tak więc parsuję i pracuję ze strukturami SV w całym kodzie. Posiadanie głównej funkcji w XS oznacza, że ​​XS obsłuży wszystkie moje pliki nagłówkowe, a ja mogę użyć śmiertelników, aby upewnić się, że moje bufory SV są poprawnie zliczane. Więc rezygnacja z XS byłaby moją ostatnią deską ratunku! –

+0

@ the.jxc: Możesz używać struktur danych Perl i funkcji z Perl C API w swoich funkcjach C, to nie jest problem. – salva