in reply to XS: returning a 64-bit unsigned int?

Petition p5p?

It seems you can't get an IV no matter what you do

SV* bob() PREINIT: SV* temp; //~ unsigned int uncle = 42; unsigned long long uncle = 42; CODE: //~ temp = newSVuv( 42 ); temp = newSVuv( uncle ); SvIOK_only_UV( temp ); warn("we got em %p SvIOK_UV(%b)SvUVX(%u)", temp, SvIOK_UV(temp +), SvUVX(temp) ); RETVAL = temp; OUTPUT: RETVAL

Always gives

we got em 3f8d14 SvIOK_UV(0)SvUVX(42) at -e line 1. SV = IV(0x3f8d10) at 0x3f8d14 REFCNT = 1 FLAGS = (TEMP,IOK,pIOK) IV = 42

Replies are listed 'Best First'.
Re^2: XS: returning a 64-bit unsigned int?
by BrowserUk (Patriarch) on Sep 27, 2011 at 06:57 UTC

    Seems you can, provided you look in the wrong part of the manual for the api. :(


    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
      Right, but shouldn't newSVuv make a UV and not an IV? Talk about false advertising :)

        Perl claims the right to convert among equivalent representations. It's an optimisation that an UV isn't used unless needed since UVs require extra handling.

        >perl -MDevel::Peek -e"Dump(0x7FFFFFFF)" SV = IV(0x1de9d00) at 0x1de9d04 REFCNT = 1 FLAGS = (PADTMP,IOK,READONLY,pIOK) IV = 2147483647 >perl -MDevel::Peek -e"Dump(0x80000000)" SV = IV(0x4a9d00) at 0x4a9d04 REFCNT = 1 FLAGS = (PADTMP,IOK,READONLY,pIOK,IsUV) UV = 2147483648
        shouldn't newSVuv make a UV and not an IV? Talk about false advertising :)

        I concur completely. But you think that ones bad, what d'ya think newSVrv( rv ) does?


        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.