Change 30692 by [EMAIL PROTECTED] on 2007/03/22 17:55:41

        Integrate:
        [ 28891]
        Subject: [PATCH] Add hook for re_dup() into regex engine as reg_dupe 
(make re
        From: demerphq <[EMAIL PROTECTED]>
        Message-ID: <[EMAIL PROTECTED]>
        Date: Sun, 17 Sep 2006 14:57:57 +0200
        
        [ 28893]
        Make Perl_regdupe only exist for threaded perls.
        
        [ 28894]
        I think we need to skip PL_regdupe as well as Perl_regdupe
        when USE_ITHREADS is not defined
        
        See: http://www.nntp.perl.org/group/perl.daily-build.reports/41274

Affected files ...

... //depot/maint-5.8/perl/embed.fnc#215 integrate
... //depot/maint-5.8/perl/embed.h#161 integrate
... //depot/maint-5.8/perl/embedvar.h#62 integrate
... //depot/maint-5.8/perl/ext/re/re.xs#3 integrate
... //depot/maint-5.8/perl/ext/re/re_top.h#2 integrate
... //depot/maint-5.8/perl/global.sym#65 integrate
... //depot/maint-5.8/perl/intrpvar.h#52 edit
... //depot/maint-5.8/perl/makedef.pl#44 integrate
... //depot/maint-5.8/perl/perl.h#165 integrate
... //depot/maint-5.8/perl/perlapi.h#54 integrate
... //depot/maint-5.8/perl/proto.h#207 integrate
... //depot/maint-5.8/perl/regcomp.c#104 edit
... //depot/maint-5.8/perl/sv.c#348 edit
... //depot/maint-5.8/perl/thrdvar.h#10 edit

Differences ...

==== //depot/maint-5.8/perl/embed.fnc#215 (text) ====
Index: perl/embed.fnc
--- perl/embed.fnc#214~30547~   2007-03-12 06:52:55.000000000 -0700
+++ perl/embed.fnc      2007-03-22 10:55:41.000000000 -0700
@@ -661,6 +661,9 @@
                                |NN char* strend|NN char* strbeg|I32 minend \
                                |NN SV* screamer|U32 nosave
 Ap     |void   |pregfree       |NULLOK struct regexp* r
+#if defined(USE_ITHREADS)
+Ap     |regexp*|regdupe        |NN const regexp* r|NN CLONE_PARAMS* param
+#endif
 Ap     |regexp*|pregcomp       |NN char* exp|NN char* xend|NN PMOP* pm
 Ap     |char*  |re_intuit_start|NN regexp* prog|NULLOK SV* sv|NN char* strpos \
                                |NN char* strend|U32 flags \

==== //depot/maint-5.8/perl/embed.h#161 (text+w) ====
Index: perl/embed.h
--- perl/embed.h#160~30480~     2007-03-05 15:40:56.000000000 -0800
+++ perl/embed.h        2007-03-22 10:55:41.000000000 -0700
@@ -683,6 +683,9 @@
 #define regclass_swash         Perl_regclass_swash
 #define pregexec               Perl_pregexec
 #define pregfree               Perl_pregfree
+#if defined(USE_ITHREADS)
+#define regdupe                        Perl_regdupe
+#endif
 #define pregcomp               Perl_pregcomp
 #define re_intuit_start                Perl_re_intuit_start
 #define re_intuit_string       Perl_re_intuit_string
@@ -2784,6 +2787,9 @@
 #define regclass_swash(a,b,c,d)        Perl_regclass_swash(aTHX_ a,b,c,d)
 #define pregexec(a,b,c,d,e,f,g)        Perl_pregexec(aTHX_ a,b,c,d,e,f,g)
 #define pregfree(a)            Perl_pregfree(aTHX_ a)
+#if defined(USE_ITHREADS)
+#define regdupe(a,b)           Perl_regdupe(aTHX_ a,b)
+#endif
 #define pregcomp(a,b,c)                Perl_pregcomp(aTHX_ a,b,c)
 #define re_intuit_start(a,b,c,d,e,f)   Perl_re_intuit_start(aTHX_ a,b,c,d,e,f)
 #define re_intuit_string(a)    Perl_re_intuit_string(aTHX_ a)

==== //depot/maint-5.8/perl/embedvar.h#62 (text+w) ====
Index: perl/embedvar.h
--- perl/embedvar.h#61~30269~   2007-02-13 13:18:26.000000000 -0800
+++ perl/embedvar.h     2007-03-22 10:55:41.000000000 -0700
@@ -397,6 +397,7 @@
 #define PL_ptr_table           (PERL_GET_INTERP->Iptr_table)
 #define PL_reentrant_buffer    (PERL_GET_INTERP->Ireentrant_buffer)
 #define PL_reentrant_retint    (PERL_GET_INTERP->Ireentrant_retint)
+#define PL_regdupe             (PERL_GET_INTERP->Iregdupe)
 #define PL_regex_pad           (PERL_GET_INTERP->Iregex_pad)
 #define PL_regex_padav         (PERL_GET_INTERP->Iregex_padav)
 #define PL_rehash_seed         (PERL_GET_INTERP->Irehash_seed)
@@ -727,6 +728,7 @@
 #define PL_ptr_table           (vTHX->Iptr_table)
 #define PL_reentrant_buffer    (vTHX->Ireentrant_buffer)
 #define PL_reentrant_retint    (vTHX->Ireentrant_retint)
+#define PL_regdupe             (vTHX->Iregdupe)
 #define PL_regex_pad           (vTHX->Iregex_pad)
 #define PL_regex_padav         (vTHX->Iregex_padav)
 #define PL_rehash_seed         (vTHX->Irehash_seed)
@@ -1060,6 +1062,7 @@
 #define PL_Iptr_table          PL_ptr_table
 #define PL_Ireentrant_buffer   PL_reentrant_buffer
 #define PL_Ireentrant_retint   PL_reentrant_retint
+#define PL_Iregdupe            PL_regdupe
 #define PL_Iregex_pad          PL_regex_pad
 #define PL_Iregex_padav                PL_regex_padav
 #define PL_Irehash_seed                PL_rehash_seed

==== //depot/maint-5.8/perl/ext/re/re.xs#3 (text) ====
Index: perl/ext/re/re.xs
--- perl/ext/re/re.xs#2~30615~  2007-03-18 12:48:25.000000000 -0700
+++ perl/ext/re/re.xs   2007-03-22 10:55:41.000000000 -0700
@@ -19,6 +19,9 @@
                                    struct re_scream_pos_data_s *data);
 extern SV*     my_re_intuit_string (pTHX_ regexp *prog);
 
+extern regexp* my_regdupe (pTHX_ regexp *r, CLONE_PARAMS *param);
+
+
 END_EXTERN_C
 
 /* engine details need to be paired - non debugging, debuggin  */
@@ -33,13 +36,24 @@
                                    struct re_scream_pos_data_s *data);
     SV*                (*re_intuit_string) (pTHX_ regexp *prog);
     void       (*regfree) (pTHX_ struct regexp* r);
+#if defined(USE_ITHREADS)
+    regexp*    (*regdupe) (pTHX_ regexp *r, CLONE_PARAMS *param);
+#endif
 };
 
 struct regexp_engine engines[] = {
     { Perl_pregcomp, Perl_regexec_flags, Perl_re_intuit_start,
-      Perl_re_intuit_string, Perl_pregfree },
+      Perl_re_intuit_string, Perl_pregfree
+#if defined(USE_ITHREADS)
+       , Perl_regdupe
+#endif
+    },
     { my_regcomp, my_regexec, my_re_intuit_start, my_re_intuit_string,
-      my_regfree }
+      my_regfree
+#if defined(USE_ITHREADS)
+      , my_regdupe
+#endif
+    }
 };
 
 #define MY_CXT_KEY "re::_guts" XS_VERSION
@@ -72,6 +86,9 @@
     PL_regint_start = engines[new_state].re_intuit_start;
     PL_regint_string = engines[new_state].re_intuit_string;
     PL_regfree = engines[new_state].regfree;
+#if defined(USE_ITHREADS)
+    PL_regdupe = engines[new_state].regdupe;
+#endif
 
     if (new_state & NEEDS_DEBUGGING) {
        PL_colorset = 0;        /* Allow reinspection of ENV. */

==== //depot/maint-5.8/perl/ext/re/re_top.h#2 (text) ====
Index: perl/ext/re/re_top.h
--- perl/ext/re/re_top.h#1~30579~       2007-03-14 06:32:50.000000000 -0700
+++ perl/ext/re/re_top.h        2007-03-22 10:55:41.000000000 -0700
@@ -8,13 +8,14 @@
 #endif
 
 /* We *really* need to overwrite these symbols: */
-#define Perl_regexec_flags my_regexec
-#define Perl_regdump my_regdump
-#define Perl_regprop my_regprop
-#define Perl_re_intuit_start my_re_intuit_start
-#define Perl_pregcomp my_regcomp
-#define Perl_pregfree my_regfree
-#define Perl_re_intuit_string my_re_intuit_string
+#define Perl_regexec_flags      my_regexec
+#define Perl_regdump            my_regdump
+#define Perl_regprop            my_regprop
+#define Perl_re_intuit_start    my_re_intuit_start
+#define Perl_pregcomp           my_regcomp
+#define Perl_pregfree           my_regfree
+#define Perl_re_intuit_string   my_re_intuit_string
+#define Perl_regdupe            my_regdupe
 
 #define PERL_NO_GET_CONTEXT
 

==== //depot/maint-5.8/perl/global.sym#65 (text+w) ====
Index: perl/global.sym
--- perl/global.sym#64~30547~   2007-03-12 06:52:55.000000000 -0700
+++ perl/global.sym     2007-03-22 10:55:41.000000000 -0700
@@ -377,6 +377,7 @@
 Perl_regclass_swash
 Perl_pregexec
 Perl_pregfree
+Perl_regdupe
 Perl_pregcomp
 Perl_re_intuit_start
 Perl_re_intuit_string

==== //depot/maint-5.8/perl/intrpvar.h#52 (text) ====
Index: perl/intrpvar.h
--- perl/intrpvar.h#51~30297~   2007-02-14 11:11:41.000000000 -0800
+++ perl/intrpvar.h     2007-03-22 10:55:41.000000000 -0700
@@ -619,3 +619,8 @@
 #if !defined(USE_THREADS)
 PERLVAR(Iptr_table,    PTR_TBL_t*)
 #endif
+
+#if defined(USE_ITHREADS)
+PERLVARI(Iregdupe,     regdupe_t, MEMBER_TO_FPTR(Perl_regdupe))
+                                       /* Pointer to REx dupe()er */
+#endif

==== //depot/maint-5.8/perl/makedef.pl#44 (text) ====
Index: perl/makedef.pl
--- perl/makedef.pl#43~30547~   2007-03-12 06:52:55.000000000 -0700
+++ perl/makedef.pl     2007-03-22 10:55:41.000000000 -0700
@@ -719,6 +719,7 @@
                    PL_sharedsv_space_mutex
                    PL_dollarzero_mutex
                    PL_perlio_mutex
+                   PL_regdupe
                    Perl_dirp_dup
                    Perl_cx_dup
                    Perl_si_dup
@@ -742,6 +743,7 @@
                    Perl_sharedsv_thrcnt_inc
                    Perl_sharedsv_unlock
                    Perl_stashpv_hvname_match
+                   Perl_regdupe
                    )];
 }
 

==== //depot/maint-5.8/perl/perl.h#165 (text) ====
Index: perl/perl.h
--- perl/perl.h#164~30664~      2007-03-21 11:26:34.000000000 -0700
+++ perl/perl.h 2007-03-22 10:55:41.000000000 -0700
@@ -155,6 +155,7 @@
 #define CALLREG_INTUIT_START CALL_FPTR(PL_regint_start)
 #define CALLREG_INTUIT_STRING CALL_FPTR(PL_regint_string)
 #define CALLREGFREE CALL_FPTR(PL_regfree)
+#define CALLREGDUPE CALL_FPTR(PL_regdupe)
 
 /*
  * Because of backward compatibility reasons the PERL_UNUSED_DECL
@@ -4311,6 +4312,7 @@
                                                struct re_scream_pos_data_s *d);
 typedef SV*    (CPERLscope(*re_intuit_string_t)) (pTHX_ regexp *prog);
 typedef void   (CPERLscope(*regfree_t)) (pTHX_ struct regexp* r);
+typedef regexp*(CPERLscope(*regdupe_t)) (pTHX_ const regexp* r, CLONE_PARAMS 
*param);
 
 typedef void (*DESTRUCTORFUNC_NOCONTEXT_t) (void*);
 typedef void (*DESTRUCTORFUNC_t) (pTHX_ void*);

==== //depot/maint-5.8/perl/perlapi.h#54 (text+w) ====
Index: perl/perlapi.h
--- perl/perlapi.h#53~30269~    2007-02-13 13:18:26.000000000 -0800
+++ perl/perlapi.h      2007-03-22 10:55:41.000000000 -0700
@@ -533,6 +533,8 @@
 #define PL_reentrant_buffer    (*Perl_Ireentrant_buffer_ptr(aTHX))
 #undef  PL_reentrant_retint
 #define PL_reentrant_retint    (*Perl_Ireentrant_retint_ptr(aTHX))
+#undef  PL_regdupe
+#define PL_regdupe             (*Perl_Iregdupe_ptr(aTHX))
 #undef  PL_regex_pad
 #define PL_regex_pad           (*Perl_Iregex_pad_ptr(aTHX))
 #undef  PL_regex_padav

==== //depot/maint-5.8/perl/proto.h#207 (text+w) ====
Index: perl/proto.h
--- perl/proto.h#206~30480~     2007-03-05 15:40:56.000000000 -0800
+++ perl/proto.h        2007-03-22 10:55:41.000000000 -0700
@@ -1059,6 +1059,9 @@
 PERL_CALLCONV SV*      Perl_regclass_swash(pTHX_ struct regnode *n, bool 
doinit, SV **listsvp, SV **altsvp);
 PERL_CALLCONV I32      Perl_pregexec(pTHX_ regexp* prog, char* stringarg, 
char* strend, char* strbeg, I32 minend, SV* screamer, U32 nosave);
 PERL_CALLCONV void     Perl_pregfree(pTHX_ struct regexp* r);
+#if defined(USE_ITHREADS)
+PERL_CALLCONV regexp*  Perl_regdupe(pTHX_ const regexp* r, CLONE_PARAMS* 
param);
+#endif
 PERL_CALLCONV regexp*  Perl_pregcomp(pTHX_ char* exp, char* xend, PMOP* pm);
 PERL_CALLCONV char*    Perl_re_intuit_start(pTHX_ regexp* prog, SV* sv, char* 
strpos, char* strend, U32 flags, struct re_scream_pos_data_s *data);
 PERL_CALLCONV SV*      Perl_re_intuit_string(pTHX_ regexp* prog);
@@ -2402,16 +2405,16 @@
 #ifndef SPRINTF_RETURNS_STRLEN
 PERL_CALLCONV int      Perl_my_sprintf(char *buffer, const char *pat, ...);
 #endif
-#if !defined(HAS_SIGNBIT)
-PERL_CALLCONV int      Perl_signbit(NV f)
-                       __attribute__pure__;
-
-#endif
 
 PERL_CALLCONV int      Perl_my_snprintf(char *buffer, const Size_t len, const 
char *format, ...)
                        __attribute__format__null_ok__(__printf__,3,4);
 
 PERL_CALLCONV int      Perl_my_vsnprintf(char *buffer, const Size_t len, const 
char *format, va_list ap);
+#if !defined(HAS_SIGNBIT)
+PERL_CALLCONV int      Perl_signbit(NV f)
+                       __attribute__pure__;
+
+#endif
 
 END_EXTERN_C
 /*

==== //depot/maint-5.8/perl/regcomp.c#104 (text) ====
Index: perl/regcomp.c
--- perl/regcomp.c#103~30588~   2007-03-14 10:57:05.000000000 -0700
+++ perl/regcomp.c      2007-03-22 10:55:41.000000000 -0700
@@ -4652,6 +4652,12 @@
     return prog->check_substr ? prog->check_substr : prog->check_utf8;
 }
 
+/* 
+   pregfree - free a regexp
+   
+   See regdupe below if you change anything here. 
+*/
+
 void
 Perl_pregfree(pTHX_ struct regexp *r)
 {
@@ -4742,6 +4748,123 @@
     Safefree(r);
 }
 
+#define sv_dup_inc(s,t)        SvREFCNT_inc(sv_dup(s,t))
+#define av_dup_inc(s,t)        (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
+#define SAVEPVN(p,n)   ((p) ? savepvn(p,n) : NULL)
+
+/* 
+   regdupe - duplicate a regexp. 
+   
+   This routine is called by sv.c's re_dup and is expected to clone a 
+   given regexp structure. It is a no-op when not under USE_ITHREADS. 
+   (Originally this *was* re_dup() for change history see sv.c)
+   
+   See pregfree() above if you change anything here. 
+*/
+       
+#if defined(USE_ITHREADS)
+regexp *
+Perl_regdupe(pTHX_ const regexp *r, CLONE_PARAMS *param)
+{
+    REGEXP *ret;
+    int i, len, npar;
+    struct reg_substr_datum *s;
+
+    if (!r)
+       return (REGEXP *)NULL;
+
+    if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, (regexp *)r)))
+       return ret;
+
+    len = r->offsets[0];
+    npar = r->nparens+1;
+
+    Newxc(ret, sizeof(regexp) + (len+1)*sizeof(regnode), char, regexp);
+    Copy(r->program, ret->program, len+1, regnode);
+
+    Newx(ret->startp, npar, I32);
+    Copy(r->startp, ret->startp, npar, I32);
+    Newx(ret->endp, npar, I32);
+    Copy(r->startp, ret->startp, npar, I32);
+
+    Newx(ret->substrs, 1, struct reg_substr_data);
+    for (s = ret->substrs->data, i = 0; i < 3; i++, s++) {
+       s->min_offset = r->substrs->data[i].min_offset;
+       s->max_offset = r->substrs->data[i].max_offset;
+       s->substr     = sv_dup_inc(r->substrs->data[i].substr, param);
+       s->utf8_substr = sv_dup_inc(r->substrs->data[i].utf8_substr, param);
+    }
+
+    ret->regstclass = NULL;
+    if (r->data) {
+       struct reg_data *d;
+        const int count = r->data->count;
+       int i;
+
+       Newxc(d, sizeof(struct reg_data) + count*sizeof(void *),
+               char, struct reg_data);
+       Newx(d->what, count, U8);
+
+       d->count = count;
+       for (i = 0; i < count; i++) {
+           d->what[i] = r->data->what[i];
+           switch (d->what[i]) {
+           case 's':
+               d->data[i] = sv_dup_inc((SV *)r->data->data[i], param);
+               break;
+           case 'p':
+               d->data[i] = av_dup_inc((AV *)r->data->data[i], param);
+               break;
+           case 'f':
+               /* This is cheating. */
+               Newx(d->data[i], 1, struct regnode_charclass_class);
+               StructCopy(r->data->data[i], d->data[i],
+                           struct regnode_charclass_class);
+               ret->regstclass = (regnode*)d->data[i];
+               break;
+           case 'o':
+               /* Compiled op trees are readonly, and can thus be
+                  shared without duplication. */
+               OP_REFCNT_LOCK;
+               d->data[i] = (void*)OpREFCNT_inc((OP*)r->data->data[i]);
+               OP_REFCNT_UNLOCK;
+               break;
+           case 'n':
+               d->data[i] = r->data->data[i];
+               break;
+           }
+       }
+
+       ret->data = d;
+    }
+    else
+       ret->data = NULL;
+
+    Newx(ret->offsets, 2*len+1, U32);
+    Copy(r->offsets, ret->offsets, 2*len+1, U32);
+
+    ret->precomp        = SAVEPVN(r->precomp, r->prelen);
+    ret->refcnt         = r->refcnt;
+    ret->minlen         = r->minlen;
+    ret->prelen         = r->prelen;
+    ret->nparens        = r->nparens;
+    ret->lastparen      = r->lastparen;
+    ret->lastcloseparen = r->lastcloseparen;
+    ret->reganch        = r->reganch;
+
+    ret->sublen         = r->sublen;
+
+    if (RX_MATCH_COPIED(ret))
+       ret->subbeg  = SAVEPVN(r->subbeg, r->sublen);
+    else
+       ret->subbeg = NULL;
+
+    ptr_table_store(PL_ptr_table, (regexp *)r, ret);
+    return ret;
+    return NULL;    
+}
+#endif    
+
 #ifndef PERL_IN_XSUB_RE
 /*
  - regnext - dig the "next" pointer out of a node

==== //depot/maint-5.8/perl/sv.c#348 (text) ====
Index: perl/sv.c
--- perl/sv.c#347~30480~        2007-03-05 15:40:56.000000000 -0800
+++ perl/sv.c   2007-03-22 10:55:41.000000000 -0700
@@ -8966,101 +8966,7 @@
 REGEXP *
 Perl_re_dup(pTHX_ REGEXP *r, CLONE_PARAMS *param)
 {
-    REGEXP *ret;
-    int i, len, npar;
-    struct reg_substr_datum *s;
-
-    if (!r)
-       return (REGEXP *)NULL;
-
-    if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, r)))
-       return ret;
-
-    len = r->offsets[0];
-    npar = r->nparens+1;
-
-    Newxc(ret, sizeof(regexp) + (len+1)*sizeof(regnode), char, regexp);
-    Copy(r->program, ret->program, len+1, regnode);
-
-    Newx(ret->startp, npar, I32);
-    Copy(r->startp, ret->startp, npar, I32);
-    Newx(ret->endp, npar, I32);
-    Copy(r->startp, ret->startp, npar, I32);
-
-    Newx(ret->substrs, 1, struct reg_substr_data);
-    for (s = ret->substrs->data, i = 0; i < 3; i++, s++) {
-       s->min_offset = r->substrs->data[i].min_offset;
-       s->max_offset = r->substrs->data[i].max_offset;
-       s->substr     = sv_dup_inc(r->substrs->data[i].substr, param);
-       s->utf8_substr = sv_dup_inc(r->substrs->data[i].utf8_substr, param);
-    }
-
-    ret->regstclass = NULL;
-    if (r->data) {
-       struct reg_data *d;
-        const int count = r->data->count;
-       int i;
-
-       Newxc(d, sizeof(struct reg_data) + count*sizeof(void *),
-               char, struct reg_data);
-       Newx(d->what, count, U8);
-
-       d->count = count;
-       for (i = 0; i < count; i++) {
-           d->what[i] = r->data->what[i];
-           switch (d->what[i]) {
-           case 's':
-               d->data[i] = sv_dup_inc((SV *)r->data->data[i], param);
-               break;
-           case 'p':
-               d->data[i] = av_dup_inc((AV *)r->data->data[i], param);
-               break;
-           case 'f':
-               /* This is cheating. */
-               Newx(d->data[i], 1, struct regnode_charclass_class);
-               StructCopy(r->data->data[i], d->data[i],
-                           struct regnode_charclass_class);
-               ret->regstclass = (regnode*)d->data[i];
-               break;
-           case 'o':
-               /* Compiled op trees are readonly, and can thus be
-                  shared without duplication. */
-               OP_REFCNT_LOCK;
-               d->data[i] = (void*)OpREFCNT_inc((OP*)r->data->data[i]);
-               OP_REFCNT_UNLOCK;
-               break;
-           case 'n':
-               d->data[i] = r->data->data[i];
-               break;
-           }
-       }
-
-       ret->data = d;
-    }
-    else
-       ret->data = NULL;
-
-    Newx(ret->offsets, 2*len+1, U32);
-    Copy(r->offsets, ret->offsets, 2*len+1, U32);
-
-    ret->precomp        = SAVEPVN(r->precomp, r->prelen);
-    ret->refcnt         = r->refcnt;
-    ret->minlen         = r->minlen;
-    ret->prelen         = r->prelen;
-    ret->nparens        = r->nparens;
-    ret->lastparen      = r->lastparen;
-    ret->lastcloseparen = r->lastcloseparen;
-    ret->reganch        = r->reganch;
-
-    ret->sublen         = r->sublen;
-
-    if (RX_MATCH_COPIED(ret))
-       ret->subbeg  = SAVEPVN(r->subbeg, r->sublen);
-    else
-       ret->subbeg = NULL;
-
-    ptr_table_store(PL_ptr_table, r, ret);
-    return ret;
+    return CALLREGDUPE(aTHX_ r,param);
 }
 
 /* duplicate a file handle */
@@ -10520,6 +10426,19 @@
     sv_setpvn(PERL_DEBUG_PAD(1), "", 0);       /* ext/re needs these */
     sv_setpvn(PERL_DEBUG_PAD(2), "", 0);       /* even without DEBUGGING. */
 
+   
+    /* RE engine - function pointers -- must initilize these before 
+       re_dup() is called. dmq. */
+    PL_regcompp                = proto_perl->Tregcompp;
+    PL_regexecp                = proto_perl->Tregexecp;
+    PL_regint_start    = proto_perl->Tregint_start;
+    PL_regint_string   = proto_perl->Tregint_string;
+    PL_regfree         = proto_perl->Tregfree;
+    PL_regdupe         = proto_perl->Iregdupe;
+
+    PL_reginterp_cnt   = 0;
+    PL_reg_starttry    = 0;
+    
     /* Clone the regex array */
     PL_regex_padav = newAV();
     {
@@ -11045,16 +10964,6 @@
     PL_reg_poscache    = NULL;
     PL_reg_poscache_size= 0;
 
-    /* RE engine - function pointers */
-    PL_regcompp                = proto_perl->Tregcompp;
-    PL_regexecp                = proto_perl->Tregexecp;
-    PL_regint_start    = proto_perl->Tregint_start;
-    PL_regint_string   = proto_perl->Tregint_string;
-    PL_regfree         = proto_perl->Tregfree;
-
-    PL_reginterp_cnt   = 0;
-    PL_reg_starttry    = 0;
-
     /* Pluggable optimizer */
     PL_peepp           = proto_perl->Tpeepp;
 
End of Patch.

Reply via email to