2013-04-19 2 views
7

필자는 Pure Perl에서 성능 향상을 위해 XS로 변환하는 복잡한 인코딩 기능을 사용하고 있습니다.Perl XS 코드에서 어떻게 재귀 적으로 호출합니까?

XS로 변환하는 함수는 재귀 적으로 자신을 호출해야합니다. Pure Perl 함수를 호출하기 위해 call_sv [man perlcall] 덕분에 사용법을 알 수 있습니다.

하지만 XS에서 내 자신을 (또는 다른 XS 기능)이라고 부르는 방법은 무엇입니까?

누군가 나에게 힌트를 던져 수 (추신 : 효율성은 ... 매우 바람직하다)? 아니면 예를 들어? P-p-p-please!

업데이트 : 첫 번째 대답은 절대적으로 정확했습니다. 재귀 순수 C 함수를 호출하면 정상적으로 작동합니다.

+0

Cross-posted in Perlmonks : http://perlmonks.org/?node_id=1029459 – salva

답변

9

하지 마십시오. XS는 Perl 인터페이스를 C 함수에 제공하는 메커니즘입니다. C 함수에서 XS 함수를 호출하지 마십시오 (예 : call_sv 등). XS 함수에서 C 함수를 호출하십시오.

재귀 C 함수를 작성하고 XS 코드 외부에 두십시오 (MODULE = 행 이전 또는 별도 .c). XS 랩퍼에서 호출하십시오.

+0

아하 ... 실제로 나는 그 접근 방법을 많이 고려했습니다. 문제는 내가 예외 처리 메커니즘으로 Croak를 사용하고 있으며, 순수 C가 그렇게 할 수 없다는 것입니다. –

+0

또한 구문 분석 기능은 Perl 해시 구조 (인코딩)에 의해 구동되고 해시 구조를 구성합니다 (디코딩 용). 그래서 코드 전체에서 SV 구조를 파싱하고 작업하고 있습니다. 주 기능이 XS에 있다는 것은 XS가 모든 헤더 파일을 처리한다는 것을 의미하며 필자는 SV 버퍼가 참조 카운트가 적절하게 유지되도록 보장 할 수 있습니다. 그래서 XS를 도려내는 것이 나의 최후의 수단이 될 것입니다! –

+0

@ the.jxc : C 함수에서 Perl C API의 Perl 데이터 구조와 함수를 사용할 수 있습니다. 이는 문제가되지 않습니다. – salva

관련 문제