]> git.vpit.fr Git - perl/modules/re-engine-Plugin.git/blobdiff - Plugin.xs
Stop leaking the underlying re::engine::Plugin object
[perl/modules/re-engine-Plugin.git] / Plugin.xs
index 10a01ae68abc7a8b54dcc6b896eaf333a3e8f9ea..da33ce2ff9050a130fe6f6d79d58d8b3b6262814 100644 (file)
--- a/Plugin.xs
+++ b/Plugin.xs
@@ -75,10 +75,6 @@ static void xsh_hints_user_deinit(pTHX_ xsh_hints_user_t *hv) {
 
 /* --- Custom regexp engine ------------------------------------------------ */
 
-#define GET_SELF_FROM_PPRIVATE(pprivate) \
- re__engine__Plugin self;                \
- SELF_FROM_PPRIVATE(self,pprivate);
-
 /* re__engine__Plugin self; SELF_FROM_PPRIVATE(self,rx->pprivate) */
 #define SELF_FROM_PPRIVATE(self, pprivate) \
  if (sv_isobject(pprivate)) {              \
@@ -213,9 +209,8 @@ Plugin_comp(pTHX_ const SV * const pattern, const U32 flags)
 
  /* Our blessed object */
  obj = newSV(0);
- SvREFCNT_inc_simple_void_NN(obj);
  Newxz(re, 1, struct replug);
- sv_setref_pv(obj, "re::engine::Plugin", (void *) re);
+ sv_setref_pv(obj, XSH_PACKAGE, (void *) re);
 
  newREGEXP(RX);
  rx = rxREGEXP(RX);
@@ -285,14 +280,16 @@ Plugin_exec(pTHX_ REGEXP * const RX, char *stringarg, char *strend,
             char *strbeg, REP_ENG_EXEC_MINEND_TYPE minend,
             SV *sv, void *data, U32 flags)
 {
- dSP;
+ struct regexp *rx;
+ re__engine__Plugin self;
  I32 matched;
- struct regexp *rx = rxREGEXP(RX);
 
- GET_SELF_FROM_PPRIVATE(rx->pprivate);
+ rx = rxREGEXP(RX);
+ SELF_FROM_PPRIVATE(self, rx->pprivate);
 
  if (self->cb_exec) {
   SV *ret;
+  dSP;
 
   /* Store the current str for ->str */
   SvREFCNT_dec(self->str);
@@ -371,6 +368,7 @@ Plugin_free(pTHX_ REGEXP * const RX)
 
  SvREFCNT_dec(self->pattern);
  SvREFCNT_dec(self->str);
+ SvREFCNT_dec(self->stash);
 
  SvREFCNT_dec(self->cb_exec);
 
@@ -379,8 +377,11 @@ Plugin_free(pTHX_ REGEXP * const RX)
  SvREFCNT_dec(self->cb_num_capture_buff_LENGTH);
 
  self->rx = NULL;
+
  Safefree(self);
 
+ SvREFCNT_dec(rx->pprivate);
+
 /*
  dSP;
  SV *callback;
@@ -420,16 +421,19 @@ void
 Plugin_numbered_buff_FETCH(pTHX_ REGEXP * const RX, const I32 paren,
                            SV * const sv)
 {
dSP;
I32 items;
struct regexp *rx;
re__engine__Plugin self;
  SV *callback;
- struct regexp *rx = rxREGEXP(RX);
 
- GET_SELF_FROM_PPRIVATE(rx->pprivate);
+ rx = rxREGEXP(RX);
+ SELF_FROM_PPRIVATE(self, rx->pprivate);
 
  callback = self->cb_num_capture_buff_FETCH;
 
  if (callback) {
+  I32 items;
+  dSP;
+
   ENTER;
   SAVETMPS;
 
@@ -461,15 +465,18 @@ void
 Plugin_numbered_buff_STORE(pTHX_ REGEXP * const RX, const I32 paren,
                            SV const * const value)
 {
- dSP;
+ struct regexp *rx;
+ re__engine__Plugin self;
  SV *callback;
- struct regexp *rx = rxREGEXP(RX);
 
- GET_SELF_FROM_PPRIVATE(rx->pprivate);
+ rx = rxREGEXP(RX);
+ SELF_FROM_PPRIVATE(self, rx->pprivate);
 
  callback = self->cb_num_capture_buff_STORE;
 
  if (callback) {
+  dSP;
+
   ENTER;
   SAVETMPS;
 
@@ -491,16 +498,18 @@ I32
 Plugin_numbered_buff_LENGTH(pTHX_ REGEXP * const RX, const SV * const sv,
                             const I32 paren)
 {
- dSP;
+ struct regexp *rx;
+ re__engine__Plugin self;
  SV *callback;
- struct regexp *rx = rxREGEXP(RX);
 
- GET_SELF_FROM_PPRIVATE(rx->pprivate);
+ rx = rxREGEXP(RX);
+ SELF_FROM_PPRIVATE(self, rx->pprivate);
 
  callback = self->cb_num_capture_buff_LENGTH;
 
  if (callback) {
   IV ret;
+  dSP;
 
   ENTER;
   SAVETMPS;
@@ -546,7 +555,7 @@ Plugin_package(pTHX_ REGEXP * const RX)
 {
  PERL_UNUSED_ARG(RX);
 
- return newSVpvs("re::engine::Plugin");
+ return newSVpvs(XSH_PACKAGE);
 }
 
 static void xsh_user_global_setup(pTHX) {
@@ -584,11 +593,13 @@ void
 pattern(re::engine::Plugin self, ...)
 PPCODE:
  XPUSHs(self->pattern);
+ XSRETURN(1);
 
 void
 str(re::engine::Plugin self, ...)
 PPCODE:
  XPUSHs(self->str);
+ XSRETURN(1);
 
 void
 mod(re::engine::Plugin self)
@@ -626,6 +637,7 @@ PPCODE:
   XSRETURN_EMPTY;
  } else {
   XPUSHs(self->stash);
+  XSRETURN(1);
  }
 
 void
@@ -640,6 +652,7 @@ PPCODE:
   } else {
    XPUSHs(sv_2mortal(&PL_sv_undef));
   }
+  XSRETURN(1);
  }
 
 void
@@ -654,6 +667,7 @@ PPCODE:
   } else {
    XPUSHs(sv_2mortal(&PL_sv_undef));
   }
+  XSRETURN(1);
  }
 
 void
@@ -668,6 +682,7 @@ PPCODE:
   } else {
    XPUSHs(sv_2mortal(&PL_sv_undef));
   }
+  XSRETURN(1);
  }
 
 void
@@ -678,6 +693,7 @@ PPCODE:
   self->cb_exec = ST(1);
   SvREFCNT_inc_simple_void(self->cb_exec);
  }
+ XSRETURN(0);
 
 void
 _num_capture_buff_FETCH(re::engine::Plugin self, ...)
@@ -687,6 +703,7 @@ PPCODE:
   self->cb_num_capture_buff_FETCH = ST(1);
   SvREFCNT_inc_simple_void(self->cb_num_capture_buff_FETCH);
  }
+ XSRETURN(0);
 
 void
 _num_capture_buff_STORE(re::engine::Plugin self, ...)
@@ -696,6 +713,7 @@ PPCODE:
   self->cb_num_capture_buff_STORE = ST(1);
   SvREFCNT_inc_simple_void(self->cb_num_capture_buff_STORE);
  }
+ XSRETURN(0);
 
 void
 _num_capture_buff_LENGTH(re::engine::Plugin self, ...)
@@ -705,6 +723,7 @@ PPCODE:
   self->cb_num_capture_buff_LENGTH = ST(1);
   SvREFCNT_inc_simple_void(self->cb_num_capture_buff_LENGTH);
  }
+ XSRETURN(0);
 
 SV *
 _tag(SV *comp, SV *exec)
@@ -721,3 +740,4 @@ void
 ENGINE()
 PPCODE:
  XPUSHs(sv_2mortal(newSViv(PTR2IV(&engine_plugin))));
+ XSRETURN(1);