From b83abcb398c2c449bfa4ada2172e890b56b8602c Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Thu, 27 Jun 2013 22:43:47 +0200 Subject: [PATCH] Convert QV8Engine::illegalNames() to use the identifier hash Change-Id: I436c2a17e417cb311f10290a4cc6e5b728b4b7be Reviewed-by: Simon Hausmann --- src/qml/qml/qqmlboundsignal.cpp | 2 +- src/qml/qml/qqmlcompiler.cpp | 10 +++++----- src/qml/qml/qqmlpropertycache.cpp | 2 +- src/qml/qml/qqmlrewrite.cpp | 29 ++++++++++------------------- src/qml/qml/qqmlrewrite_p.h | 17 +++++++---------- src/qml/qml/v4/qv4identifier.cpp | 6 ++++++ src/qml/qml/v8/qv8engine.cpp | 5 +++-- src/qml/qml/v8/qv8engine_p.h | 5 +++-- 8 files changed, 36 insertions(+), 40 deletions(-) diff --git a/src/qml/qml/qqmlboundsignal.cpp b/src/qml/qml/qqmlboundsignal.cpp index 7e54927..e79aaef 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 841ad7a..386255a 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 ¶meterNameList = 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 d047de7..908ab27 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 ¶meters = rewriter.createParameterString(parameterNameList, ep->v8engine()->illegalNames()); diff --git a/src/qml/qml/qqmlrewrite.cpp b/src/qml/qml/qqmlrewrite.cpp index af168f7..7af447a 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 ¶meterNameList, - const QStringHash &illegalNames) -{ - QList 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 ¶meterNameList, - const QStringHash &illegalNames) + const QV4::IdentifierHash &illegalNames) { QString parameters; bool unnamedParam = false; for (int i = 0; i < parameterNameList.count(); ++i) { - const QHashedString ¶m = 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 & QString RewriteSignalHandler::operator()(QQmlJS::AST::Node *node, const QString &code, const QString &name, const QString ¶meterString, const QList ¶meterNameList, - const QStringHash &illegalNames) + const QV4::IdentifierHash &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 ¶meterNameList, - const QStringHash &illegalNames) + const QV4::IdentifierHash &illegalNames) { Engine engine; Lexer lexer(&engine); diff --git a/src/qml/qml/qqmlrewrite_p.h b/src/qml/qml/qqmlrewrite_p.h index 127c081..7cd283f 100644 --- a/src/qml/qml/qqmlrewrite_p.h +++ b/src/qml/qml/qqmlrewrite_p.h @@ -57,7 +57,7 @@ #include #include #include -#include +#include 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 ¶meterString = QString(), const QList ¶meterNameList = QList(), - const QStringHash &illegalNames = QStringHash()); + const QV4::IdentifierHash &illegalNames = QV4::IdentifierHash()); QString operator()(const QString &code, const QString &name, bool *ok = 0, const QList ¶meterNameList = QList(), - const QStringHash &illegalNames = QStringHash()); + const QV4::IdentifierHash &illegalNames = QV4::IdentifierHash()); enum ParameterAccess { ParametersAccessed, @@ -110,7 +110,7 @@ public: int parameterCountForJS() const { return _parameterCountForJS; } ParameterAccess parameterAccess() const { return _parameterAccess; } QString createParameterString(const QList ¶meterNameList, - const QStringHash &illegalNames); + const QV4::IdentifierHash &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 ¶meterNameList, - const QStringHash &illegalNames); - TextWriter *_writer; const QString *_code; int _position; - QStringHash _parameterNames; - QList _parameterNameList; + QV4::IdentifierHash _parameterNames; + QList _parameterNameList; ParameterAccess _parameterAccess; int _parameterCountForJS; QString _error; diff --git a/src/qml/qml/v4/qv4identifier.cpp b/src/qml/qml/v4/qv4identifier.cpp index e2b9658..52afb26 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 51605ce..859685a 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 &QV8Engine::illegalNames() const +const QV4::IdentifierHash &QV8Engine::illegalNames() const { return m_illegalNames; } @@ -407,8 +407,9 @@ void QV8Engine::initializeGlobal() qt_add_sqlexceptions(m_v4Engine); { + m_illegalNames = QV4::IdentifierHash(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 c1244d2..4c2cccd 100644 --- a/src/qml/qml/v8/qv8engine_p.h +++ b/src/qml/qml/v8/qv8engine_p.h @@ -72,6 +72,7 @@ #include #include #include +#include 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 &illegalNames() const; + const QV4::IdentifierHash &illegalNames() const; inline void collectGarbage() { gc(); } void gc(); @@ -274,7 +275,7 @@ protected: QVector m_extensionData; Deletable *m_listModelData; - QStringHash m_illegalNames; + QV4::IdentifierHash m_illegalNames; QElapsedTimer m_time; QHash m_startedTimers; -- 2.7.4