X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Plugin.xs;h=3abd900c12e2a74beaa3d6795028307c44fe0160;hb=bc365867d2883a69972ef82adf4b19d0680e43aa;hp=28558a73b42c028e08e81a67e12e7c52797bfae3;hpb=1fdbd413b447b3c707a0396c820ea95e3c0ee038;p=perl%2Fmodules%2Fre-engine-Plugin.git diff --git a/Plugin.xs b/Plugin.xs index 28558a7..3abd900 100644 --- a/Plugin.xs +++ b/Plugin.xs @@ -271,6 +271,10 @@ Plugin_comp(pTHX_ SV * const pattern, U32 flags) re__engine__Plugin re; const rep_hint_t *h; + h = rep_hint(); + if (!h) /* This looks like a pragma leak. Apply the default behaviour */ + return re_compile(pattern, flags); + /* exp/xend version of the pattern & length */ STRLEN plen; char* exp = SvPV((SV*)pattern, plen); @@ -311,12 +315,10 @@ 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) { + if (h->exec) { re->cb_exec = h->exec; SvREFCNT_inc_simple_void_NN(h->exec); } @@ -325,12 +327,10 @@ Plugin_comp(pTHX_ SV * const pattern, U32 flags) 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 + /* 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 - */ - if (h && h->comp) { + * subsequent exec and other calls */ + if (h->comp) { ENTER; SAVETMPS; @@ -768,10 +768,20 @@ PPCODE: } } +void +_exec(re::engine::Plugin self, ...) +PPCODE: + if (items > 1) { + SvREFCNT_dec(self->cb_exec); + self->cb_exec = ST(1); + SvREFCNT_inc(self->cb_exec); + } + void _num_capture_buff_FETCH(re::engine::Plugin self, ...) PPCODE: 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); } @@ -780,6 +790,7 @@ void _num_capture_buff_STORE(re::engine::Plugin self, ...) PPCODE: 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); } @@ -788,6 +799,7 @@ void _num_capture_buff_LENGTH(re::engine::Plugin self, ...) PPCODE: 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); }