X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Plugin.xs;h=da33ce2ff9050a130fe6f6d79d58d8b3b6262814;hb=908271b6e3cd68ae73cbd007d021af2670ed0558;hp=2229d48f3882b3ea8acb2ab1b4a64f83767b52aa;hpb=b79029228fea29f8c1e84d62831a0a1c8b0ddefe;p=perl%2Fmodules%2Fre-engine-Plugin.git diff --git a/Plugin.xs b/Plugin.xs index 2229d48..da33ce2 100644 --- 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)) { \ @@ -155,7 +151,7 @@ const regexp_engine engine_plugin = { typedef struct replug { /* Pointer back to the containing regexp struct so that accessors - * can modify nparens, gofs etc. */ + * can modify nparens, gofs, etc... */ struct regexp *rx; /* A copy of the pattern given to comp, for ->pattern */ @@ -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); @@ -233,8 +228,7 @@ Plugin_comp(pTHX_ const SV * const pattern, const U32 flags) rx->precomp = savepvn(pbuf, rx->prelen); /* Set up qr// stringification to be equivalent to the supplied - * pattern, this should be done via overload eventually. - */ + * pattern, this should be done via overload eventually */ rx->wraplen = rx->prelen; Newx(rx->wrapped, rx->wraplen, char); Copy(rx->precomp, rx->wrapped, rx->wraplen, char); @@ -247,9 +241,8 @@ Plugin_comp(pTHX_ const SV * const pattern, const U32 flags) re->pattern = (SV *) 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 - * in between */ + /* 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->exec) { re->cb_exec = h->exec; SvREFCNT_inc_simple_void_NN(h->exec); @@ -259,9 +252,8 @@ Plugin_comp(pTHX_ const SV * const pattern, const 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 - * already set up all the stuff we're going to to need for - * subsequent exec and other calls */ + /* 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->comp) { ENTER; SAVETMPS; @@ -277,8 +269,7 @@ Plugin_comp(pTHX_ const SV * const pattern, const U32 flags) } /* If any of the comp-time accessors were called we'll have to - * update the regexp struct with the new info. - */ + * update the regexp struct with the new info */ Newxz(rx->offs, rx->nparens + 1, regexp_paren_pair); return RX; @@ -289,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); @@ -375,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); @@ -383,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; @@ -424,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; @@ -465,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; @@ -495,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; @@ -550,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) { @@ -588,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) @@ -630,6 +637,7 @@ PPCODE: XSRETURN_EMPTY; } else { XPUSHs(self->stash); + XSRETURN(1); } void @@ -644,6 +652,7 @@ PPCODE: } else { XPUSHs(sv_2mortal(&PL_sv_undef)); } + XSRETURN(1); } void @@ -658,6 +667,7 @@ PPCODE: } else { XPUSHs(sv_2mortal(&PL_sv_undef)); } + XSRETURN(1); } void @@ -672,6 +682,7 @@ PPCODE: } else { XPUSHs(sv_2mortal(&PL_sv_undef)); } + XSRETURN(1); } void @@ -682,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, ...) @@ -691,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, ...) @@ -700,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, ...) @@ -709,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) @@ -725,3 +740,4 @@ void ENGINE() PPCODE: XPUSHs(sv_2mortal(newSViv(PTR2IV(&engine_plugin)))); + XSRETURN(1);