summaryrefslogtreecommitdiffstats
path: root/src/gui
diff options
context:
space:
mode:
authorJoni Poikelin <joni.poikelin@qt.io>2020-03-25 12:15:17 +0200
committerEike Ziller <eike.ziller@qt.io>2020-08-19 14:38:17 +0200
commitf6a57817798a1ade1eb643d0c532c98997f9d65a (patch)
treec0fdf9f90fea0219ea15b6bed98da6ef31db93b6 /src/gui
parent21635935a5532af2f9efb452e216a64244709a16 (diff)
Avoid recreating QRegularExpression for every text block
With very complex regular expressions this makes a significant difference in performance. Change-Id: I5267bf71cae98dffb58ec7a1fc982dae639ff312 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io> (cherry picked from commit d0b30de54299e8e6e8b1df0c138494c17c2b2642) Reviewed-by: Joni Poikelin <joni.poikelin@qt.io>
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/text/qtextdocument.cpp18
1 files changed, 9 insertions, 9 deletions
diff --git a/src/gui/text/qtextdocument.cpp b/src/gui/text/qtextdocument.cpp
index b629264ee5..a633e5da11 100644
--- a/src/gui/text/qtextdocument.cpp
+++ b/src/gui/text/qtextdocument.cpp
@@ -1544,15 +1544,9 @@ QTextCursor QTextDocument::find(const QRegExp &expr, const QTextCursor &cursor,
#endif // QT_REGEXP
#if QT_CONFIG(regularexpression)
-static bool findInBlock(const QTextBlock &block, const QRegularExpression &expression, int offset,
+static bool findInBlock(const QTextBlock &block, const QRegularExpression &expr, int offset,
QTextDocument::FindFlags options, QTextCursor *cursor)
{
- QRegularExpression expr(expression);
- if (!(options & QTextDocument::FindCaseSensitively))
- expr.setPatternOptions(expr.patternOptions() | QRegularExpression::CaseInsensitiveOption);
- else
- expr.setPatternOptions(expr.patternOptions() & ~QRegularExpression::CaseInsensitiveOption);
-
QString text = block.text();
text.replace(QChar::Nbsp, QLatin1Char(' '));
QRegularExpressionMatch match;
@@ -1619,16 +1613,22 @@ QTextCursor QTextDocument::find(const QRegularExpression &expr, int from, FindFl
QTextBlock block = d->blocksFind(pos);
int blockOffset = pos - block.position();
+ QRegularExpression expression(expr);
+ if (!(options & QTextDocument::FindCaseSensitively))
+ expression.setPatternOptions(expr.patternOptions() | QRegularExpression::CaseInsensitiveOption);
+ else
+ expression.setPatternOptions(expr.patternOptions() & ~QRegularExpression::CaseInsensitiveOption);
+
if (!(options & FindBackward)) {
while (block.isValid()) {
- if (findInBlock(block, expr, blockOffset, options, &cursor))
+ if (findInBlock(block, expression, blockOffset, options, &cursor))
return cursor;
block = block.next();
blockOffset = 0;
}
} else {
while (block.isValid()) {
- if (findInBlock(block, expr, blockOffset, options, &cursor))
+ if (findInBlock(block, expression, blockOffset, options, &cursor))
return cursor;
block = block.previous();
blockOffset = block.length() - 1;