QRegularExpression: add optimizations autotest
Exporting the counter that controls the optimization of a compiled pattern lets us to forcibly optimize all patterns. Therefore, two tests are now run: one with default optimization values and another one which always optimizes the pattern. The counter itself was renamed with a qt_ prefix and put inside the Qt compilation namespace (thanks to rohanpm for pointing it out). Change-Id: I56602433d37adc127772b2d0d2cdaf2e49d43c71 Reviewed-by: Rohan McGovern <rohan.mcgovern@nokia.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>bb10
parent
aee8f7d81e
commit
eb70933398
|
|
@ -50,9 +50,6 @@
|
|||
|
||||
#include <pcre.h>
|
||||
|
||||
// after how many usages we optimize the regexp
|
||||
static const unsigned int OPTIMIZE_AFTER_USE_COUNT = 10;
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
/*!
|
||||
|
|
@ -726,6 +723,13 @@ QT_BEGIN_NAMESPACE
|
|||
contain any metacharacter that anchors the match at that point.
|
||||
*/
|
||||
|
||||
// after how many usages we optimize the regexp
|
||||
#ifdef QT_BUILD_INTERNAL
|
||||
Q_AUTOTEST_EXPORT unsigned int qt_qregularexpression_optimize_after_use_count = 10;
|
||||
#else
|
||||
static const unsigned int qt_qregularexpression_optimize_after_use_count = 10;
|
||||
#endif // QT_BUILD_INTERNAL
|
||||
|
||||
/*!
|
||||
\internal
|
||||
*/
|
||||
|
|
@ -1012,7 +1016,7 @@ static bool isJitEnabled()
|
|||
setting the studyData member variable to the result of the study. It gets
|
||||
called by doMatch() every time a match is performed. As of now, the
|
||||
optimizations on the pattern are performed after a certain number of usages
|
||||
(i.e. the OPTIMIZE_AFTER_USE_COUNT constant).
|
||||
(i.e. the qt_qregularexpression_optimize_after_use_count constant).
|
||||
|
||||
Notice that although the method is protected by a mutex, one thread may
|
||||
invoke this function and return immediately (i.e. not study the pattern,
|
||||
|
|
@ -1028,7 +1032,7 @@ pcre16_extra *QRegularExpressionPrivate::optimizePattern()
|
|||
|
||||
QMutexLocker lock(&mutex);
|
||||
|
||||
if (studyData || (++usedCount != OPTIMIZE_AFTER_USE_COUNT))
|
||||
if (studyData || (++usedCount != qt_qregularexpression_optimize_after_use_count))
|
||||
return studyData;
|
||||
|
||||
static const bool enableJit = isJitEnabled();
|
||||
|
|
|
|||
|
|
@ -1 +1,2 @@
|
|||
tst_qregularexpression
|
||||
tst_qregularexpression_alwaysoptimize
|
||||
tst_qregularexpression_defaultoptimize
|
||||
|
|
|
|||
|
|
@ -0,0 +1,7 @@
|
|||
CONFIG += testcase parallel_test
|
||||
TARGET = tst_qregularexpression_alwaysoptimize
|
||||
QT = core testlib
|
||||
HEADERS = ../tst_qregularexpression.h
|
||||
SOURCES = \
|
||||
tst_qregularexpression_alwaysoptimize.cpp \
|
||||
../tst_qregularexpression.cpp
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 Giuseppe D'Angelo <dangelog@gmail.com>.
|
||||
** Contact: http://www.qt-project.org/
|
||||
**
|
||||
** This file is part of the test suite of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include <QtTest/QtTest>
|
||||
#include "../tst_qregularexpression.h"
|
||||
|
||||
class tst_QRegularExpression_AlwaysOptimize : public tst_QRegularExpression
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private slots:
|
||||
void initTestCase();
|
||||
};
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
extern Q_CORE_EXPORT unsigned int qt_qregularexpression_optimize_after_use_count; // from qregularexpression.cpp
|
||||
QT_END_NAMESPACE
|
||||
|
||||
void tst_QRegularExpression_AlwaysOptimize::initTestCase()
|
||||
{
|
||||
qt_qregularexpression_optimize_after_use_count = 1;
|
||||
}
|
||||
|
||||
QTEST_APPLESS_MAIN(tst_QRegularExpression_AlwaysOptimize)
|
||||
|
||||
#include "tst_qregularexpression_alwaysoptimize.moc"
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
CONFIG += testcase parallel_test
|
||||
TARGET = tst_qregularexpression_defaultoptimize
|
||||
QT = core testlib
|
||||
HEADERS = ../tst_qregularexpression.h
|
||||
SOURCES = \
|
||||
tst_qregularexpression_defaultoptimize.cpp \
|
||||
../tst_qregularexpression.cpp
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 Giuseppe D'Angelo <dangelog@gmail.com>.
|
||||
** Contact: http://www.qt-project.org/
|
||||
**
|
||||
** This file is part of the test suite of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include <QtTest/QtTest>
|
||||
#include "../tst_qregularexpression.h"
|
||||
|
||||
class tst_QRegularExpression_DefaultOptimize : public tst_QRegularExpression
|
||||
{
|
||||
Q_OBJECT
|
||||
};
|
||||
|
||||
QTEST_APPLESS_MAIN(tst_QRegularExpression_DefaultOptimize)
|
||||
|
||||
#include "tst_qregularexpression_defaultoptimize.moc"
|
||||
|
|
@ -1,4 +1,3 @@
|
|||
CONFIG += testcase parallel_test
|
||||
TARGET = tst_qregularexpression
|
||||
QT = core testlib
|
||||
SOURCES = tst_qregularexpression.cpp
|
||||
TEMPLATE = subdirs
|
||||
SUBDIRS = defaultoptimize
|
||||
contains(QT_CONFIG,private_tests):SUBDIRS += alwaysoptimize
|
||||
|
|
|
|||
|
|
@ -40,45 +40,12 @@
|
|||
****************************************************************************/
|
||||
|
||||
#include <QtTest/QtTest>
|
||||
#include <qregularexpression.h>
|
||||
#include <qstring.h>
|
||||
#include <qlist.h>
|
||||
#include <qstringlist.h>
|
||||
#include <qhash.h>
|
||||
|
||||
Q_DECLARE_METATYPE(QRegularExpression::PatternOptions)
|
||||
Q_DECLARE_METATYPE(QRegularExpression::MatchType)
|
||||
Q_DECLARE_METATYPE(QRegularExpression::MatchOptions)
|
||||
|
||||
class tst_QRegularExpression : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private slots:
|
||||
void gettersSetters_data();
|
||||
void gettersSetters();
|
||||
void escape_data();
|
||||
void escape();
|
||||
void validity_data();
|
||||
void validity();
|
||||
void patternOptions_data();
|
||||
void patternOptions();
|
||||
void normalMatch_data();
|
||||
void normalMatch();
|
||||
void partialMatch_data();
|
||||
void partialMatch();
|
||||
void globalMatch_data();
|
||||
void globalMatch();
|
||||
void serialize_data();
|
||||
void serialize();
|
||||
void operatoreq_data();
|
||||
void operatoreq();
|
||||
void captureCount_data();
|
||||
void captureCount();
|
||||
|
||||
private:
|
||||
void provideRegularExpressions();
|
||||
};
|
||||
#include "tst_qregularexpression.h"
|
||||
|
||||
struct Match
|
||||
{
|
||||
|
|
@ -1229,8 +1196,3 @@ void tst_QRegularExpression::captureCount()
|
|||
if (!re.isValid())
|
||||
QCOMPARE(re.captureCount(), -1);
|
||||
}
|
||||
|
||||
QTEST_APPLESS_MAIN(tst_QRegularExpression)
|
||||
|
||||
#include "tst_qregularexpression.moc"
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,77 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 Giuseppe D'Angelo <dangelog@gmail.com>.
|
||||
** Contact: http://www.qt-project.org/
|
||||
**
|
||||
** This file is part of the test suite of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include <qobject.h>
|
||||
#include <qregularexpression.h>
|
||||
|
||||
Q_DECLARE_METATYPE(QRegularExpression::PatternOptions)
|
||||
Q_DECLARE_METATYPE(QRegularExpression::MatchType)
|
||||
Q_DECLARE_METATYPE(QRegularExpression::MatchOptions)
|
||||
|
||||
class tst_QRegularExpression : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private slots:
|
||||
void gettersSetters_data();
|
||||
void gettersSetters();
|
||||
void escape_data();
|
||||
void escape();
|
||||
void validity_data();
|
||||
void validity();
|
||||
void patternOptions_data();
|
||||
void patternOptions();
|
||||
void normalMatch_data();
|
||||
void normalMatch();
|
||||
void partialMatch_data();
|
||||
void partialMatch();
|
||||
void globalMatch_data();
|
||||
void globalMatch();
|
||||
void serialize_data();
|
||||
void serialize();
|
||||
void operatoreq_data();
|
||||
void operatoreq();
|
||||
void captureCount_data();
|
||||
void captureCount();
|
||||
|
||||
private:
|
||||
void provideRegularExpressions();
|
||||
};
|
||||
Loading…
Reference in New Issue