[Moscow.pm] компиляция XS на BSD
Ruslan Zakirov
ruz на bestpractical.com
Вс Фев 13 14:01:28 PST 2011
2011/2/13 Ivan Petrov <i.petro.77.00 на gmail.com>:
>
>> >>
>> >> (а ошибки, вероятно от версии gcc, подробно не разбирался).
>> >> Дело в том, что начиная с 5.12 (может еще в 5.11.*) RV и IV флаги были
>> >> объединены в один.
>> >> * http://perl5.git.perl.org/perl.git/blob/maint-5.10:/sv.h
>> >> * http://perl5.git.perl.org/perl.git/blob/maint-5.12:/sv.h
>> >
>> > и как теперь в XS можно отличить ссылку (REF) от всего остального
>> > (SCALAR/HASH/ARRAY)? если RV объединили с IV?
>> SvROK
>
> SvROK скажет что это ссылка и на то что будет SVt_IV тоже соответствовать
>
> то есть теперь чтобы вычислить в XS что это ссылка на ссылку надо пройти по
> всем 15 вариантам SVt_*, я правильно понимаю?
Нет. Неправильно. Я на это уже раньше напарывался. Неправильно
подразумевать, что SVt_* определяет хранимое значение. Просто потому
что у вас может сначала хранится magic, потом глоб, потом инт, а потом
еще что-то в обном скаляре. Он в время присвоения upgrade'иться, но не
downgrade'иться. Пример:
perl -MDevel::Peek -e 'my $x = 10; Dump($x); $x.=""; Dump($x); $x =
bless { }, "foo"; Dump($x); $x = 10; Dump($x)'
SV = IV(0x10082d630) at 0x100801500
REFCNT = 1
FLAGS = (PADBUSY,PADMY,IOK,pIOK)
IV = 10
SV = PVIV(0x1008032c0) at 0x100801500
REFCNT = 1
FLAGS = (PADBUSY,PADMY,POK,pPOK)
IV = 10
PV = 0x1002021c0 "10"\0
CUR = 2
LEN = 8
SV = PVIV(0x1008032c0) at 0x100801500
REFCNT = 1
FLAGS = (PADBUSY,PADMY,ROK)
IV = 10
RV = 0x100801410
....
PV = 0x100801410 ""
CUR = 0
LEN = 0
SV = PVIV(0x1008032c0) at 0x100801500
REFCNT = 1
FLAGS = (PADBUSY,PADMY,IOK,pIOK)
IV = 10
PV = 0
Был IV, стал PVIV для int+str, достаточно для RV - остался PVIV, далее
так и остался PVIV.
Нужно использовать SvROK для проверки, что это ссылка. Соответственно
SvIOK для инта и так далее.
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>
>
--
Best regards, Ruslan.
Подробная информация о списке рассылки Moscow-pm