Convert some SvREFCNT_dec's to SvREFCNT_dec_NN's for efficiency
authorSteffen Mueller <smueller@cpan.org>
Sun, 9 Dec 2012 16:26:13 +0000 (17:26 +0100)
committerSteffen Mueller <smueller@cpan.org>
Sun, 9 Dec 2012 21:56:49 +0000 (22:56 +0100)
op.c
pad.c
pp_hot.c
sv.c

diff --git a/op.c b/op.c
index 766ca19..6240225 100644 (file)
--- a/op.c
+++ b/op.c
@@ -800,7 +800,7 @@ Perl_op_clear(pTHX_ OP *o)
 #endif
            if (still_valid) {
                int try_downgrade = SvREFCNT(gv) == 2;
-               SvREFCNT_dec(gv);
+               SvREFCNT_dec_NN(gv);
                if (try_downgrade)
                    gv_try_downgrade(gv);
            }
@@ -1387,7 +1387,7 @@ Perl_scalarvoid(pTHX_ OP *o)
                                                       PERL_PV_PRETTY_DUMP
                                                       | PERL_PV_ESCAPE_NOCLEAR
                                                       | PERL_PV_ESCAPE_UNI_DETECT));
-                       SvREFCNT_dec(dsv);
+                       SvREFCNT_dec_NN(dsv);
                    }
                }
                else if (SvOK(sv)) {
@@ -1803,7 +1803,7 @@ S_finalize_op(pTHX_ OP* o)
            lexname = newSVpvn_share(key,
                SvUTF8(sv) ? -(I32)keylen : (I32)keylen,
                0);
-           SvREFCNT_dec(sv);
+           SvREFCNT_dec_NN(sv);
            *svp = lexname;
        }
 
@@ -7286,7 +7286,7 @@ Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
            &PadARRAY(PadlistARRAY(CvPADLIST(outcv))[CvDEPTH(outcv)])[pax];
        if (reusable) cv_clone_into(clonee, *spot);
        else *spot = cv_clone(clonee);
-       SvREFCNT_dec(clonee);
+       SvREFCNT_dec_NN(clonee);
        cv = *spot;
        SvPADMY_on(cv);
     }
@@ -7855,7 +7855,7 @@ Perl_newXS_len_flags(pTHX_ const char *name, STRLEN len,
                                         ),
                                         cv, const_svp);
                 }
-                SvREFCNT_dec(cv);
+                SvREFCNT_dec_NN(cv);
                 cv = NULL;
             }
         }
@@ -9011,7 +9011,7 @@ Perl_ck_glob(pTHX_ OP *o)
     sv_setiv(GvSVn(gv),PL_glob_index++);
 #endif
     op_append_elem(OP_GLOB, o, newGVOP(OP_GV, 0, gv));
-    SvREFCNT_dec(gv); /* newGVOP increased it */
+    SvREFCNT_dec_NN(gv); /* newGVOP increased it */
     scalarkids(o);
     return o;
 }
diff --git a/pad.c b/pad.c
index dee5c1c..549d3f5 100644 (file)
--- a/pad.c
+++ b/pad.c
@@ -196,7 +196,7 @@ sv_eq_pvn_flags(pTHX_ const SV *sv, const char* pv, const STRLEN pvlen, const U3
                   sv_recode_to_utf8(svrecode, PL_encoding);
                   pv1      = SvPV_const(svrecode, cur1);
              }
-              SvREFCNT_dec(svrecode);
+              SvREFCNT_dec_NN(svrecode);
         }
         if (flags & SVf_UTF8)
             return (bytes_cmp_utf8(
@@ -427,7 +427,7 @@ Perl_cv_undef(pTHX_ CV *cv)
 
                        if (SvREFCNT(comppad) < 2) { /* allow for /(?{ sub{} })/  */
                            curpad[ix] = NULL;
-                           SvREFCNT_dec(innercv);
+                           SvREFCNT_dec_NN(innercv);
                            inner_rc--;
                        }
 
@@ -457,7 +457,7 @@ Perl_cv_undef(pTHX_ CV *cv)
                    PL_comppad = NULL;
                    PL_curpad = NULL;
                }
-               SvREFCNT_dec(sv);
+               SvREFCNT_dec_NN(sv);
            }
        }
        {
@@ -830,7 +830,7 @@ Perl_pad_add_anon(pTHX_ CV* func, I32 optype)
     if (CvOUTSIDE(func) && SvTYPE(func) == SVt_PVCV) {
        assert(!CvWEAKOUTSIDE(func));
        CvWEAKOUTSIDE_on(func);
-       SvREFCNT_dec(CvOUTSIDE(func));
+       SvREFCNT_dec_NN(CvOUTSIDE(func));
     }
     return ix;
 }
@@ -2164,7 +2164,7 @@ S_cv_clone(pTHX_ CV *proto, CV *cv, CV *outside)
         */
        SV* const const_sv = op_const_sv(CvSTART(cv), cv);
        if (const_sv) {
-           SvREFCNT_dec(cv);
+           SvREFCNT_dec_NN(cv);
             /* For this calling case, op_const_sv returns a *copy*, which we
                donate to newCONSTSUB. Yes, this is ugly, and should be killed.
                Need to fix how lib/constant.pm works to eliminate this.  */
index 599b759..5998110 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -184,7 +184,7 @@ PP(pp_sassign)
                */
                SvRV_set(right, MUTABLE_SV(newCONSTSUB(GvSTASH(left), NULL,
                                                      SvRV(cv))));
-               SvREFCNT_dec(cv);
+               SvREFCNT_dec_NN(cv);
                LEAVE_with_name("sassign_coderef");
            } else {
                /* What can happen for the corner case *{"BONK"} = \&{"BONK"};
@@ -207,7 +207,7 @@ PP(pp_sassign)
                assert(CvFLAGS(source) & CVf_CONST);
 
                SvREFCNT_inc_void(source);
-               SvREFCNT_dec(upgraded);
+               SvREFCNT_dec_NN(upgraded);
                SvRV_set(right, MUTABLE_SV(source));
            }
        }
@@ -1291,12 +1291,12 @@ PP(pp_qr)
     cvp = &( ReANY((REGEXP *)SvRV(rv))->qr_anoncv);
     if ((cv = *cvp) && CvCLONE(*cvp)) {
        *cvp = cv_clone(cv);
-       SvREFCNT_dec(cv);
+       SvREFCNT_dec_NN(cv);
     }
 
     if (pkg) {
        HV *const stash = gv_stashsv(pkg, GV_ADD);
-       SvREFCNT_dec(pkg);
+       SvREFCNT_dec_NN(pkg);
        (void)sv_bless(rv, stash);
     }
 
@@ -1890,7 +1890,7 @@ PP(pp_helem)
            sv_upgrade(lv, SVt_PVLV);
            LvTYPE(lv) = 'y';
            sv_magic(lv, key2 = newSVsv(keysv), PERL_MAGIC_defelem, NULL, 0);
-           SvREFCNT_dec(key2); /* sv_magic() increments refcount */
+           SvREFCNT_dec_NN(key2);      /* sv_magic() increments refcount */
            LvTARG(lv) = SvREFCNT_inc_simple(hv);
            LvTARGLEN(lv) = 1;
            PUSHs(lv);
@@ -1964,7 +1964,7 @@ PP(pp_iter)
              * completely new SV for closures/references to work as
              * they used to */
             *itersvp = newSVsv(cur);
-            SvREFCNT_dec(oldsv);
+            SvREFCNT_dec_NN(oldsv);
         }
         if (strEQ(SvPVX_const(cur), max))
             sv_setiv(cur, 0); /* terminate next time */
@@ -1991,7 +1991,7 @@ PP(pp_iter)
             * completely new SV for closures/references to work as they
             * used to */
            *itersvp = newSViv(cur);
-           SvREFCNT_dec(oldsv);
+           SvREFCNT_dec_NN(oldsv);
        }
 
        if (cur == IV_MAX) {
@@ -2614,7 +2614,7 @@ PP(pp_leavesub)
                    sv = SvREFCNT_inc(TOPs);    /* FREETMPS could clobber it */
                    FREETMPS;
                    *MARK = sv_mortalcopy(sv);
-                   SvREFCNT_dec(sv);
+                   SvREFCNT_dec_NN(sv);
                }
            }
            else if (SvTEMP(TOPs) && SvREFCNT(TOPs) == 1
diff --git a/sv.c b/sv.c
index 37cd39a..16585ea 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -477,7 +477,7 @@ do_clean_objs(pTHX_ SV *const ref)
            } else {
                SvROK_off(ref);
                SvRV_set(ref, NULL);
-               SvREFCNT_dec(target);
+               SvREFCNT_dec_NN(target);
            }
        }
     }
@@ -505,27 +505,27 @@ do_clean_named_objs(pTHX_ SV *const sv)
        DEBUG_D((PerlIO_printf(Perl_debug_log,
                "Cleaning named glob SV object:\n "), sv_dump(obj)));
        GvSV(sv) = NULL;
-       SvREFCNT_dec(obj);
+       SvREFCNT_dec_NN(obj);
     }
     if ( ((obj = MUTABLE_SV(GvAV(sv)) )) && SvOBJECT(obj)) {
        DEBUG_D((PerlIO_printf(Perl_debug_log,
                "Cleaning named glob AV object:\n "), sv_dump(obj)));
        GvAV(sv) = NULL;
-       SvREFCNT_dec(obj);
+       SvREFCNT_dec_NN(obj);
     }
     if ( ((obj = MUTABLE_SV(GvHV(sv)) )) && SvOBJECT(obj)) {
        DEBUG_D((PerlIO_printf(Perl_debug_log,
                "Cleaning named glob HV object:\n "), sv_dump(obj)));
        GvHV(sv) = NULL;
-       SvREFCNT_dec(obj);
+       SvREFCNT_dec_NN(obj);
     }
     if ( ((obj = MUTABLE_SV(GvCV(sv)) )) && SvOBJECT(obj)) {
        DEBUG_D((PerlIO_printf(Perl_debug_log,
                "Cleaning named glob CV object:\n "), sv_dump(obj)));
        GvCV_set(sv, NULL);
-       SvREFCNT_dec(obj);
+       SvREFCNT_dec_NN(obj);
     }
-    SvREFCNT_dec(sv); /* undo the inc above */
+    SvREFCNT_dec_NN(sv); /* undo the inc above */
 }
 
 /* clear any IO slots in a GV which hold objects (except stderr, defout);
@@ -546,9 +546,9 @@ do_clean_named_io_objs(pTHX_ SV *const sv)
        DEBUG_D((PerlIO_printf(Perl_debug_log,
                "Cleaning named glob IO object:\n "), sv_dump(obj)));
        GvIOp(sv) = NULL;
-       SvREFCNT_dec(obj);
+       SvREFCNT_dec_NN(obj);
     }
-    SvREFCNT_dec(sv); /* undo the inc above */
+    SvREFCNT_dec_NN(sv); /* undo the inc above */
 }
 
 /* Void wrapper to pass to visit() */
@@ -607,7 +607,7 @@ do_clean_all(pTHX_ SV *const sv)
     }
     DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) ));
     SvFLAGS(sv) |= SVf_BREAK;
-    SvREFCNT_dec(sv);
+    SvREFCNT_dec_NN(sv);
 }
 
 /*
@@ -4948,7 +4948,7 @@ Perl_sv_force_normal_flags(pTHX_ SV *const sv, const U32 flags)
        SvANY(temp) = temp_p;
        temp->sv_u.svu_rx = (regexp *)temp_p;
 
-       SvREFCNT_dec(temp);
+       SvREFCNT_dec_NN(temp);
     }
     else if (SvVOK(sv)) sv_unmagic(sv, PERL_MAGIC_vstring);
 }
@@ -5539,7 +5539,7 @@ Perl_sv_rvweaken(pTHX_ SV *const sv)
     tsv = SvRV(sv);
     Perl_sv_add_backref(aTHX_ tsv, sv);
     SvWEAKREF_on(sv);
-    SvREFCNT_dec(tsv);
+    SvREFCNT_dec_NN(tsv);
     return sv;
 }
 
@@ -5835,7 +5835,7 @@ Perl_sv_kill_backrefs(pTHX_ SV *const sv, AV *const av)
     }
     if (is_array) {
        AvFILLp(av) = -1;
-       SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
+       SvREFCNT_dec_NN(av); /* remove extra count added by sv_add_backref() */
     }
     return;
 }
@@ -6052,7 +6052,7 @@ S_anonymise_cv_maybe(pTHX_ GV *gv, CV* cv)
                     : newSVpvn_flags( "__ANON__", 8, 0 );
     sv_catpvs(gvname, "::__ANON__");
     anongv = gv_fetchsv(gvname, GV_ADDMULTI, SVt_PVCV);
-    SvREFCNT_dec(gvname);
+    SvREFCNT_dec_NN(gvname);
 
     CvANON_on(cv);
     CvCVGV_RC_on(cv);
@@ -6488,7 +6488,7 @@ S_curse(pTHX_ SV * const sv, const bool check_refcnt) {
                    SvRV_set(tmpref, NULL);
                    SvROK_off(tmpref);
                }
-               SvREFCNT_dec(tmpref);
+               SvREFCNT_dec_NN(tmpref);
            }
          }
        } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
@@ -7379,7 +7379,7 @@ Perl_sv_eq_flags(pTHX_ SV *sv1, SV *sv2, const U32 flags)
              }
              /* Now both are in UTF-8. */
              if (cur1 != cur2) {
-                  SvREFCNT_dec(svrecode);
+                  SvREFCNT_dec_NN(svrecode);
                   return FALSE;
              }
         }
@@ -9804,7 +9804,7 @@ Perl_sv_unref_flags(pTHX_ SV *const ref, const U32 flags)
     /* You can't have a || SvREADONLY(target) here, as $a = $$a, where $a was
        assigned to as BEGIN {$a = \"Foo"} will fail.  */
     if (SvREFCNT(target) != 1 || (flags & SV_IMMEDIATE_UNREF))
-       SvREFCNT_dec(target);
+       SvREFCNT_dec_NN(target);
     else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
        sv_2mortal(target);     /* Schedule for freeing later */
 }
@@ -13848,7 +13848,7 @@ S_unreferenced_to_tmp_stack(pTHX_ AV *const unreferenced)
        } while (++svp <= last);
        AvREAL_off(unreferenced);
     }
-    SvREFCNT_dec(unreferenced);
+    SvREFCNT_dec_NN(unreferenced);
 }
 
 void
@@ -14197,7 +14197,7 @@ Perl_varname(pTHX_ const GV *const gv, const char gvtype, PADOFFSET targ,
        Perl_sv_catpvf(aTHX_ name, "{%s}",
            pv_pretty(sv, SvPVX_const(keyname), SvCUR(keyname), 32, NULL, NULL,
                    PERL_PV_PRETTY_DUMP | PERL_PV_ESCAPE_UNI_DETECT ));
-       SvREFCNT_dec(sv);
+       SvREFCNT_dec_NN(sv);
     }
     else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
        *SvPVX(name) = '$';