X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=sv.c;h=029de83ca32da15e0172fcd00d1ab267fb38cd82;hb=37c25af0ec94b55a9d5be380e5f1703e0afca56b;hp=c8ad6023141983cfffe137317d1b9698117c44e4;hpb=c2468cc722a15289820cea2b1ff75e4ce69e22ef;p=p5sagit%2Fp5-mst-13.2.git diff --git a/sv.c b/sv.c index c8ad602..029de83 100644 --- a/sv.c +++ b/sv.c @@ -3146,8 +3146,11 @@ Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags) SvIV_set(dstr, SvIVX(sstr)); if (SvIsUV(sstr)) SvIsUV_on(dstr); - if (SvTAINTED(sstr)) - SvTAINT(dstr); + /* SvTAINTED can only be true if the SV has taint magic, which in + turn means that the SV type is PVMG (or greater). This is the + case statement for SVt_IV, so this cannot be true (whatever gcov + may say). */ + assert(!SvTAINTED(sstr)); return; } goto undef_sstr; @@ -3167,8 +3170,11 @@ Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags) } SvNV_set(dstr, SvNVX(sstr)); (void)SvNOK_only(dstr); - if (SvTAINTED(sstr)) - SvTAINT(dstr); + /* SvTAINTED can only be true if the SV has taint magic, which in + turn means that the SV type is PVMG (or greater). This is the + case statement for SVt_NV, so this cannot be true (whatever gcov + may say). */ + assert(!SvTAINTED(sstr)); return; } goto undef_sstr; @@ -3188,7 +3194,8 @@ Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags) GvMULTI_on(dstr); return; } - return S_glob_assign(aTHX_ dstr, sstr, dtype); + S_glob_assign(aTHX_ dstr, sstr, dtype); + return; } break; case SVt_PVFM: @@ -3227,7 +3234,8 @@ Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags) case SVt_PVGV: if (dtype <= SVt_PVGV) { - return S_glob_assign(aTHX_ dstr, sstr, dtype); + S_glob_assign(aTHX_ dstr, sstr, dtype); + return; } /* FALL THROUGH */ @@ -3236,8 +3244,10 @@ Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags) mg_get(sstr); if ((int)SvTYPE(sstr) != stype) { stype = SvTYPE(sstr); - if (stype == SVt_PVGV && dtype <= SVt_PVGV) - return S_glob_assign(aTHX_ dstr, sstr, dtype); + if (stype == SVt_PVGV && dtype <= SVt_PVGV) { + S_glob_assign(aTHX_ dstr, sstr, dtype); + return; + } } } if (stype == SVt_PVLV) @@ -3250,8 +3260,10 @@ Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags) if (sflags & SVf_ROK) { if (dtype >= SVt_PV) { - if (dtype == SVt_PVGV) - return S_pvgv_assign(aTHX_ dstr, sstr); + if (dtype == SVt_PVGV) { + S_pvgv_assign(aTHX_ dstr, sstr); + return; + } if (SvPVX_const(dstr)) { SvPV_free(dstr); SvLEN_set(dstr, 0); @@ -3260,25 +3272,18 @@ Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags) } (void)SvOK_off(dstr); SvRV_set(dstr, SvREFCNT_inc(SvRV(sstr))); - SvROK_on(dstr); + SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_NOK|SVp_NOK|SVf_ROK + |SVf_AMAGIC); if (sflags & SVp_NOK) { - SvNOKp_on(dstr); - /* Only set the public OK flag if the source has public OK. */ - if (sflags & SVf_NOK) - SvFLAGS(dstr) |= SVf_NOK; SvNV_set(dstr, SvNVX(sstr)); } if (sflags & SVp_IOK) { - (void)SvIOKp_on(dstr); - if (sflags & SVf_IOK) - SvFLAGS(dstr) |= SVf_IOK; + /* Must do this otherwise some other overloaded use of 0x80000000 + gets confused. Probably 0x80000000 */ if (sflags & SVf_IVisUV) SvIsUV_on(dstr); SvIV_set(dstr, SvIVX(sstr)); } - if (SvAMAGIC(sstr)) { - SvAMAGIC_on(dstr); - } } else if (sflags & SVp_POK) { bool isSwipe = 0; @@ -3401,22 +3406,18 @@ Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags) SvTEMP_off(sstr); } } - if (sflags & SVf_UTF8) - SvUTF8_on(dstr); if (sflags & SVp_NOK) { - SvNOKp_on(dstr); - if (sflags & SVf_NOK) - SvFLAGS(dstr) |= SVf_NOK; SvNV_set(dstr, SvNVX(sstr)); } if (sflags & SVp_IOK) { - (void)SvIOKp_on(dstr); - if (sflags & SVf_IOK) - SvFLAGS(dstr) |= SVf_IOK; + SvRELEASE_IVX(dstr); + SvIV_set(dstr, SvIVX(sstr)); + /* Must do this otherwise some other overloaded use of 0x80000000 + gets confused. I guess SVpbm_VALID */ if (sflags & SVf_IVisUV) SvIsUV_on(dstr); - SvIV_set(dstr, SvIVX(sstr)); } + SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_NOK|SVp_NOK|SVf_UTF8); { const MAGIC * const smg = SvVOK(sstr); if (smg) { @@ -3426,21 +3427,18 @@ Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags) } } } - else if (sflags & SVp_IOK) { + else if (sflags & (SVp_IOK|SVp_NOK)) { (void)SvOK_off(dstr); - /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */ - SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_IVisUV); - SvIV_set(dstr, SvIVX(sstr)); + SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_IVisUV|SVf_NOK|SVp_NOK); + if (sflags & SVp_IOK) { + /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */ + SvIV_set(dstr, SvIVX(sstr)); + } if (sflags & SVp_NOK) { SvFLAGS(dstr) |= sflags & (SVf_NOK|SVp_NOK); SvNV_set(dstr, SvNVX(sstr)); } } - else if (sflags & SVp_NOK) { - (void)SvOK_off(dstr); - SvFLAGS(dstr) |= sflags & (SVf_NOK|SVp_NOK); - SvNV_set(dstr, SvNVX(sstr)); - } else { if (dtype == SVt_PVGV) { if (ckWARN(WARN_MISC))