Introduce Perl_utf8_length(). Use it.
[p5sagit/p5-mst-13.2.git] / regexec.c
index 350f432..c0d0097 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -917,7 +917,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
            PL_reg_flags |= RF_tainted;
            /* FALL THROUGH */
        case BOUNDUTF8:
-           tmp = (I32)(s != startpos) ? utf8_to_uv_chk(reghop((U8*)s, -1),
+           tmp = (I32)(s != startpos) ? utf8_to_uv(reghop((U8*)s, -1),
                                                        strend - s,
                                                        0, 0) : '\n';
            tmp = ((OP(c) == BOUNDUTF8 ? isALNUM_uni(tmp) : isALNUM_LC_uni(tmp)) != 0);
@@ -955,7 +955,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
            PL_reg_flags |= RF_tainted;
            /* FALL THROUGH */
        case NBOUNDUTF8:
-           tmp = (I32)(s != startpos) ? utf8_to_uv_chk(reghop((U8*)s, -1),
+           tmp = (I32)(s != startpos) ? utf8_to_uv(reghop((U8*)s, -1),
                                                        strend - s,
                                                        0, 0) : '\n';
            tmp = ((OP(c) == NBOUNDUTF8 ? isALNUM_uni(tmp) : isALNUM_LC_uni(tmp)) != 0);
@@ -2002,7 +2002,7 @@ S_regmatch(pTHX_ regnode *prog)
                while (s < e) {
                    if (l >= PL_regeol)
                        sayNO;
-                   if (utf8_to_uv_chk((U8*)s, e - s, 0, 0) != (c1 ?
+                   if (utf8_to_uv((U8*)s, e - s, 0, 0) != (c1 ?
                                                  toLOWER_utf8((U8*)l) :
                                                  toLOWER_LC_utf8((U8*)l)))
                    {
@@ -2140,7 +2140,7 @@ S_regmatch(pTHX_ regnode *prog)
        case NBOUNDUTF8:
            /* was last char in word? */
            ln = (locinput != PL_regbol)
-               ? utf8_to_uv_chk(reghop((U8*)locinput, -1),
+               ? utf8_to_uv(reghop((U8*)locinput, -1),
                                 PL_regeol - locinput, 0, 0) : PL_regprev;
            if (OP(scan) == BOUNDUTF8 || OP(scan) == NBOUNDUTF8) {
                ln = isALNUM_uni(ln);
@@ -2596,12 +2596,18 @@ S_regmatch(pTHX_ regnode *prog)
        case CURLYX: {
                CURCUR cc;
                CHECKPOINT cp = PL_savestack_ix;
+               /* No need to save/restore up to this paren */
+               I32 parenfloor = scan->flags;
 
                if (OP(PREVOPER(next)) == NOTHING) /* LONGJMP */
                    next += ARG(next);
                cc.oldcc = PL_regcc;
                PL_regcc = &cc;
-               cc.parenfloor = *PL_reglastparen;
+               /* XXXX Probably it is better to teach regpush to support
+                  parenfloor > PL_regsize... */
+               if (parenfloor > *PL_reglastparen)
+                   parenfloor = *PL_reglastparen; /* Pessimization... */
+               cc.parenfloor = parenfloor;
                cc.cur = -1;
                cc.min = ARG1(scan);
                cc.max  = ARG2(scan);