Tôi đã viết trình bao bọc Perl XS cho thư viện C bao gồm khoảng ~ 80 chức năng. Ngay bây giờ chiến lược chung của tôi là thay thế lỗi từ một hàm C với PL_sv_undef
và mã Perl đang gọi phải kiểm tra rõ ràng cho dù lợi nhuận không phải là undef
. (Đối với một số chức năng C nó là phức tạp hơn như tôi chuyển đổi sản lượng của họ vào một HV
/AV
và sử dụng danh sách trống để báo cáo lỗi.)XSUB của Perl có thể chết như thế nào?
Bây giờ khi tôi chuyển sang viết kịch bản Perl lớn hơn sử dụng thư viện đó, tôi muốn đơn giản hóa việc xử lý lỗi và sử dụng ví dụ cơ chế eval {}
/die
ngoại lệ giống như để xử lý lỗi.
Tại thời điểm một XSUB đơn giản trong XS của tôi trông như thế:
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
Tôi đã thấy rằng một số module có cờ toàn cầu như "RaiseError" để die
trên lỗi nhưng không tìm thấy bất kỳ ví dụ tôi có thể mượn từ. Vài mô-đun tôi đã tìm thấy xử lý cờ "RaiseError" bên trong .pm
, không phải bên trong .xs
và do đó được phép sử dụng số die
của Perl. Trong trường hợp của tôi là khá khó khăn để thực hiện bên trong các .pm
như nhiều chức năng yêu cầu kiểm tra lỗi đặc biệt. Điều đó cũng sẽ dẫn đến trùng lặp mã khi kiểm tra đã có mặt bên trong XS.
Tôi không tìm thấy nội dung nào có liên quan trong tài liệu perlxs
/perlguts
. Đặc biệt, tôi đã thấy các cuộc gọi tới số Perl_croak()
trong số .c
được tạo từ số .xs
của mình, nhưng không thể tìm thấy bất kỳ tài liệu nào cho hàm đó.
Tương tự XS của Perl là die
là gì? Hoặc báo cáo XSUB khác có thể hoạt động như thế nào với Perl thời gian chạy mà chức năng đã thất bại và không có RETVAL trả lại? Làm cách nào để đặt đúng số [email protected]
?
Chỉ một câu hỏi. Tại sao * chết * và không * chết *? Hay đó là một trí thông minh của Larry? – Dummy00001
Không, [Zefram] (http://search.cpan.org/~zefram) 's. Đó là cách sử dụng [hackish] (http://catb.org/jargon/html/writing-style.html) vì nó xuất phát từ từ khóa 'die'. – daxim