develooper Front page | perl.perl5.porters | Postings from November 2003

sv_mortalcopy(sv) vs sv_2mortal(newSVsv(sv))

Thread Next
From:
Nicholas Clark
Date:
November 18, 2003 14:42
Subject:
sv_mortalcopy(sv) vs sv_2mortal(newSVsv(sv))
Message ID:
20031118224204.GE6287@plum.flirble.org
I notice this code in hv.c:

keysv = sv_2mortal(newSVsv(keysv));

I wonder why it's not written:

kevsv = sv_mortalcopy(keysv);

That would be this:

SV *
Perl_sv_mortalcopy(pTHX_ SV *oldstr)
{
    register SV *sv;

    new_SV(sv);
    sv_setsv(sv,oldstr);
    EXTEND_MORTAL(1);
    PL_tmps_stack[++PL_tmps_ix] = sv;
    SvTEMP_on(sv);
    return sv;
}


Instead of this:

SV *
Perl_newSVsv(pTHX_ register SV *old)
{
    register SV *sv;

    if (!old)
	return Nullsv;
    if (SvTYPE(old) == SVTYPEMASK) {
        if (ckWARN_d(WARN_INTERNAL))
	    Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
	return Nullsv;
    }
    new_SV(sv);
    if (SvTEMP(old)) {
	SvTEMP_off(old);
	sv_setsv(sv,old);
	SvTEMP_on(old);
    }
    else
	sv_setsv(sv,old);
    return sv;
}

+

SV *
Perl_sv_2mortal(pTHX_ register SV *sv)
{
    if (!sv)
	return sv;
    if (SvREADONLY(sv) && SvIMMORTAL(sv))
	return sv;
    EXTEND_MORTAL(1);
    PL_tmps_stack[++PL_tmps_ix] = sv;
    SvTEMP_on(sv);
    return sv;
}


What's the necessity of all the games turning temp off and on again for
the code as used by hv.c?

Nicholas Clark

Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About