2010-09-02 24 views
5

Napisałem perl XS wrapper dla biblioteki C składającej się z około ~ 80 funkcji. Obecnie moja ogólna strategia polega na zastąpieniu błędu funkcją C za pomocą PL_sv_undef, a wywołujący kod Perla musi jawnie sprawdzić, czy zwrot nie jest undef. (W przypadku niektórych funkcji C jest bardziej skomplikowana jak przekonwertować swoje wyjście do HV/AV i wykorzystać pustą listę, aby zgłosić błąd.)W jaki sposób XSUB Perla może umrzeć?

Teraz jak przeprowadziłem się do pisania większych skryptów Perl przy użyciu tej biblioteki, chcę uprość obsługę błędów i użyj np zwykle podobny do wyjątku mechanizm do obsługi błędów.

Obecnie prosty XSUB w moich XS wyglądać tak:

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 

Widziałem, że niektóre moduły mają globalną flagę jak „raiseError” do die na błędów, ale nie udało się znaleźć żadnego przykładu mogę pożyczyć od. Kilka modułów, które mam , odszukało flagę "RaiseError" wewnątrz .pm, a nie wewnątrz .xs i tym samym pozwalało używać Perla na die. W moim przypadku raczej trudno jest implementować wewnątrz .pm, ponieważ wiele funkcji wymaga specjalnych testów błędów. To również doprowadziłoby do powielenia kodu, ponieważ kontrole są już obecne w XS.

Nie znalazłem nic istotnego w dokumentacji perlxs/perlguts. W szczególności widziałem połączenia z Perl_croak() w .c wygenerowane z mojego .xs, ale nie udało się zlokalizować żadnej dokumentacji dla funkcji.

Co to jest XS 'analog z Perla die? Lub w jaki inny sposób może XSUB raportować do Perl , że funkcja nie działa i nie ma RETVAL do zwrotu? Jak prawidłowo ustawić [email protected]?

Odpowiedz

6

Perl_croak() jest dokumentowany here na stronie podręcznika użytkownika . Jak pokazuje przykład na tej stronie, możesz przekazać mu ciąg znaków lub ręcznie ustawić $ @ na obiekcie wyjątku i przekazać NULL.

+0

Tylko jedno pytanie. Dlaczego * umiera *, a nie * umiera *? A może to był inny dowcip Larry'ego? – Dummy00001

+1

Nie, [Zefram] (http://search.cpan.org/~zefram). Jest to [hackish] (http://catb.org/jargon/html/writing-style.html) użycie, ponieważ pochodzi od słowa kluczowego 'die'. – daxim