aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2013-06-27 22:43:47 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-06-28 14:56:26 +0200
commitb83abcb398c2c449bfa4ada2172e890b56b8602c (patch)
tree19f4f6ed3af874dc0b539fc04f1a17b70fe40a75
parentde7d66ba0295eba73d509e671fdda69a9bef39a6 (diff)
Convert QV8Engine::illegalNames() to use the identifier hash
Change-Id: I436c2a17e417cb311f10290a4cc6e5b728b4b7be Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
-rw-r--r--src/qml/qml/qqmlboundsignal.cpp2
-rw-r--r--src/qml/qml/qqmlcompiler.cpp10
-rw-r--r--src/qml/qml/qqmlpropertycache.cpp2
-rw-r--r--src/qml/qml/qqmlrewrite.cpp29
-rw-r--r--src/qml/qml/qqmlrewrite_p.h17
-rw-r--r--src/qml/qml/v4/qv4identifier.cpp6
-rw-r--r--src/qml/qml/v8/qv8engine.cpp5
-rw-r--r--src/qml/qml/v8/qv8engine_p.h5
8 files changed, 36 insertions, 40 deletions
diff --git a/src/qml/qml/qqmlboundsignal.cpp b/src/qml/qml/qqmlboundsignal.cpp
index 7e549275e2..e79aaefe1e 100644
--- a/src/qml/qml/qqmlboundsignal.cpp
+++ b/src/qml/qml/qqmlboundsignal.cpp
@@ -164,7 +164,7 @@ void QQmlBoundSignalExpression::evaluate(void **a)
//TODO: look at using the property cache here (as in the compiler)
// for further optimization
QMetaMethod signal = QMetaObjectPrivate::signal(m_target->metaObject(), m_index);
- QQmlRewrite::RewriteSignalHandler rewriter;
+ QQmlRewrite::RewriteSignalHandler rewriter(ep->v4engine());
QString expression;
bool ok = true;
diff --git a/src/qml/qml/qqmlcompiler.cpp b/src/qml/qml/qqmlcompiler.cpp
index 841ad7a1f4..386255a89b 100644
--- a/src/qml/qml/qqmlcompiler.cpp
+++ b/src/qml/qml/qqmlcompiler.cpp
@@ -1315,7 +1315,7 @@ void QQmlCompiler::genObjectBody(QQmlScript::Object *obj)
store.signalIndex = prop->index;
const QList<QByteArray> &parameterNameList = obj->metatype->signalParameterNames(prop->index);
- QQmlRewrite::RewriteSignalHandler rewriter;
+ QQmlRewrite::RewriteSignalHandler rewriter(enginePrivate->v4engine());
int count = 0;
const QString &rewrite = rewriter(v->value.asAST(), v->value.asScript(),
prop->name().toString(),
@@ -2628,7 +2628,7 @@ int QQmlCompiler::bindingIdentifier(const Variant &value)
QString QQmlCompiler::rewriteSignalHandler(const QQmlScript::Variant& value, const QString &name)
{
- QQmlRewrite::RewriteSignalHandler rewriteSignalHandler;
+ QQmlRewrite::RewriteSignalHandler rewriteSignalHandler(enginePrivate->v4engine());
return rewriteSignalHandler(value.asAST(), value.asScript(), name);
}
@@ -2670,7 +2670,7 @@ bool QQmlCompiler::checkDynamicMeta(QQmlScript::Object *obj)
tr("Property names cannot begin with an upper case letter"));
}
- if (enginePrivate->v8engine()->illegalNames().contains(prop.name)) {
+ if (enginePrivate->v8engine()->illegalNames().contains(prop.name.toString())) {
COMPILE_EXCEPTION_LOCATION(prop.nameLocation.line,
prop.nameLocation.column,
tr("Illegal property name"));
@@ -2690,7 +2690,7 @@ bool QQmlCompiler::checkDynamicMeta(QQmlScript::Object *obj)
if (currSig.name.at(0).isUpper())
COMPILE_EXCEPTION(&currSig, tr("Signal names cannot begin with an upper case letter"));
- if (enginePrivate->v8engine()->illegalNames().contains(currSig.name))
+ if (enginePrivate->v8engine()->illegalNames().contains(currSig.name.toString()))
COMPILE_EXCEPTION(&currSig, tr("Illegal signal name"));
}
@@ -2712,7 +2712,7 @@ bool QQmlCompiler::checkDynamicMeta(QQmlScript::Object *obj)
if (currSlot.name.at(0).isUpper())
COMPILE_EXCEPTION(&currSlot, tr("Method names cannot begin with an upper case letter"));
- if (enginePrivate->v8engine()->illegalNames().contains(currSlot.name))
+ if (enginePrivate->v8engine()->illegalNames().contains(currSlot.name.toString()))
COMPILE_EXCEPTION(&currSlot, tr("Illegal method name"));
}
diff --git a/src/qml/qml/qqmlpropertycache.cpp b/src/qml/qml/qqmlpropertycache.cpp
index d047de7e0e..908ab27563 100644
--- a/src/qml/qml/qqmlpropertycache.cpp
+++ b/src/qml/qml/qqmlpropertycache.cpp
@@ -1121,8 +1121,8 @@ QString QQmlPropertyCache::signalParameterStringForJS(int index, int *count, QSt
signalData->arguments = args;
}
- QQmlRewrite::RewriteSignalHandler rewriter;
QQmlEnginePrivate *ep = QQmlEnginePrivate::get(engine);
+ QQmlRewrite::RewriteSignalHandler rewriter(ep->v4engine());
const QString &parameters = rewriter.createParameterString(parameterNameList,
ep->v8engine()->illegalNames());
diff --git a/src/qml/qml/qqmlrewrite.cpp b/src/qml/qml/qqmlrewrite.cpp
index af168f7c48..7af447ac92 100644
--- a/src/qml/qml/qqmlrewrite.cpp
+++ b/src/qml/qml/qqmlrewrite.cpp
@@ -209,10 +209,11 @@ bool SharedBindingTester::visit(AST::BinaryExpression *e)
to perform a second rewrite with the parameter information (using createParameterString)
once the target object is known.
*/
-RewriteSignalHandler::RewriteSignalHandler()
+RewriteSignalHandler::RewriteSignalHandler(QV4::ExecutionEngine *engine)
: _writer(0)
, _code(0)
, _position(0)
+ , _parameterNames(engine)
, _parameterAccess(UnknownAccess)
, _parameterCountForJS(0)
{
@@ -238,7 +239,7 @@ bool RewriteSignalHandler::visit(AST::IdentifierExpression *e)
return false;
static const QString argumentsString = QStringLiteral("arguments");
- if (_parameterNames.contains(e->name) || e->name == argumentsString)
+ if (_parameterNames.contains(e->name.toString()) || e->name == argumentsString)
_parameterAccess = ParametersAccessed;
return false;
}
@@ -261,22 +262,12 @@ static inline QString msgGlobalErrorString(const QString &p)
//create a parameter string which can be inserted into a generic rewrite
QString RewriteSignalHandler::createParameterString(const QList<QByteArray> &parameterNameList,
- const QStringHash<bool> &illegalNames)
-{
- QList<QHashedString> hashedParameterNameList;
- for (int i = 0; i < parameterNameList.count(); ++i)
- hashedParameterNameList.append(QString::fromUtf8(parameterNameList.at(i).constData()));
-
- return createParameterString(hashedParameterNameList, illegalNames);
-}
-
-QString RewriteSignalHandler::createParameterString(const QList<QHashedString> &parameterNameList,
- const QStringHash<bool> &illegalNames)
+ const QV4::IdentifierHash<bool> &illegalNames)
{
QString parameters;
bool unnamedParam = false;
for (int i = 0; i < parameterNameList.count(); ++i) {
- const QHashedString &param = parameterNameList.at(i);
+ QString param = QString::fromUtf8(parameterNameList.at(i));
if (param.isEmpty())
unnamedParam = true;
else if (unnamedParam)
@@ -304,7 +295,7 @@ QString RewriteSignalHandler::createParameterString(const QList<QHashedString> &
QString RewriteSignalHandler::operator()(QQmlJS::AST::Node *node, const QString &code, const QString &name,
const QString &parameterString,
const QList<QByteArray> &parameterNameList,
- const QStringHash<bool> &illegalNames)
+ const QV4::IdentifierHash<bool> &illegalNames)
{
if (rewriteDump()) {
qWarning() << "=============================================================";
@@ -321,10 +312,10 @@ QString RewriteSignalHandler::operator()(QQmlJS::AST::Node *node, const QString
if (!parameterNameList.isEmpty()) {
for (int i = 0; i < parameterNameList.count(); ++i) {
- QHashedString param(QString::fromUtf8(parameterNameList.at(i).constData()));
- _parameterNames.insert(param, i);
+ QString param(QString::fromUtf8(parameterNameList.at(i).constData()));
+ _parameterNames.add(param, i);
if (!hasParameterString)
- _parameterNameList.append(param);
+ _parameterNameList.append(parameterNameList.at(i));
}
//this is set to Unaccessed here, and will be set to Accessed
@@ -358,7 +349,7 @@ QString RewriteSignalHandler::operator()(QQmlJS::AST::Node *node, const QString
QString RewriteSignalHandler::operator()(const QString &code, const QString &name, bool *ok,
const QList<QByteArray> &parameterNameList,
- const QStringHash<bool> &illegalNames)
+ const QV4::IdentifierHash<bool> &illegalNames)
{
Engine engine;
Lexer lexer(&engine);
diff --git a/src/qml/qml/qqmlrewrite_p.h b/src/qml/qml/qqmlrewrite_p.h
index 127c0811cc..7cd283f1d9 100644
--- a/src/qml/qml/qqmlrewrite_p.h
+++ b/src/qml/qml/qqmlrewrite_p.h
@@ -57,7 +57,7 @@
#include <private/qqmljslexer_p.h>
#include <private/qqmljsparser_p.h>
#include <private/qqmljsmemorypool_p.h>
-#include <private/qhashedstring_p.h>
+#include <private/qv4identifier_p.h>
QT_BEGIN_NAMESPACE
@@ -91,14 +91,14 @@ public:
class RewriteSignalHandler: protected AST::Visitor
{
public:
- RewriteSignalHandler();
+ RewriteSignalHandler(QV4::ExecutionEngine *engine);
QString operator()(QQmlJS::AST::Node *node, const QString &code, const QString &name,
const QString &parameterString = QString(),
const QList<QByteArray> &parameterNameList = QList<QByteArray>(),
- const QStringHash<bool> &illegalNames = QStringHash<bool>());
+ const QV4::IdentifierHash<bool> &illegalNames = QV4::IdentifierHash<bool>());
QString operator()(const QString &code, const QString &name, bool *ok = 0,
const QList<QByteArray> &parameterNameList = QList<QByteArray>(),
- const QStringHash<bool> &illegalNames = QStringHash<bool>());
+ const QV4::IdentifierHash<bool> &illegalNames = QV4::IdentifierHash<bool>());
enum ParameterAccess {
ParametersAccessed,
@@ -110,7 +110,7 @@ public:
int parameterCountForJS() const { return _parameterCountForJS; }
ParameterAccess parameterAccess() const { return _parameterAccess; }
QString createParameterString(const QList<QByteArray> &parameterNameList,
- const QStringHash<bool> &illegalNames);
+ const QV4::IdentifierHash<bool> &illegalNames);
bool hasParameterError() { return !_error.isEmpty(); }
QString parameterError() const { return _error; }
@@ -124,14 +124,11 @@ protected:
virtual bool visit(AST::IdentifierExpression *);
private:
- QString createParameterString(const QList<QHashedString> &parameterNameList,
- const QStringHash<bool> &illegalNames);
-
TextWriter *_writer;
const QString *_code;
int _position;
- QStringHash<int> _parameterNames;
- QList<QHashedString> _parameterNameList;
+ QV4::IdentifierHash<int> _parameterNames;
+ QList<QByteArray> _parameterNameList;
ParameterAccess _parameterAccess;
int _parameterCountForJS;
QString _error;
diff --git a/src/qml/qml/v4/qv4identifier.cpp b/src/qml/qml/v4/qv4identifier.cpp
index e2b9658d62..52afb2667d 100644
--- a/src/qml/qml/v4/qv4identifier.cpp
+++ b/src/qml/qml/v4/qv4identifier.cpp
@@ -111,6 +111,8 @@ IdentifierHashEntry *IdentifierHashBase::addEntry(const Identifier *identifier)
const IdentifierHashEntry *IdentifierHashBase::lookup(const Identifier *identifier) const
{
+ if (!d)
+ return 0;
assert(d->entries);
uint idx = Identifier::hash(identifier) % d->alloc;
@@ -126,11 +128,15 @@ const IdentifierHashEntry *IdentifierHashBase::lookup(const Identifier *identifi
const IdentifierHashEntry *IdentifierHashBase::lookup(const QString &str) const
{
+ if (!d)
+ return 0;
return lookup(d->identifierTable->identifier(str));
}
const IdentifierHashEntry *IdentifierHashBase::lookup(String *str) const
{
+ if (!d)
+ return 0;
return lookup(d->identifierTable->identifier(str));
}
diff --git a/src/qml/qml/v8/qv8engine.cpp b/src/qml/qml/v8/qv8engine.cpp
index 51605cead7..859685a141 100644
--- a/src/qml/qml/v8/qv8engine.cpp
+++ b/src/qml/qml/v8/qv8engine.cpp
@@ -338,7 +338,7 @@ QNetworkAccessManager *QV8Engine::networkAccessManager()
return QQmlEnginePrivate::get(m_engine)->getNetworkAccessManager();
}
-const QStringHash<bool> &QV8Engine::illegalNames() const
+const QV4::IdentifierHash<bool> &QV8Engine::illegalNames() const
{
return m_illegalNames;
}
@@ -407,8 +407,9 @@ void QV8Engine::initializeGlobal()
qt_add_sqlexceptions(m_v4Engine);
{
+ m_illegalNames = QV4::IdentifierHash<bool>(m_v4Engine);
for (uint i = 0; i < m_v4Engine->globalObject->internalClass->size; ++i)
- m_illegalNames.insert(m_v4Engine->globalObject->internalClass->nameMap.at(i)->toQString(), true);
+ m_illegalNames.add(m_v4Engine->globalObject->internalClass->nameMap.at(i)->toQString(), true);
}
{
diff --git a/src/qml/qml/v8/qv8engine_p.h b/src/qml/qml/v8/qv8engine_p.h
index c1244d2005..4c2cccd28d 100644
--- a/src/qml/qml/v8/qv8engine_p.h
+++ b/src/qml/qml/v8/qv8engine_p.h
@@ -72,6 +72,7 @@
#include <private/qv4qobjectwrapper_p.h>
#include <private/qv4value_p.h>
#include <private/qv4object_p.h>
+#include <private/qv4identifier_p.h>
QT_BEGIN_NAMESPACE
@@ -222,7 +223,7 @@ public:
virtual QNetworkAccessManager *networkAccessManager();
// Return the list of illegal id names (the names of the properties on the global object)
- const QStringHash<bool> &illegalNames() const;
+ const QV4::IdentifierHash<bool> &illegalNames() const;
inline void collectGarbage() { gc(); }
void gc();
@@ -274,7 +275,7 @@ protected:
QVector<Deletable *> m_extensionData;
Deletable *m_listModelData;
- QStringHash<bool> m_illegalNames;
+ QV4::IdentifierHash<bool> m_illegalNames;
QElapsedTimer m_time;
QHash<QString, qint64> m_startedTimers;