);
});
- if (prog->minlen > CHR_DIST((U8*)strend, (U8*)strpos)) {
+ /* CHR_DIST() would be more correct here but it makes things slow. */
+ if (prog->minlen > strend - strpos) {
DEBUG_r(PerlIO_printf(Perl_debug_log,
"String too short... [re_intuit_start]\n"));
goto fail;
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:
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) {
{
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)) {