summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--op.h4
-rw-r--r--pp_ctl.c9
-rw-r--r--regcomp.c6
3 files changed, 18 insertions, 1 deletions
diff --git a/op.h b/op.h
index af8280b269..e92b1d8db4 100644
--- a/op.h
+++ b/op.h
@@ -263,6 +263,10 @@ struct pmop {
#define PMdf_USED 0x01 /* pm has been used once already */
#define PMdf_TAINTED 0x02 /* pm compiled from tainted pattern */
+#define PMdf_UTF8 0x04 /* pm compiled from utf8 data */
+#define PMdf_DYN_UTF8 0x08
+
+#define PMdf_CMP_UTF8 (PMdf_UTF8|PMdf_DYN_UTF8)
#define PMf_RETAINT 0x0001 /* taint $1 etc. if target tainted */
#define PMf_ONCE 0x0002 /* use pattern only once per reset */
diff --git a/pp_ctl.c b/pp_ctl.c
index 8a187b04fa..1605e21684 100644
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -121,7 +121,16 @@ PP(pp_regcomp)
PL_reginterp_cnt = I32_MAX; /* Mark as safe. */
pm->op_pmflags = pm->op_pmpermflags; /* reset case sensitivity */
+ if (DO_UTF8(tmpstr))
+ pm->op_pmdynflags |= PMdf_DYN_UTF8;
+ else {
+ pm->op_pmdynflags &= ~PMdf_DYN_UTF8;
+ if (pm->op_pmdynflags & PMdf_UTF8)
+ t = (char*)bytes_to_utf8((U8*)t, &len);
+ }
PM_SETRE(pm, CALLREGCOMP(aTHX_ t, t + len, pm));
+ if (!DO_UTF8(tmpstr) && (pm->op_pmdynflags & PMdf_UTF8))
+ Safefree(t);
PL_reginterp_cnt = 0; /* XXXX Be extra paranoid - needed
inside tie/overload accessors. */
}
diff --git a/regcomp.c b/regcomp.c
index 2b9fbbbb9d..2e37633e93 100644
--- a/regcomp.c
+++ b/regcomp.c
@@ -1666,7 +1666,11 @@ Perl_pregcomp(pTHX_ char *exp, char *xend, PMOP *pm)
if (exp == NULL)
FAIL("NULL regexp argument");
- RExC_utf8 = 0;
+ /* XXXX This looks very suspicious... */
+ if (pm->op_pmdynflags & PMdf_CMP_UTF8)
+ RExC_utf8 = 1;
+ else
+ RExC_utf8 = 0;
RExC_precomp = exp;
DEBUG_r(if (!PL_colorset) reginitcolors());