]> git.vpit.fr Git - perl/modules/re-engine-Plugin.git/commitdiff
SvREFCNT_{inc,dec} overhaul, fixing a couple of leaks
authorVincent Pit <vince@profvince.com>
Tue, 31 Aug 2010 11:17:47 +0000 (13:17 +0200)
committerVincent Pit <vince@profvince.com>
Fri, 4 Feb 2011 20:53:46 +0000 (21:53 +0100)
Plugin.xs

index 036185f6faa97917ceb3660a746422aa0425a901..04557561946bfad91e7bce3bef0cd3bbd72849a9 100644 (file)
--- a/Plugin.xs
+++ b/Plugin.xs
@@ -113,7 +113,7 @@ STATIC SV *rep_clone(pTHX_ SV *sv, tTHX owner) {
   SvREFCNT_dec(stashes);
  }
 
   SvREFCNT_dec(stashes);
  }
 
- return SvREFCNT_inc(dupsv);
+ return SvREFCNT_inc_simple(dupsv);
 }
 
 STATIC void rep_ptable_clone(pTHX_ ptable_ent *ent, void *ud_) {
 }
 
 STATIC void rep_ptable_clone(pTHX_ ptable_ent *ent, void *ud_) {
@@ -126,9 +126,9 @@ STATIC void rep_ptable_clone(pTHX_ ptable_ent *ent, void *ud_) {
 
  h2        = PerlMemShared_malloc(sizeof *h2);
  h2->comp  = rep_clone(h1->comp, ud->owner);
 
  h2        = PerlMemShared_malloc(sizeof *h2);
  h2->comp  = rep_clone(h1->comp, ud->owner);
- SvREFCNT_inc(h2->comp);
+ SvREFCNT_inc_simple_void(h2->comp);
  h2->exec  = rep_clone(h1->exec, ud->owner);
  h2->exec  = rep_clone(h1->exec, ud->owner);
- SvREFCNT_inc(h2->exec);
+ SvREFCNT_inc_simple_void(h2->exec);
 #if REP_WORKAROUND_REQUIRE_PROPAGATION
  h2->cxreq = h1->cxreq;
 #endif
 #if REP_WORKAROUND_REQUIRE_PROPAGATION
  h2->cxreq = h1->cxreq;
 #endif
@@ -269,7 +269,7 @@ Plugin_comp(pTHX_ SV * const pattern, U32 flags)
 
     /* Our blessed object */
     obj = newSV(0);
 
     /* Our blessed object */
     obj = newSV(0);
-    SvREFCNT_inc(obj);
+    SvREFCNT_inc_simple_void_NN(obj);
     Newxz(re, 1, struct replug);
     sv_setref_pv(obj, "re::engine::Plugin", (void*)re);
 
     Newxz(re, 1, struct replug);
     sv_setref_pv(obj, "re::engine::Plugin", (void*)re);
 
@@ -301,7 +301,7 @@ Plugin_comp(pTHX_ SV * const pattern, U32 flags)
 
     /* Store the pattern for ->pattern */
     re->pattern = (SV*)pattern;
 
     /* Store the pattern for ->pattern */
     re->pattern = (SV*)pattern;
-    SvREFCNT_inc(re->pattern);
+    SvREFCNT_inc_simple_void(re->pattern);
 
     /* If there's an exec callback, store it into the private object so
      * that it will be the one to be called, even if the engine changes
 
     /* If there's an exec callback, store it into the private object so
      * that it will be the one to be called, even if the engine changes
@@ -354,8 +354,9 @@ Plugin_exec(pTHX_ REGEXP * const RX, char *stringarg, char *strend,
         SV *ret;
 
         /* Store the current str for ->str */
         SV *ret;
 
         /* Store the current str for ->str */
-        self->str = (SV*)sv;
-        SvREFCNT_inc(self->str);
+        SvREFCNT_dec(self->str);
+        self->str = sv;
+        SvREFCNT_inc_simple_void(self->str);
 
         ENTER;
         SAVETMPS;
 
         ENTER;
         SAVETMPS;
@@ -703,8 +704,9 @@ void
 stash(re::engine::Plugin self, ...)
 PPCODE:
     if (items > 1) {
 stash(re::engine::Plugin self, ...)
 PPCODE:
     if (items > 1) {
+        SvREFCNT_dec(self->stash);
         self->stash = ST(1);
         self->stash = ST(1);
-        SvREFCNT_inc(self->stash);
+        SvREFCNT_inc_simple_void(self->stash);
         XSRETURN_EMPTY;
     } else {
         XPUSHs(self->stash);
         XSRETURN_EMPTY;
     } else {
         XPUSHs(self->stash);
@@ -758,7 +760,7 @@ PPCODE:
     if (items > 1) {
         SvREFCNT_dec(self->cb_exec);
         self->cb_exec = ST(1);
     if (items > 1) {
         SvREFCNT_dec(self->cb_exec);
         self->cb_exec = ST(1);
-        SvREFCNT_inc(self->cb_exec);
+        SvREFCNT_inc_simple_void(self->cb_exec);
     }
 
 void
     }
 
 void
@@ -767,7 +769,7 @@ PPCODE:
     if (items > 1) {
         SvREFCNT_dec(self->cb_num_capture_buff_FETCH);
         self->cb_num_capture_buff_FETCH = ST(1);
     if (items > 1) {
         SvREFCNT_dec(self->cb_num_capture_buff_FETCH);
         self->cb_num_capture_buff_FETCH = ST(1);
-        SvREFCNT_inc(self->cb_num_capture_buff_FETCH);
+        SvREFCNT_inc_simple_void(self->cb_num_capture_buff_FETCH);
     }
 
 void
     }
 
 void
@@ -776,7 +778,7 @@ PPCODE:
     if (items > 1) {
         SvREFCNT_dec(self->cb_num_capture_buff_STORE);
         self->cb_num_capture_buff_STORE = ST(1);
     if (items > 1) {
         SvREFCNT_dec(self->cb_num_capture_buff_STORE);
         self->cb_num_capture_buff_STORE = ST(1);
-        SvREFCNT_inc(self->cb_num_capture_buff_STORE);
+        SvREFCNT_inc_simple_void(self->cb_num_capture_buff_STORE);
     }
 
 void
     }
 
 void
@@ -785,7 +787,7 @@ PPCODE:
     if (items > 1) {
         SvREFCNT_dec(self->cb_num_capture_buff_LENGTH);
         self->cb_num_capture_buff_LENGTH = ST(1);
     if (items > 1) {
         SvREFCNT_dec(self->cb_num_capture_buff_LENGTH);
         self->cb_num_capture_buff_LENGTH = ST(1);
-        SvREFCNT_inc(self->cb_num_capture_buff_LENGTH);
+        SvREFCNT_inc_simple_void(self->cb_num_capture_buff_LENGTH);
     }
 
 SV *
     }
 
 SV *