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.