8276216: Negated character classes performance regression in Pattern

Reviewed-by: clanger
This commit is contained in:
Volker Simonis 2021-11-23 09:15:20 +00:00
parent e3243ee963
commit 79350b9b4f
2 changed files with 113 additions and 23 deletions

View file

@ -5605,50 +5605,69 @@ NEXT: while (i <= last) {
}
}
private static CharPredicate and(CharPredicate p1, CharPredicate p2,
boolean bmpChar) {
if (bmpChar) {
return (BmpCharPredicate)(ch -> p1.is(ch) && p2.is(ch));
} else {
return (CharPredicate)(ch -> p1.is(ch) && p2.is(ch));
}
}
private static CharPredicate union(CharPredicate p1, CharPredicate p2,
boolean bmpChar) {
if (bmpChar) {
return (BmpCharPredicate)(ch -> p1.is(ch) || p2.is(ch));
} else {
return (CharPredicate)(ch -> p1.is(ch) || p2.is(ch));
}
}
private static CharPredicate union(CharPredicate p1, CharPredicate p2,
CharPredicate p3, boolean bmpChar) {
if (bmpChar) {
return (BmpCharPredicate)(ch -> p1.is(ch) || p2.is(ch) || p3.is(ch));
} else {
return (CharPredicate)(ch -> p1.is(ch) || p2.is(ch) || p3.is(ch));
}
}
private static CharPredicate negate(CharPredicate p1) {
return (CharPredicate)(ch -> !p1.is(ch));
}
@FunctionalInterface
static interface CharPredicate {
boolean is(int ch);
default CharPredicate and(CharPredicate p) {
return ch -> is(ch) && p.is(ch);
return Pattern.and(this, p, false);
}
default CharPredicate union(CharPredicate p) {
return ch -> is(ch) || p.is(ch);
return Pattern.union(this, p, false);
}
default CharPredicate union(CharPredicate p1,
CharPredicate p2) {
return ch -> is(ch) || p1.is(ch) || p2.is(ch);
return Pattern.union(this, p1, p2, false);
}
default CharPredicate negate() {
return ch -> !is(ch);
return Pattern.negate(this);
}
}
static interface BmpCharPredicate extends CharPredicate {
default CharPredicate and(CharPredicate p) {
if (p instanceof BmpCharPredicate)
return (BmpCharPredicate)(ch -> is(ch) && p.is(ch));
return ch -> is(ch) && p.is(ch);
return Pattern.and(this, p, p instanceof BmpCharPredicate);
}
default CharPredicate union(CharPredicate p) {
if (p instanceof BmpCharPredicate)
return (BmpCharPredicate)(ch -> is(ch) || p.is(ch));
return ch -> is(ch) || p.is(ch);
return Pattern.union(this, p, p instanceof BmpCharPredicate);
}
static CharPredicate union(CharPredicate... predicates) {
CharPredicate cp = ch -> {
for (CharPredicate p : predicates) {
if (!p.is(ch))
return false;
}
return true;
};
for (CharPredicate p : predicates) {
if (! (p instanceof BmpCharPredicate))
return cp;
}
return (BmpCharPredicate)cp;
default CharPredicate union(CharPredicate p1,
CharPredicate p2) {
return Pattern.union(this, p1, p2,
p1 instanceof BmpCharPredicate &&
p2 instanceof BmpCharPredicate);
}
}