Reduce v8engine dependency for the list model
authorLars Knoll <lars.knoll@theqtcompany.com>
Tue, 30 Dec 2014 15:26:18 +0000 (16:26 +0100)
committerLars Knoll <lars.knoll@digia.com>
Thu, 8 Jan 2015 11:34:20 +0000 (12:34 +0100)
Change-Id: Ib9e39a886c918a8f6ee1477465895739f90e1a0a
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
src/qml/jsruntime/qv4serialize.cpp
src/qml/types/qqmllistmodel.cpp
src/qml/types/qqmllistmodel_p.h
src/qml/types/qqmllistmodel_p_p.h
src/qml/types/qqmllistmodelworkeragent.cpp
src/qml/types/qqmllistmodelworkeragent_p.h

index 2b5513f..60b6235 100644 (file)
@@ -364,7 +364,7 @@ ReturnedValue Serialize::deserialize(const char *&data, ExecutionEngine *engine)
         rv->asObject()->defineReadonlyProperty(s, v);
 
         agent->release();
-        agent->setV8Engine(engine->v8Engine);
+        agent->setEngine(engine);
         return rv.asReturnedValue();
     }
     case WorkerSequence:
index 44a64ce..d09be1b 100644 (file)
@@ -388,7 +388,7 @@ void ListModel::updateCacheIndices()
     }
 }
 
-QVariant ListModel::getProperty(int elementIndex, int roleIndex, const QQmlListModel *owner, QV8Engine *eng)
+QVariant ListModel::getProperty(int elementIndex, int roleIndex, const QQmlListModel *owner, QV4::ExecutionEngine *eng)
 {
     ListElement *e = elements[elementIndex];
     const ListLayout::Role &r = m_layout->getExistingRole(roleIndex);
@@ -401,7 +401,7 @@ ListModel *ListModel::getListProperty(int elementIndex, const ListLayout::Role &
     return e->getListProperty(role);
 }
 
-void ListModel::set(int elementIndex, QV4::Object *object, QVector<int> *roles, QV8Engine *eng)
+void ListModel::set(int elementIndex, QV4::Object *object, QVector<int> *roles)
 {
     ListElement *e = elements[elementIndex];
 
@@ -436,7 +436,7 @@ void ListModel::set(int elementIndex, QV4::Object *object, QVector<int> *roles,
             int arrayLength = a->getLength();
             for (int j=0 ; j < arrayLength ; ++j) {
                 o = a->getIndexed(j);
-                subModel->append(o, eng);
+                subModel->append(o);
             }
 
             roleIndex = e->setListProperty(r, subModel);
@@ -457,7 +457,7 @@ void ListModel::set(int elementIndex, QV4::Object *object, QVector<int> *roles,
                 const ListLayout::Role &role = m_layout->getRoleOrCreate(propertyName, ListLayout::Role::VariantMap);
                 if (role.type == ListLayout::Role::VariantMap) {
                     QV4::ScopedObject obj(scope, o);
-                    roleIndex = e->setVariantMapProperty(role, obj, eng);
+                    roleIndex = e->setVariantMapProperty(role, obj);
                 }
             }
         } else if (propertyValue->isNullOrUndefined()) {
@@ -475,7 +475,7 @@ void ListModel::set(int elementIndex, QV4::Object *object, QVector<int> *roles,
     }
 }
 
-void ListModel::set(int elementIndex, QV4::Object *object, QV8Engine *eng)
+void ListModel::set(int elementIndex, QV4::Object *object)
 {
     if (!object)
         return;
@@ -515,7 +515,7 @@ void ListModel::set(int elementIndex, QV4::Object *object, QV8Engine *eng)
                 int arrayLength = a->getLength();
                 for (int j=0 ; j < arrayLength ; ++j) {
                     o = a->getIndexed(j);
-                    subModel->append(o, eng);
+                    subModel->append(o);
                 }
 
                 e->setListPropertyFast(r, subModel);
@@ -542,7 +542,7 @@ void ListModel::set(int elementIndex, QV4::Object *object, QV8Engine *eng)
             } else {
                 const ListLayout::Role &role = m_layout->getRoleOrCreate(propertyName, ListLayout::Role::VariantMap);
                 if (role.type == ListLayout::Role::VariantMap)
-                    e->setVariantMapFast(role, o, eng);
+                    e->setVariantMapFast(role, o);
             }
         } else if (propertyValue->isNullOrUndefined()) {
             const ListLayout::Role *r = m_layout->getExistingRole(propertyName);
@@ -572,16 +572,16 @@ void ListModel::remove(int index, int count)
     updateCacheIndices();
 }
 
-void ListModel::insert(int elementIndex, QV4::Object *object, QV8Engine *eng)
+void ListModel::insert(int elementIndex, QV4::Object *object)
 {
     insertElement(elementIndex);
-    set(elementIndex, object, eng);
+    set(elementIndex, object);
 }
 
-int ListModel::append(QV4::Object *object, QV8Engine *eng)
+int ListModel::append(QV4::Object *object)
 {
     int elementIndex = appendElement();
-    set(elementIndex, object, eng);
+    set(elementIndex, object);
     return elementIndex;
 }
 
@@ -607,7 +607,7 @@ int ListModel::setOrCreateProperty(int elementIndex, const QString &key, const Q
     return roleIndex;
 }
 
-int ListModel::setExistingProperty(int elementIndex, const QString &key, const QV4::ValueRef data, QV8Engine *eng)
+int ListModel::setExistingProperty(int elementIndex, const QString &key, const QV4::ValueRef data, QV4::ExecutionEngine *eng)
 {
     int roleIndex = -1;
 
@@ -701,7 +701,7 @@ ListModel *ListElement::getListProperty(const ListLayout::Role &role)
     return *value;
 }
 
-QVariant ListElement::getProperty(const ListLayout::Role &role, const QQmlListModel *owner, QV8Engine *eng)
+QVariant ListElement::getProperty(const ListLayout::Role &role, const QQmlListModel *owner, QV4::ExecutionEngine *eng)
 {
     char *mem = getPropertyMemory(role);
 
@@ -875,7 +875,7 @@ int ListElement::setQObjectProperty(const ListLayout::Role &role, QObject *o)
     return roleIndex;
 }
 
-int ListElement::setVariantMapProperty(const ListLayout::Role &role, QV4::Object *o, QV8Engine *eng)
+int ListElement::setVariantMapProperty(const ListLayout::Role &role, QV4::Object *o)
 {
     int roleIndex = -1;
 
@@ -885,7 +885,7 @@ int ListElement::setVariantMapProperty(const ListLayout::Role &role, QV4::Object
             QVariantMap *map = reinterpret_cast<QVariantMap *>(mem);
             map->~QMap();
         }
-        new (mem) QVariantMap(eng->variantMapFromJS(o));
+        new (mem) QVariantMap(QV8Engine::variantMapFromJS(o));
         roleIndex = role.index;
     }
 
@@ -962,11 +962,11 @@ void ListElement::setListPropertyFast(const ListLayout::Role &role, ListModel *m
     *value = m;
 }
 
-void ListElement::setVariantMapFast(const ListLayout::Role &role, QV4::Object *o, QV8Engine *eng)
+void ListElement::setVariantMapFast(const ListLayout::Role &role, QV4::Object *o)
 {
     char *mem = getPropertyMemory(role);
     QVariantMap *map = new (mem) QVariantMap;
-    *map = eng->variantMapFromJS(o);
+    *map = QV8Engine::variantMapFromJS(o);
 }
 
 void ListElement::setDateTimePropertyFast(const ListLayout::Role &role, const QDateTime &dt)
@@ -997,7 +997,7 @@ void ListElement::clearProperty(const ListLayout::Role &role)
         setDateTimeProperty(role, QDateTime());
         break;
     case ListLayout::Role::VariantMap:
-        setVariantMapProperty(role, 0);
+        setVariantMapProperty(role, (QVariantMap *)0);
         break;
     default:
         break;
@@ -1163,12 +1163,12 @@ int ListElement::setVariantProperty(const ListLayout::Role &role, const QVariant
     return roleIndex;
 }
 
-int ListElement::setJsProperty(const ListLayout::Role &role, const QV4::ValueRef d, QV8Engine *eng)
+int ListElement::setJsProperty(const ListLayout::Role &role, const QV4::ValueRef d, QV4::ExecutionEngine *eng)
 {
     // Check if this key exists yet
     int roleIndex = -1;
 
-    QV4::Scope scope(QV8Engine::getV4(eng));
+    QV4::Scope scope(eng);
 
     // Add the value now
     if (d->isString()) {
@@ -1186,7 +1186,7 @@ int ListElement::setJsProperty(const ListLayout::Role &role, const QV4::ValueRef
             int arrayLength = a->getLength();
             for (int j=0 ; j < arrayLength ; ++j) {
                 o = a->getIndexed(j);
-                subModel->append(o, eng);
+                subModel->append(o);
             }
             roleIndex = setListProperty(role, subModel);
         } else {
@@ -1205,7 +1205,7 @@ int ListElement::setJsProperty(const ListLayout::Role &role, const QV4::ValueRef
             QObject *o = wrapper->object();
             roleIndex = setQObjectProperty(role, o);
         } else if (role.type == ListLayout::Role::VariantMap) {
-            roleIndex = setVariantMapProperty(role, o, eng);
+            roleIndex = setVariantMapProperty(role, o);
         }
     } else if (d->isNullOrUndefined()) {
         clearProperty(role);
@@ -1258,15 +1258,13 @@ void ModelNodeMetaObject::propertyWritten(int index)
     if (!m_enabled)
         return;
 
-    QV8Engine *eng = m_obj->m_model->engine();
-
     QString propName = QString::fromUtf8(name(index));
     QVariant value = operator[](index);
 
-    QV4::Scope scope(QV8Engine::getV4((eng)));
+    QV4::Scope scope(m_obj->m_model->engine());
     QV4::ScopedValue v(scope, QV8Engine::fromVariant(scope.engine, value));
 
-    int roleIndex = m_obj->m_model->m_listModel->setExistingProperty(m_obj->m_elementIndex, propName, v, eng);
+    int roleIndex = m_obj->m_model->m_listModel->setExistingProperty(m_obj->m_elementIndex, propName, v, scope.engine);
     if (roleIndex != -1) {
         QVector<int> roles;
         roles << roleIndex;
@@ -1542,7 +1540,7 @@ QQmlListModel::QQmlListModel(QObject *parent)
     m_engine = 0;
 }
 
-QQmlListModel::QQmlListModel(const QQmlListModel *owner, ListModel *data, QV8Engine *eng, QObject *parent)
+QQmlListModel::QQmlListModel(const QQmlListModel *owner, ListModel *data, QV4::ExecutionEngine *engine, QObject *parent)
 : QAbstractListModel(parent)
 {
     m_mainThread = owner->m_mainThread;
@@ -1554,7 +1552,7 @@ QQmlListModel::QQmlListModel(const QQmlListModel *owner, ListModel *data, QV8Eng
     m_layout = 0;
     m_listModel = data;
 
-    m_engine = eng;
+    m_engine = engine;
 }
 
 QQmlListModel::QQmlListModel(QQmlListModel *orig, QQmlListModelWorkerAgent *agent)
@@ -1614,10 +1612,10 @@ QQmlListModel *QQmlListModel::createWithOwner(QQmlListModel *newOwner)
     return model;
 }
 
-QV8Engine *QQmlListModel::engine() const
+QV4::ExecutionEngine *QQmlListModel::engine() const
 {
     if (m_engine == 0) {
-        m_engine  = QQmlEnginePrivate::getV8Engine(qmlEngine(this));
+        m_engine  = QQmlEnginePrivate::get(qmlEngine(this))->v4engine();
     }
 
     return m_engine;
@@ -1985,9 +1983,9 @@ void QQmlListModel::insert(QQmlV4Function *args)
                 argObject = objectArray->getIndexed(i);
 
                 if (m_dynamicRoles) {
-                    m_modelObjects.insert(index+i, DynamicRoleModelNode::create(args->engine()->variantMapFromJS(argObject), this));
+                    m_modelObjects.insert(index+i, DynamicRoleModelNode::create(QV8Engine::variantMapFromJS(argObject), this));
                 } else {
-                    m_listModel->insert(index+i, argObject, args->engine());
+                    m_listModel->insert(index+i, argObject);
                 }
             }
             emitItemsInserted(index, objectArrayLength);
@@ -1995,9 +1993,9 @@ void QQmlListModel::insert(QQmlV4Function *args)
             emitItemsAboutToBeInserted(index, 1);
 
             if (m_dynamicRoles) {
-                m_modelObjects.insert(index, DynamicRoleModelNode::create(args->engine()->variantMapFromJS(argObject), this));
+                m_modelObjects.insert(index, DynamicRoleModelNode::create(QV8Engine::variantMapFromJS(argObject), this));
             } else {
-                m_listModel->insert(index, argObject, args->engine());
+                m_listModel->insert(index, argObject);
             }
 
             emitItemsInserted(index, 1);
@@ -2095,9 +2093,9 @@ void QQmlListModel::append(QQmlV4Function *args)
                 argObject = objectArray->getIndexed(i);
 
                 if (m_dynamicRoles) {
-                    m_modelObjects.append(DynamicRoleModelNode::create(args->engine()->variantMapFromJS(argObject), this));
+                    m_modelObjects.append(DynamicRoleModelNode::create(QV8Engine::variantMapFromJS(argObject), this));
                 } else {
-                    m_listModel->append(argObject, args->engine());
+                    m_listModel->append(argObject);
                 }
             }
 
@@ -2108,11 +2106,11 @@ void QQmlListModel::append(QQmlV4Function *args)
             if (m_dynamicRoles) {
                 index = m_modelObjects.count();
                 emitItemsAboutToBeInserted(index, 1);
-                m_modelObjects.append(DynamicRoleModelNode::create(args->engine()->variantMapFromJS(argObject), this));
+                m_modelObjects.append(DynamicRoleModelNode::create(QV8Engine::variantMapFromJS(argObject), this));
             } else {
                 index = m_listModel->elementCount();
                 emitItemsAboutToBeInserted(index, 1);
-                m_listModel->append(argObject, args->engine());
+                m_listModel->append(argObject);
             }
 
             emitItemsInserted(index, 1);
@@ -2157,18 +2155,17 @@ void QQmlListModel::append(QQmlV4Function *args)
 */
 QQmlV4Handle QQmlListModel::get(int index) const
 {
-    QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine());
-    QV4::Scope scope(v4);
+    QV4::Scope scope(engine());
     QV4::ScopedValue result(scope, QV4::Primitive::undefinedValue());
 
     if (index >= 0 && index < count()) {
 
         if (m_dynamicRoles) {
             DynamicRoleModelNode *object = m_modelObjects[index];
-            result = QV4::QObjectWrapper::wrap(v4, object);
+            result = QV4::QObjectWrapper::wrap(scope.engine, object);
         } else {
             ModelObject *object = m_listModel->getOrCreateModelObject(const_cast<QQmlListModel *>(this), index);
-            result = QV4::QObjectWrapper::wrap(v4, object);
+            result = QV4::QObjectWrapper::wrap(scope.engine, object);
         }
     }
 
@@ -2193,7 +2190,7 @@ QQmlV4Handle QQmlListModel::get(int index) const
 */
 void QQmlListModel::set(int index, const QQmlV4Handle &handle)
 {
-    QV4::Scope scope(QV8Engine::getV4(engine()));
+    QV4::Scope scope(engine());
     QV4::ScopedObject object(scope, handle);
 
     if (!object) {
@@ -2210,9 +2207,9 @@ void QQmlListModel::set(int index, const QQmlV4Handle &handle)
         emitItemsAboutToBeInserted(index, 1);
 
         if (m_dynamicRoles) {
-            m_modelObjects.append(DynamicRoleModelNode::create(engine()->variantMapFromJS(object), this));
+            m_modelObjects.append(DynamicRoleModelNode::create(QV8Engine::variantMapFromJS(object), this));
         } else {
-            m_listModel->insert(index, object, engine());
+            m_listModel->insert(index, object);
         }
 
         emitItemsInserted(index, 1);
@@ -2221,9 +2218,9 @@ void QQmlListModel::set(int index, const QQmlV4Handle &handle)
         QVector<int> roles;
 
         if (m_dynamicRoles) {
-            m_modelObjects[index]->updateValues(engine()->variantMapFromJS(object), roles);
+            m_modelObjects[index]->updateValues(QV8Engine::variantMapFromJS(object), roles);
         } else {
-            m_listModel->set(index, object, &roles, engine());
+            m_listModel->set(index, object, &roles);
         }
 
         if (roles.count())
@@ -2414,8 +2411,7 @@ void QQmlListModelParser::applyBindings(QObject *obj, QQmlCompiledData *cdata, c
 {
     QQmlListModel *rv = static_cast<QQmlListModel *>(obj);
 
-    QV8Engine *engine = QQmlEnginePrivate::getV8Engine(qmlEngine(rv));
-    rv->m_engine = engine;
+    rv->m_engine = QV8Engine::getV4(qmlEngine(rv));
 
     const QV4::CompiledData::Unit *qmlUnit = cdata->compilationUnit->data;
 
index debe7ee..4dfd202 100644 (file)
@@ -44,7 +44,7 @@
 #include <QtCore/QVariant>
 #include <QtCore/qabstractitemmodel.h>
 
-#include <private/qv8engine_p.h>
+#include <private/qv4engine_p.h>
 #include <private/qpodvector_p.h>
 
 QT_BEGIN_NAMESPACE
@@ -102,14 +102,14 @@ private:
 
     // Constructs a flat list model for a worker agent
     QQmlListModel(QQmlListModel *orig, QQmlListModelWorkerAgent *agent);
-    QQmlListModel(const QQmlListModel *owner, ListModel *data, QV8Engine *eng, QObject *parent=0);
+    QQmlListModel(const QQmlListModel *owner, ListModel *data, QV4::ExecutionEngine *engine, QObject *parent=0);
 
-    QV8Engine *engine() const;
+    QV4::ExecutionEngine *engine() const;
 
     inline bool canMove(int from, int to, int n) const { return !(from+n > count() || to+n > count() || from < 0 || to < 0 || n < 0); }
 
     QQmlListModelWorkerAgent *m_agent;
-    mutable QV8Engine *m_engine;
+    mutable QV4::ExecutionEngine *m_engine;
     bool m_mainThread;
     bool m_primary;
 
index 9e70e6a..36d192f 100644 (file)
@@ -245,14 +245,14 @@ private:
 
     int setVariantProperty(const ListLayout::Role &role, const QVariant &d);
 
-    int setJsProperty(const ListLayout::Role &role, const QV4::ValueRef d, QV8Engine *eng);
+    int setJsProperty(const ListLayout::Role &role, const QV4::ValueRef d, QV4::ExecutionEngine *eng);
 
     int setStringProperty(const ListLayout::Role &role, const QString &s);
     int setDoubleProperty(const ListLayout::Role &role, double n);
     int setBoolProperty(const ListLayout::Role &role, bool b);
     int setListProperty(const ListLayout::Role &role, ListModel *m);
     int setQObjectProperty(const ListLayout::Role &role, QObject *o);
-    int setVariantMapProperty(const ListLayout::Role &role, QV4::Object *o, QV8Engine *eng);
+    int setVariantMapProperty(const ListLayout::Role &role, QV4::Object *o);
     int setVariantMapProperty(const ListLayout::Role &role, QVariantMap *m);
     int setDateTimeProperty(const ListLayout::Role &role, const QDateTime &dt);
 
@@ -261,12 +261,12 @@ private:
     void setBoolPropertyFast(const ListLayout::Role &role, bool b);
     void setQObjectPropertyFast(const ListLayout::Role &role, QObject *o);
     void setListPropertyFast(const ListLayout::Role &role, ListModel *m);
-    void setVariantMapFast(const ListLayout::Role &role, QV4::Object *o, QV8Engine *eng);
+    void setVariantMapFast(const ListLayout::Role &role, QV4::Object *o);
     void setDateTimePropertyFast(const ListLayout::Role &role, const QDateTime &dt);
 
     void clearProperty(const ListLayout::Role &role);
 
-    QVariant getProperty(const ListLayout::Role &role, const QQmlListModel *owner, QV8Engine *eng);
+    QVariant getProperty(const ListLayout::Role &role, const QQmlListModel *owner, QV4::ExecutionEngine *eng);
     ListModel *getListProperty(const ListLayout::Role &role);
     QString *getStringProperty(const ListLayout::Role &role);
     QObject *getQObjectProperty(const ListLayout::Role &role);
@@ -300,9 +300,9 @@ public:
     void destroy();
 
     int setOrCreateProperty(int elementIndex, const QString &key, const QVariant &data);
-    int setExistingProperty(int uid, const QString &key, const QV4::ValueRef data, QV8Engine *eng);
+    int setExistingProperty(int uid, const QString &key, const QV4::ValueRef data, QV4::ExecutionEngine *eng);
 
-    QVariant getProperty(int elementIndex, int roleIndex, const QQmlListModel *owner, QV8Engine *eng);
+    QVariant getProperty(int elementIndex, int roleIndex, const QQmlListModel *owner, QV4::ExecutionEngine *eng);
     ListModel *getListProperty(int elementIndex, const ListLayout::Role &role);
 
     int roleCount() const
@@ -325,11 +325,11 @@ public:
         return elements.count();
     }
 
-    void set(int elementIndex, QV4::Object *object, QVector<int> *roles, QV8Engine *eng);
-    void set(int elementIndex, QV4::Object *object, QV8Engine *eng);
+    void set(int elementIndex, QV4::Object *object, QVector<int> *roles);
+    void set(int elementIndex, QV4::Object *object);
 
-    int append(QV4::Object *object, QV8Engine *eng);
-    void insert(int elementIndex, QV4::Object *object, QV8Engine *eng);
+    int append(QV4::Object *object);
+    void insert(int elementIndex, QV4::Object *object);
 
     void clear();
     void remove(int index, int count);
index 35369bf..05a5172 100644 (file)
@@ -91,7 +91,7 @@ QQmlListModelWorkerAgent::~QQmlListModelWorkerAgent()
     mutex.unlock();
 }
 
-void QQmlListModelWorkerAgent::setV8Engine(QV8Engine *eng)
+void QQmlListModelWorkerAgent::setEngine(QV4::ExecutionEngine *eng)
 {
     m_copy->m_engine = eng;
 }
index 7a8f6e6..ecee48e 100644 (file)
@@ -65,7 +65,7 @@ class QQmlListModelWorkerAgent : public QObject
 public:
     QQmlListModelWorkerAgent(QQmlListModel *);
     ~QQmlListModelWorkerAgent();
-    void setV8Engine(QV8Engine *eng);
+    void setEngine(QV4::ExecutionEngine *eng);
 
     void addref();
     void release();