Update the z/OS situation.
[p5sagit/p5-mst-13.2.git] / regexec.c
index 0c45fd0..4f403a0 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -3990,7 +3990,9 @@ S_regrepeat(pTHX_ regnode *p, I32 max)
     register bool do_utf8 = PL_reg_match_utf8;
 
     scan = PL_reginput;
-    if (max != REG_INFTY && max < loceol - scan)
+    if (max == REG_INFTY)
+       max = I32_MAX;
+    else if (max < loceol - scan)
       loceol = scan + max;
     switch (OP(p)) {
     case REG_ANY:
@@ -4284,15 +4286,16 @@ Perl_regclass_swash(pTHX_ register regnode* node, bool doinit, SV** listsvp, SV
        if (PL_regdata->what[n] == 's') {
            SV *rv = (SV*)PL_regdata->data[n];
            AV *av = (AV*)SvRV((SV*)rv);
+           SV **ary = AvARRAY(av);
            SV **a, **b;
        
            /* See the end of regcomp.c:S_reglass() for
             * documentation of these array elements. */
 
-           si  = *av_fetch(av, 0, FALSE);
-           a   =  av_fetch(av, 1, FALSE);
-           b   =  av_fetch(av, 2, FALSE);
-       
+           si = *ary;
+           a  = SvTYPE(ary[1]) == SVt_RV   ? &ary[1] : 0;
+           b  = SvTYPE(ary[2]) == SVt_PVAV ? &ary[2] : 0;
+
            if (a)
                sw = *a;
            else if (si && doinit) {
@@ -4327,12 +4330,13 @@ S_reginclass(pTHX_ register regnode *n, register U8* p, STRLEN* lenp, register b
 {
     char flags = ANYOF_FLAGS(n);
     bool match = FALSE;
-    UV c;
+    UV c = *p;
     STRLEN len = 0;
     STRLEN plen;
 
-    c = do_utf8 ? utf8n_to_uvchr(p, UTF8_MAXLEN, &len,
-                                ckWARN(WARN_UTF8) ? 0 : UTF8_ALLOW_ANY) : *p;
+    if (do_utf8 && !UTF8_IS_INVARIANT(c))
+        c = utf8n_to_uvchr(p, UTF8_MAXLEN, &len,
+                           ckWARN(WARN_UTF8) ? 0 : UTF8_ALLOW_ANY);
 
     plen = lenp ? *lenp : UNISKIP(NATIVE_TO_UNI(c));
     if (do_utf8 || (flags & ANYOF_UNICODE)) {