perl-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Torsten Foertsch <torsten.foert...@gmx.net>
Subject Re: possible pnotes refcounting bug ?
Date Thu, 11 Oct 2007 13:50:59 GMT
On Thursday 11 October 2007 15:18, Torsten Foertsch wrote:
>     if (key) {
>         STRLEN len;
>         char *k = SvPV(key, len);
>
>         if (val) {
>             retval = *hv_store(*pnotes, k, len, SvREFCNT_inc(val), 0);
>         }
>         else if (hv_exists(*pnotes, k, len)) {
>             retval = *hv_fetch(*pnotes, k, len, FALSE);
>         }
>     }
>     else {
>         retval = newRV_inc((SV *)*pnotes);
>     }
>
>     return retval ? SvREFCNT_inc(retval) : &PL_sv_undef;
>
> I am wondering whether the REFCNT is always right. *pnotes is a HV. If the
> function is called without a key argument the else branch newRV_inc
> increments the REFCNT of the HV, right? Then the return statement in the
> last line increments it again? Am I wrong?

I think it should rather read:

    if (key) {
        STRLEN len;
        char *k = SvPV(key, len);

        if (val) {
            retval = *hv_store(*pnotes, k, len, SvREFCNT_inc(val), 0);
        }
        else if (hv_exists(*pnotes, k, len)) {
            retval = *hv_fetch(*pnotes, k, len, FALSE);
        }

        return retval ? SvREFCNT_inc(retval) : &PL_sv_undef;
    }
    else {
        return newRV_inc((SV *)*pnotes);
    }

Torsten

Mime
View raw message