Convert QV8Engine::illegalNames() to use the identifier hash
authorLars Knoll <lars.knoll@digia.com>
Thu, 27 Jun 2013 20:43:47 +0000 (22:43 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Fri, 28 Jun 2013 12:56:26 +0000 (14:56 +0200)
Change-Id: I436c2a17e417cb311f10290a4cc6e5b728b4b7be
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
src/qml/qml/qqmlboundsignal.cpp
src/qml/qml/qqmlcompiler.cpp
src/qml/qml/qqmlpropertycache.cpp
src/qml/qml/qqmlrewrite.cpp
src/qml/qml/qqmlrewrite_p.h
src/qml/qml/v4/qv4identifier.cpp
src/qml/qml/v8/qv8engine.cpp
src/qml/qml/v8/qv8engine_p.h

index 7e54927..e79aaef 100644 (file)
@@ -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;
index 841ad7a..386255a 100644 (file)
@@ -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"));
     }
 
index d047de7..908ab27 100644 (file)
@@ -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());
 
index af168f7..7af447a 100644 (file)
@@ -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);
index 127c081..7cd283f 100644 (file)
@@ -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;
index e2b9658..52afb26 100644 (file)
@@ -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));
 }
 
index 51605ce..859685a 100644 (file)
@@ -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);
     }
 
     {
index c1244d2..4c2cccd 100644 (file)
@@ -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;