LINUX.ORG.RU

Работа с хешами в Perl XS

 , ,


0

2

Всем привет.

Подскажите, кто в теме, как передавить хеши (не hashref's) в xs-функцию?

Вот есть такой XS-код:

int
my_xs_func(params)
    HV *params
    PROTOTYPE: %
    CODE:
        SV **width = hv_fetch(params, "width", strlen("width"), 0);
        int *w = SvIV(*width);
        printf("\nWIDTH: %d", *w);
        printf("\nWIDTH_REF_CNT: %d", SvREFCNT(*width));
        RETVAL = 1;
    OUTPUT:
        RETVAL

Все компилится, но когда я из перл-кода вызываю xs-функцию:

...
my_xs_func(width => 12345);

То получаю ошибку:

Usage: MyPackage::my_xs_func(params) at test.pl line 11.

ЧЯДНТ?

(width => 12345) - это список, а не хэш. Perl-код, чтобы получить хэш, обычно делает my %args = @_, но любые предупреждения (например, из-за нечётного количества аргументов) при этом возникнут в вызываемом коде, а не вызывающем (хотя ошибка допущена в последнем). Боюсь, Вам придётся вместо HV *params сделать int my_xs_func(...), свериться с объявляемой XS переменной items и собрать хэш вручную из ST(i).

Лучше требуйте передачи hashref. Заодно будет меньше копирований данных.

anonymous ()
Ответ на: комментарий от anonymous

Лучше требуйте передачи hashref. Заодно будет меньше копирований данных.

Спасибо, попробую.

KernelPanic ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.