Как получить доступ к текущему контексту из XS?

Когда пользователь звонит XS от main:: пакет мы не можем использовать

caller_cx(0, NULL);

потому что нет рамок для main:: и для XSUB DOC

Обратите внимание, что XSUB не получают стековый фрейм, поэтому C вернет информацию для непосредственно окружающего кода Perl

Как получить file:line информация о XSUB называется, подсказки для main:: объем и т.д. информация?

1 ответ

Решение

Скопировано из mess_sv (вызывается функциями Perl API warn а также croak, которые добавляют информацию о строке как функции Perl warn а также die):

use strict;
use warnings;
use feature qw( say );

use Inline C => <<'__EOS__';

void testing() {
    dXSARGS;

    /*
     * Try and find the file and line for PL_op.  This will usually be
     * PL_curcop, but it might be a cop that has been optimised away.  We
     * can try to find such a cop by searching through the optree star ting
     * from the sibling of PL_curcop.
     */
    if (PL_curcop) {
        const COP *cop =
            Perl_closest_cop(aTHX_ PL_curcop, OpSIBLING(PL_curcop), PL_op, FALSE);
        if (!cop)
            cop = PL_curcop;

        if (CopLINE(cop)) {
            EXTEND(SP, 2);
            mPUSHs(newSVpv(OutCopFILE(cop), 0));
            mPUSHs(newSViv((IV)CopLINE(cop)));
            XSRETURN(2);
        }
    }

    XSRETURN(0);
}

__EOS__

say join ":", testing();

Немного о PL_curcop здесь

Другие вопросы по тегам