X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=t%2Fre-engine-Hooks-TestDist%2FTestDist.xs;h=0b701f77e667839268666548c0227181023d5d28;hb=819b78c9396701a0ef5fe7334e4054dd53c7ef93;hp=4e1d5119daa6fab681e9e069f3c3b3423cc64ed7;hpb=b85e0f01bc196351b28fb97eb8ae37871076722a;p=perl%2Fmodules%2Fre-engine-Hooks.git diff --git a/t/re-engine-Hooks-TestDist/TestDist.xs b/t/re-engine-Hooks-TestDist/TestDist.xs index 4e1d511..0b701f7 100644 --- a/t/re-engine-Hooks-TestDist/TestDist.xs +++ b/t/re-engine-Hooks-TestDist/TestDist.xs @@ -11,6 +11,10 @@ #define __PACKAGE__ "re::engine::Hooks::TestDist" #define __PACKAGE_LEN__ (sizeof(__PACKAGE__)-1) +#ifndef REHT_HAS_PERL +# define REHT_HAS_PERL(R, V, S) (PERL_REVISION > (R) || (PERL_REVISION == (R) && (PERL_VERSION > (V) || (PERL_VERSION == (V) && (PERL_SUBVERSION >= (S)))))) +#endif + #include "regcomp.h" STATIC SV *reht_foo_var; @@ -22,39 +26,51 @@ STATIC SV *reht_foo_var; av_push((AV *) SvRV(V), sv); \ } } while (0) -STATIC void reht_foo_comp(pTHX_ regexp *rx, regnode *node) { +STATIC void reht_foo_comp_node(pTHX_ regexp *rx, regnode *node) { REHT_PUSH_NODE_NAME(reht_foo_var, "c:"); } -STATIC void reht_foo_exec(pTHX_ regexp *rx, regnode *node, regmatch_info *reginfo, regmatch_state *st) { +STATIC void reht_foo_exec_node(pTHX_ regexp *rx, regnode *node, regmatch_info *reginfo, regmatch_state *st) { REHT_PUSH_NODE_NAME(reht_foo_var, "e:"); } STATIC SV *reht_bar_var; -STATIC void reht_bar_comp(pTHX_ regexp *rx, regnode *node) { +STATIC void reht_bar_comp_node(pTHX_ regexp *rx, regnode *node) { REHT_PUSH_NODE_NAME(reht_bar_var, "c:"); } -STATIC void reht_bar_exec(pTHX_ regexp *rx, regnode *node, regmatch_info *reginfo, regmatch_state *st) { +STATIC void reht_bar_exec_node(pTHX_ regexp *rx, regnode *node, regmatch_info *reginfo, regmatch_state *st) { REHT_PUSH_NODE_NAME(reht_bar_var, "e:"); } STATIC SV *reht_custom_var; -STATIC void reht_custom_comp(pTHX_ regexp *rx, regnode *node) { +STATIC void reht_custom_comp_node(pTHX_ regexp *rx, regnode *node) { const char *node_name; node_name = PL_reg_name[OP(node)]; } -STATIC void reht_custom_exec(pTHX_ regexp *rx, regnode *node, regmatch_info *reginfo, regmatch_state *st) { +#if !REHT_HAS_PERL(5, 19, 1) + +STATIC struct re_save_state reht_state_bak; + +#endif + +STATIC void reht_custom_exec_node(pTHX_ regexp *rx, regnode *node, regmatch_info *reginfo, regmatch_state *st) { STRLEN node_namelen; const char *node_name; node_name = PL_reg_name[OP(node)]; node_namelen = strlen(node_name); +#if !REHT_HAS_PERL(5, 19, 1) + /* The global regexp state may be overwritten if the Perl callback does a + * regexp match. */ + reht_state_bak = PL_reg_state; +#endif + dSP; ENTER; @@ -69,6 +85,10 @@ STATIC void reht_custom_exec(pTHX_ regexp *rx, regnode *node, regmatch_info *reg FREETMPS; LEAVE; + +#if !REHT_HAS_PERL(5, 19, 1) + PL_reg_state = reht_state_bak; +#endif } /* --- XS ------------------------------------------------------------------ */ @@ -81,24 +101,24 @@ BOOT: { { reh_config foo_cfg; - foo_cfg.comp = reht_foo_comp; - foo_cfg.exec = reht_foo_exec; + foo_cfg.comp_node = reht_foo_comp_node; + foo_cfg.exec_node = reht_foo_exec_node; reh_register(__PACKAGE__ "::foo", &foo_cfg); reht_foo_var = NULL; } { reh_config bar_cfg; - bar_cfg.comp = reht_bar_comp; - bar_cfg.exec = reht_bar_exec; + bar_cfg.comp_node = reht_bar_comp_node; + bar_cfg.exec_node = reht_bar_exec_node; reh_register(__PACKAGE__ "::bar", &bar_cfg); reht_bar_var = NULL; } { reh_config custom_cfg; - custom_cfg.comp = reht_custom_comp; - custom_cfg.exec = reht_custom_exec; + custom_cfg.comp_node = reht_custom_comp_node; + custom_cfg.exec_node = reht_custom_exec_node; reh_register(__PACKAGE__ "::custom", &custom_cfg); reht_custom_var = NULL; }