X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pp_hot.c;h=3292332642c7cd806d1218b38fa275bfea27b675;hb=b37c2d43c8bccbefe3985273e9661833102148d0;hp=e3527636e8fc23b7d306f6bcf5725144fe67f33d;hpb=f73ef291429b5bbca51e74d1a29b172b5d7304ea;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pp_hot.c b/pp_hot.c index e352763..3292332 100644 --- a/pp_hot.c +++ b/pp_hot.c @@ -146,7 +146,7 @@ PP(pp_sassign) SvUPGRADE((SV *)gv, SVt_RV); SvROK_on(gv); SvRV_set(gv, value); - SvREFCNT_inc(value); + SvREFCNT_inc_simple_void(value); SETs(right); RETURN; } @@ -162,7 +162,7 @@ PP(pp_sassign) /* We've been returned a constant rather than a full subroutine, but they expect a subroutine reference to apply. */ ENTER; - SvREFCNT_inc(SvRV(cv)); + SvREFCNT_inc_void(SvRV(cv)); /* newCONSTSUB takes a reference count on the passed in SV from us. We set the name to NULL, otherwise we get into all sorts of fun as the reference to our new sub is @@ -1335,7 +1335,7 @@ PP(pp_match) } } if ((!global && rx->nparens) - || SvTEMP(TARG) || PL_sawampersand) + || SvTEMP(TARG) || PL_sawampersand || (pm->op_pmflags & PMf_EVAL)) r_flags |= REXEC_COPY_STR; if (SvSCREAM(TARG)) r_flags |= REXEC_SCREAM; @@ -1611,6 +1611,9 @@ Perl_do_readline(pTHX) sv = TARG; if (SvROK(sv)) sv_unref(sv); + else if (isGV_with_GP(sv)) { + SvPV_force_nolen(sv); + } SvUPGRADE(sv, SVt_PV); tmplen = SvLEN(sv); /* remember if already alloced */ if (!tmplen && !SvREADONLY(sv)) @@ -1798,7 +1801,7 @@ PP(pp_helem) LvTYPE(lv) = 'y'; sv_magic(lv, key2 = newSVsv(keysv), PERL_MAGIC_defelem, NULL, 0); SvREFCNT_dec(key2); /* sv_magic() increments refcount */ - LvTARG(lv) = SvREFCNT_inc(hv); + LvTARG(lv) = SvREFCNT_inc_simple(hv); LvTARGLEN(lv) = 1; PUSHs(lv); RETURN; @@ -2004,14 +2007,14 @@ PP(pp_iter) LvTYPE(lv) = 'y'; sv_magic(lv, NULL, PERL_MAGIC_defelem, NULL, 0); } - LvTARG(lv) = SvREFCNT_inc(av); + LvTARG(lv) = SvREFCNT_inc_simple(av); LvTARGOFF(lv) = cx->blk_loop.iterix; LvTARGLEN(lv) = (STRLEN)UV_MAX; sv = (SV*)lv; } oldsv = *itersvp; - *itersvp = SvREFCNT_inc(sv); + *itersvp = SvREFCNT_inc_simple_NN(sv); SvREFCNT_dec(oldsv); RETPUSHYES; @@ -2022,7 +2025,6 @@ PP(pp_subst) dVAR; dSP; dTARG; register PMOP *pm = cPMOP; PMOP *rpm = pm; - register SV *dstr; register char *s; char *strend; register char *m; @@ -2048,7 +2050,7 @@ PP(pp_subst) SV *nsv = NULL; /* known replacement string? */ - dstr = (pm->op_pmflags & PMf_CONST) ? POPs : NULL; + register SV *dstr = (pm->op_pmflags & PMf_CONST) ? POPs : NULL; if (PL_op->op_flags & OPf_STACKED) TARG = POPs; else if (PL_op->op_private & OPpTARGET_MY) @@ -2101,7 +2103,8 @@ PP(pp_subst) pm = PL_curpm; rx = PM_GETRE(pm); } - r_flags = (rx->nparens || SvTEMP(TARG) || PL_sawampersand) + r_flags = (rx->nparens || SvTEMP(TARG) || PL_sawampersand + || (pm->op_pmflags & PMf_EVAL)) ? REXEC_COPY_STR : 0; if (SvSCREAM(TARG)) r_flags |= REXEC_SCREAM; @@ -2511,7 +2514,7 @@ PP(pp_leavesublv) else { /* Can be a localized value subject to deletion. */ PL_tmps_stack[++PL_tmps_ix] = *mark; - (void)SvREFCNT_inc(*mark); + SvREFCNT_inc_void(*mark); } } } @@ -2548,7 +2551,7 @@ PP(pp_leavesublv) else { /* Can be a localized value * subject to deletion. */ PL_tmps_stack[++PL_tmps_ix] = *mark; - (void)SvREFCNT_inc(*mark); + SvREFCNT_inc_void(*mark); } } else { /* Should not happen? */ @@ -2580,7 +2583,7 @@ PP(pp_leavesublv) else { /* Can be a localized value subject to deletion. */ PL_tmps_stack[++PL_tmps_ix] = *mark; - (void)SvREFCNT_inc(*mark); + SvREFCNT_inc_void(*mark); } } } @@ -2816,7 +2819,7 @@ try_autoload: AvREIFY_on(av); } cx->blk_sub.savearray = GvAV(PL_defgv); - GvAV(PL_defgv) = (AV*)SvREFCNT_inc(av); + GvAV(PL_defgv) = (AV*)SvREFCNT_inc_simple(av); CX_CURPAD_SAVE(cx->blk_sub); cx->blk_sub.argarray = av; ++MARK; @@ -2951,7 +2954,7 @@ PP(pp_aelem) sv_upgrade(lv, SVt_PVLV); LvTYPE(lv) = 'y'; sv_magic(lv, NULL, PERL_MAGIC_defelem, NULL, 0); - LvTARG(lv) = SvREFCNT_inc(av); + LvTARG(lv) = SvREFCNT_inc_simple(av); LvTARGOFF(lv) = elem; LvTARGLEN(lv) = 1; PUSHs(lv);