[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