X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Plugin.xs;h=c16dfba3ed652bc61b82192036b858183fc49692;hb=d4db715e455063f957068da7ac3bc548935f9ff5;hp=af917b7d7e1ff5dc07010c033d8a95df5dccc248;hpb=5162655c3a86217e485be50e4f5266b7ff713d70;p=perl%2Fmodules%2Fre-engine-Plugin.git diff --git a/Plugin.xs b/Plugin.xs index af917b7..c16dfba 100644 --- a/Plugin.xs +++ b/Plugin.xs @@ -18,6 +18,7 @@ typedef struct { SV *comp; SV *exec; + SV *free; } xsh_hints_user_t; static SV *rep_validate_callback(SV *code) { @@ -34,6 +35,7 @@ static SV *rep_validate_callback(SV *code) { static void xsh_hints_user_init(pTHX_ xsh_hints_user_t *hv, xsh_hints_user_t *v) { hv->comp = rep_validate_callback(v->comp); hv->exec = rep_validate_callback(v->exec); + hv->free = rep_validate_callback(v->free); return; } @@ -43,6 +45,7 @@ static void xsh_hints_user_init(pTHX_ xsh_hints_user_t *hv, xsh_hints_user_t *v) static void xsh_hints_user_clone(pTHX_ xsh_hints_user_t *nv, xsh_hints_user_t *ov, CLONE_PARAMS *params) { nv->comp = xsh_dup_inc(ov->comp, params); nv->exec = xsh_dup_inc(ov->exec, params); + nv->free = xsh_dup_inc(ov->free, params); return; } @@ -52,6 +55,7 @@ static void xsh_hints_user_clone(pTHX_ xsh_hints_user_t *nv, xsh_hints_user_t *o static void xsh_hints_user_deinit(pTHX_ xsh_hints_user_t *hv) { SvREFCNT_dec(hv->comp); SvREFCNT_dec(hv->exec); + SvREFCNT_dec(hv->free); return; } @@ -209,7 +213,6 @@ 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, XSH_PACKAGE, (void *) re); @@ -249,6 +252,12 @@ Plugin_comp(pTHX_ const SV * const pattern, const U32 flags) SvREFCNT_inc_simple_void_NN(h->exec); } + /* Same goes for the free callback, if there's one. */ + if (h->free) { + re->cb_free = h->free; + SvREFCNT_inc_simple_void_NN(h->free); + } + re->cb_num_capture_buff_FETCH = NULL; re->cb_num_capture_buff_STORE = NULL; re->cb_num_capture_buff_LENGTH = NULL; @@ -360,6 +369,8 @@ Plugin_free(pTHX_ REGEXP * const RX) { struct regexp *rx; re__engine__Plugin self; + SV *callback; + dSP; if (PL_dirty) return; @@ -367,23 +378,6 @@ Plugin_free(pTHX_ REGEXP * const RX) rx = rxREGEXP(RX); SELF_FROM_PPRIVATE(self, rx->pprivate); - SvREFCNT_dec(self->pattern); - SvREFCNT_dec(self->str); - SvREFCNT_dec(self->stash); - - 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; - callback = self->cb_free; if (callback) { @@ -400,8 +394,24 @@ Plugin_free(pTHX_ REGEXP * const RX) FREETMPS; LEAVE; } + + SvREFCNT_dec(self->pattern); + SvREFCNT_dec(self->str); + SvREFCNT_dec(self->stash); + + 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); + + SvREFCNT_dec(rx->pprivate); + return; -*/ } void * @@ -693,6 +703,16 @@ PPCODE: } XSRETURN(0); +void +_free(re::engine::Plugin self, ...) +PPCODE: + if (items > 1) { + SvREFCNT_dec(self->cb_free); + self->cb_free = ST(1); + SvREFCNT_inc_simple_void(self->cb_free); + } + XSRETURN(0); + void _num_capture_buff_FETCH(re::engine::Plugin self, ...) PPCODE: @@ -724,12 +744,13 @@ PPCODE: XSRETURN(0); SV * -_tag(SV *comp, SV *exec) +_tag(SV *comp, SV *exec, SV *free) PREINIT: xsh_hints_user_t arg; CODE: arg.comp = comp; arg.exec = exec; + arg.free = free; RETVAL = xsh_hints_tag(&arg); OUTPUT: RETVAL