X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/0f9a6232f0af0895807ddd0afae2d5512aa91bf9..d3f5b0a08053f885ee584142cbe1f9a31cffd409:/pp_hot.c?ds=sidebyside diff --git a/pp_hot.c b/pp_hot.c index 3867875..2df5df8 100644 --- a/pp_hot.c +++ b/pp_hot.c @@ -1060,9 +1060,9 @@ PP(pp_multiconcat) SV * const tmpsv = amagic_call(left, right, concat_amg, (nextappend ? AMGf_assign: 0)); if (tmpsv) { - /* NB: tryAMAGICbin_MG() includes an SvPADMY test - * here, which isn;t needed as any implicit - * assign does under OPpTARGET_MY is done after + /* NB: tryAMAGICbin_MG() includes an OPpTARGET_MY test + * here, which isn't needed as any implicit + * assign done under OPpTARGET_MY is done after * this loop */ if (nextappend) { sv_setsv(left, tmpsv); @@ -1097,15 +1097,20 @@ PP(pp_multiconcat) SP = toparg - stack_adj + 1; - /* Assign result of all RHS concats (left) to LHS (targ). + /* Return the result of all RHS concats, unless this op includes + * an assign ($lex = x.y.z or expr = x.y.z), in which case copy + * to target (which will be $lex or expr). * If we are appending, targ will already have been appended to in * the loop */ - if (is_append) - SvTAINT(targ); - else { + if ( !is_append + && ( (PL_op->op_flags & OPf_STACKED) + || (PL_op->op_private & OPpTARGET_MY)) + ) { sv_setsv(targ, left); SvSETMAGIC(targ); } + else + targ = left; SETs(targ); RETURN; } @@ -1257,7 +1262,7 @@ PP(pp_eq) dSP; SV *left, *right; - tryAMAGICbin_MG(eq_amg, AMGf_set|AMGf_numeric); + tryAMAGICbin_MG(eq_amg, AMGf_numeric); right = POPs; left = TOPs; SETs(boolSV( @@ -1430,16 +1435,10 @@ PP(pp_add) NV nl = SvNVX(svl); NV nr = SvNVX(svr); - if ( -#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan) - !Perl_isnan(nl) && nl == (NV)(il = (IV)nl) - && !Perl_isnan(nr) && nr == (NV)(ir = (IV)nr) -#else - nl == (NV)(il = (IV)nl) && nr == (NV)(ir = (IV)nr) -#endif - ) + if (lossless_NV_to_IV(nl, &il) && lossless_NV_to_IV(nr, &ir)) { /* nothing was lost by converting to IVs */ goto do_iv; + } SP--; TARGn(nl + nr, 0); /* args not GMG, so can't be tainted */ SETs(TARG); @@ -1521,7 +1520,9 @@ PP(pp_add) auv = aiv; auvok = 1; /* Now acting as a sign flag. */ } else { - auv = -(UV)aiv; + /* Using 0- here and later to silence bogus warning + * from MS VC */ + auv = (UV) (0 - (UV) aiv); } } a_valid = 1; @@ -1541,7 +1542,7 @@ PP(pp_add) buv = biv; buvok = 1; } else - buv = -(UV)biv; + buv = (UV) (0 - (UV) biv); } /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve, else "IV" now, independent of how it came in.