On Wed, 22 Jul 2009, Erland Sommarskog wrote:
> I have an issue with an XS module of mine. I lean towards that it is a
> bug in threads::shared, but maybe I am doing something wrong?
>
> To show the issue, I have this silly XS routine:
> 
>    void
>    arraytest(arrayref)
>          SV * arrayref
>    CODE:
>    {
>      AV *  av = (AV *) SvRV(arrayref);
>      SV ** svp = av_fetch(av, 0, 0);
>      SV *  sv  = *svp;

       SvGETMAGIC(sv);
 
>      warn ("SvOK = %d\n", SvOK(sv));
>      warn ("SvIV = %d\n", SvIV(sv));
>      warn ("SvOK = %d\n", SvOK(sv));
>    }
> 
 
> That is, when I send in a regular array reference, results are as
> expected. But when the reference is a shared object, SvOK first
> returns 0. When I retrieve the value with SvIV I get the correct
> value nevertheless, and next time SvOK returns a true value!
> 
> Am I doing somethinug wrong? Or should I file a bug for threads::shared?

This can happen with other magical SVs too.  You must call SvGETMAGIC()
before you can trust the SVf_?OK flags.  SvIV() will do this as a side
effect.

Cheers,
-Jan


Reply via email to