Как Perl XSUB может умереть?

Я написал оболочку Perl XS для библиотеки C, состоящей примерно из 80 функций. Прямо сейчас моя общая стратегия состоит в том, чтобы заменить ошибку функции C на PL_sv_undef, а вызывающий код Perl должен явно проверить, не является ли возвращаемое значение undef. (Для некоторых функций C это сложнее, так как я преобразовываю их вывод в HV/AV и использую пустой список для сообщения об ошибке.)

Теперь, когда я перешел к написанию больших сценариев Perl с использованием этой библиотеки, я хочу упростить обработку ошибок и использовать, например, обычный eval {}/die механизм, похожий на исключение, для обработки ошибок.

На данный момент простой XSUB в моем XS выглядит так:

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

Я видел, что некоторые модули имеют глобальный флаг, такой как «RaiseError», в die при ошибках, но не смог найти ни одного примера, который я мог бы позаимствовать. Несколько модулей, которые я нашел, обрабатывают флаг "RaiseError" внутри .pm, а не внутри .xs, и, таким образом, позволяют использовать Perl's die. В моем случае это довольно сложно реализовать внутри .pm, так как многие функции требуют специальной проверки ошибок. Это также привело бы к дублированию кода, поскольку проверки уже присутствуют внутри XS.

Я не нашел ничего подходящего в файле perlxs/perlguts документации. В частности, я видел вызовы Perl_croak() в .c, сгенерированном из моего .xs, но не нашел никакой документации по этой функции.

Что такое аналог XS для Perl die? Или как еще XSUB может сообщить во время выполнения Perl, что функция не удалась и нет RETVAL для возврата? Как правильно установить $@?


person Dummy00001    schedule 02.09.2010    source источник


Ответы (1)


Perl_croak() задокументирован здесь на perlapi справочной странице. Как показывает пример на этой странице, вы можете либо передать ему строку сообщения, либо вручную установить $@ в объект исключения и передать NULL.

person Peter S. Housel    schedule 02.09.2010
comment
Только один вопрос. Почему умереть, а не умереть? Или это было очередное остроумие Ларри? - person Dummy00001; 02.09.2010
comment
Нет, Zefram. Это хакерское использование, поскольку оно происходит от ключевого слова die. - person daxim; 03.09.2010