]> git.vpit.fr Git - perl/modules/re-engine-Plugin.git/commitdiff
Correctly free the re::engine::Plugin private object
authorVincent Pit <vince@profvince.com>
Sat, 29 Aug 2009 11:52:42 +0000 (13:52 +0200)
committerVincent Pit <vince@profvince.com>
Sat, 29 Aug 2009 11:52:42 +0000 (13:52 +0200)
Plugin.xs

index 3e9918b7856a0c3d6bd0d0bcf64b2f8b675b2b29..28558a73b42c028e08e81a67e12e7c52797bfae3 100644 (file)
--- a/Plugin.xs
+++ b/Plugin.xs
@@ -311,12 +311,25 @@ Plugin_comp(pTHX_ SV * const pattern, U32 flags)
     re->pattern = (SV*)pattern;
     SvREFCNT_inc(re->pattern);
 
+    h = rep_hint();
+
+    /* 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
+     * in between */
+    if (h && h->exec) {
+        re->cb_exec = h->exec;
+       SvREFCNT_inc_simple_void_NN(h->exec);
+    }
+
+    re->cb_num_capture_buff_FETCH  = NULL;
+    re->cb_num_capture_buff_STORE  = NULL;
+    re->cb_num_capture_buff_LENGTH = NULL;
+
     /*
      * Call our callback function if one was defined, if not we've
      * already set up all the stuff we're going to to need for
      * subsequent exec and other calls
      */
-    h = rep_hint();
     if (h && h->comp) {
         ENTER;    
         SAVETMPS;
@@ -331,14 +344,6 @@ Plugin_comp(pTHX_ SV * const pattern, U32 flags)
         LEAVE;
     }
 
-    /* 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
-     * in between */
-    if (h && h->exec) {
-        re->cb_exec = h->exec;
-       SvREFCNT_inc_simple_void_NN(h->exec);
-    }
-
     /* If any of the comp-time accessors were called we'll have to
      * update the regexp struct with the new info.
      */
@@ -416,11 +421,24 @@ Plugin_checkstr(pTHX_ REGEXP * const RX)
 void
 Plugin_free(pTHX_ REGEXP * const RX)
 {
-    PERL_UNUSED_ARG(RX);
+    struct regexp *rx = rxREGEXP(RX);
+    GET_SELF_FROM_PPRIVATE(rx->pprivate);
+
+    SvREFCNT_dec(self->pattern);
+    SvREFCNT_dec(self->str);
+
+    SvREFCNT_dec(self->cb_exec);
+
+    SvREFCNT_dec(self->cb_num_capture_buff_FETCH);
+    SvREFCNT_dec(self->cb_num_capture_buff_STORE);
+    SvREFCNT_dec(self->cb_num_capture_buff_LENGTH);
+
+    self->rx = NULL;
+    Safefree(self);
+
 /*
     dSP;
     SV * callback;
-    GET_SELF_FROM_PPRIVATE(rx->pprivate);
 
     callback = self->cb_free;