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

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

5 голосов
/ 02 сентября 2010

Я написал оболочку 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 die. В моем случае это довольно сложно реализовать внутри .pm, так как многие функции требуют специальных проверок ошибок. Тот также приведет к дублированию кода, поскольку проверки уже присутствуют внутри XS.

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

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

1 Ответ

6 голосов
/ 02 сентября 2010

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

...