SV_CHECK_THINKFIRST_COW_DROP(rv); (void)SvAMAGIC_off(rv); if (SvTYPE(rv) >= SVt_PVMG) { const U32 refcnt = SvREFCNT(rv); SvREFCNT(rv) = 0; sv_clear(rv); SvFLAGS(rv) = 0; SvREFCNT(rv) = refcnt; sv_upgrade(rv, SVt_IV); } else if (SvROK(rv)) { SvREFCNT_dec(SvRV(rv)); } else if (SvTYPE(rv) < SVt_PV && SvTYPE(rv) != SVt_IV) { sv_upgrade(rv, SVt_IV); } else if (SvTYPE(rv) >= SVt_PV) { SvPV_free(rv); SvLEN_set(rv, 0); SvCUR_set(rv, 0); } SvOK_off(rv); SvRV_set(rv, sv); SvROK_on(rv); SvREFCNT_inc(sv); SvSETMAGIC(rv);