revert_c9ffed92
authorDebian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>
Sun, 6 Nov 2016 14:01:42 +0000 (14:01 +0000)
committerDmitry Shachnev <mitya57@debian.org>
Sun, 6 Nov 2016 14:01:42 +0000 (14:01 +0000)
Gbp-Pq: Name revert_c9ffed92.diff

13 files changed:
src/qml/jsruntime/qv4qobjectwrapper.cpp
src/qml/jsruntime/qv4qobjectwrapper_p.h
src/qml/qml/qqmldata_p.h
src/qml/qml/qqmlengine.cpp
src/qml/qml/qqmlpropertycache.cpp
src/qml/qml/qqmlpropertycache_p.h
src/quick/items/qquickitem.cpp
src/quick/items/qquickitem.h
src/quick/items/qquickitem_p.h
src/quick/items/qquickview.cpp
src/quick/items/qquickview_p.h
src/quick/items/qquickwindowmodule.cpp
tests/auto/quick/qquickitem/tst_qquickitem.cpp

index 2c9fc8f9dd6c5a414c2d25168270b6155b8da1c9..612b204e3147843f6b06e35a4d4e01fc531b4bc3 100644 (file)
@@ -674,14 +674,8 @@ bool QObjectWrapper::isEqualTo(Managed *a, Managed *b)
 
 ReturnedValue QObjectWrapper::create(ExecutionEngine *engine, QObject *object)
 {
-    if (QJSEngine *jsEngine = engine->jsEngine()) {
-        if (QQmlPropertyCache *cache = QQmlData::ensurePropertyCache(jsEngine, object)) {
-            ReturnedValue result = QV4::Encode::null();
-            void *args[] = { &result, &engine };
-            if (cache->callJSFactoryMethod(object, args))
-                return result;
-        }
-    }
+    if (engine->jsEngine())
+        QQmlData::ensurePropertyCache(engine->jsEngine(), object);
     return (engine->memoryManager->allocObject<QV4::QObjectWrapper>(object))->asReturnedValue();
 }
 
index 9c5862b80e8765fbefed9b95f986f16fba0dd300..f101f352f1a8f48b6ce3d44d3e28b57c208fddce 100644 (file)
@@ -77,7 +77,7 @@ namespace Heap {
 
 struct QQmlValueTypeWrapper;
 
-struct Q_QML_EXPORT QObjectWrapper : Object {
+struct QObjectWrapper : Object {
     QObjectWrapper(QObject *object);
     QPointer<QObject> object;
 };
index 7ccab5746dab2b1e39a3e567eb3469a9c8157143..ad2456a68d85b40c9198d582303ecb345fbb7421 100644 (file)
@@ -223,7 +223,7 @@ public:
 
     static inline void flushPendingBinding(QObject *, int coreIndex);
 
-    static QQmlPropertyCache *ensurePropertyCache(QJSEngine *engine, QObject *object);
+    static void ensurePropertyCache(QJSEngine *engine, QObject *object);
 
 private:
     // For attachedProperties
index 71795a2539d99ee53d6c1ef35207ba0dff5f1e90..517324a80fac12178cda6b852de48d32bf7fecd4 100644 (file)
@@ -1800,15 +1800,14 @@ void QQmlData::setPendingBindingBit(QObject *obj, int coreIndex)
     QQmlData_setBit(this, obj, coreIndex * 2 + 1);
 }
 
-QQmlPropertyCache *QQmlData::ensurePropertyCache(QJSEngine *engine, QObject *object)
+void QQmlData::ensurePropertyCache(QJSEngine *engine, QObject *object)
 {
     Q_ASSERT(engine);
     QQmlData *ddata = QQmlData::get(object, /*create*/true);
-    if (!ddata->propertyCache){
-        ddata->propertyCache = QJSEnginePrivate::get(engine)->cache(object);
-        if (ddata->propertyCache) ddata->propertyCache->addref();
-    }
-    return ddata->propertyCache;
+    if (ddata->propertyCache)
+        return;
+    ddata->propertyCache = QJSEnginePrivate::get(engine)->cache(object);
+    if (ddata->propertyCache) ddata->propertyCache->addref();
 }
 
 void QQmlEnginePrivate::sendQuit()
index 9c535b8ce8b6a7549a2a133e7ab0f9364fddd56b..0522aa93ee661d745d5f76716d9f997fbc8ab46c 100644 (file)
@@ -240,7 +240,7 @@ Creates a new empty QQmlPropertyCache.
 QQmlPropertyCache::QQmlPropertyCache(QV4::ExecutionEngine *e)
     : engine(e), _parent(0), propertyIndexCacheStart(0), methodIndexCacheStart(0),
       signalHandlerIndexCacheStart(0), _hasPropertyOverrides(false), _ownMetaObject(false),
-      _metaObject(0), argumentsCache(0), _jsFactoryMethodIndex(-1)
+      _metaObject(0), argumentsCache(0)
 {
     Q_ASSERT(engine);
 }
@@ -251,7 +251,7 @@ Creates a new QQmlPropertyCache of \a metaObject.
 QQmlPropertyCache::QQmlPropertyCache(QV4::ExecutionEngine *e, const QMetaObject *metaObject)
     : engine(e), _parent(0), propertyIndexCacheStart(0), methodIndexCacheStart(0),
       signalHandlerIndexCacheStart(0), _hasPropertyOverrides(false), _ownMetaObject(false),
-      _metaObject(0), argumentsCache(0), _jsFactoryMethodIndex(-1)
+      _metaObject(0), argumentsCache(0)
 {
     Q_ASSERT(engine);
     Q_ASSERT(metaObject);
@@ -524,16 +524,10 @@ void QQmlPropertyCache::append(const QMetaObject *metaObject,
         for (int ii = 0; ii < classInfoCount; ++ii) {
             int idx = ii + classInfoOffset;
 
-            const char * const classInfoName = metaObject->classInfo(idx).name();
-            if (0 == qstrcmp(classInfoName, "qt_HasQmlAccessors")) {
+            if (0 == qstrcmp(metaObject->classInfo(idx).name(), "qt_HasQmlAccessors")) {
                 hasFastProperty = true;
-            } else if (0 == qstrcmp(classInfoName, "DefaultProperty")) {
+            } else if (0 == qstrcmp(metaObject->classInfo(idx).name(), "DefaultProperty")) {
                 _defaultPropertyName = QString::fromUtf8(metaObject->classInfo(idx).value());
-            } else if (0 == qstrcmp(classInfoName, "qt_QmlJSWrapperFactoryMethod")) {
-                const char * const factoryMethod = metaObject->classInfo(idx).value();
-                _jsFactoryMethodIndex = metaObject->indexOfSlot(factoryMethod);
-                if (_jsFactoryMethodIndex != -1)
-                    _jsFactoryMethodIndex -= metaObject->methodOffset();
             }
         }
 
index 830b8398b5be7b6bdb717409823ef9914978d3bf..96dbc72f32037f0e539b3788400a2866cf9a8a77 100644 (file)
@@ -80,8 +80,6 @@ class QQmlPropertyCacheCreator;
 class QQmlPropertyRawData
 {
 public:
-    typedef QObjectPrivate::StaticMetaCallFunction StaticMetaCallFunction;
-
     enum Flag {
         NoFlags           = 0x00000000,
         ValueTypeFlagMask = 0x0000FFFF, // Flags in valueTypeFlags must fit in this mask
@@ -328,8 +326,6 @@ public:
 
     void toMetaObjectBuilder(QMetaObjectBuilder &);
 
-    inline bool callJSFactoryMethod(QObject *object, void **args) const;
-
 protected:
     virtual void destroy();
     virtual void clear();
@@ -398,7 +394,6 @@ private:
     QByteArray _dynamicStringData;
     QString _defaultPropertyName;
     QQmlPropertyCacheMethodArguments *argumentsCache;
-    int _jsFactoryMethodIndex;
 };
 
 // QQmlMetaObject serves as a wrapper around either QMetaObject or QQmlPropertyCache.
@@ -567,17 +562,6 @@ int QQmlPropertyCache::signalOffset() const
     return signalHandlerIndexCacheStart;
 }
 
-bool QQmlPropertyCache::callJSFactoryMethod(QObject *object, void **args) const
-{
-    if (_jsFactoryMethodIndex != -1) {
-        _metaObject->d.static_metacall(object, QMetaObject::InvokeMetaMethod, _jsFactoryMethodIndex, args);
-        return true;
-    }
-    if (_parent)
-        return _parent->callJSFactoryMethod(object, args);
-    return false;
-}
-
 QQmlMetaObject::QQmlMetaObject()
 {
 }
index 8e53e8b029de3053184b72130b260fe28e9b32f9..aaa7ce04b95fbdc0de9abfd4fc9da517447cc3c9 100644 (file)
@@ -7067,6 +7067,15 @@ void QQuickItemPrivate::setHasCursorInChild(bool hasCursor)
 #endif
 }
 
+void QQuickItemPrivate::markObjects(QV4::ExecutionEngine *e)
+{
+    Q_Q(QQuickItem);
+    QV4::QObjectWrapper::markWrapper(q, e);
+
+    foreach (QQuickItem *child, childItems)
+        QQuickItemPrivate::get(child)->markObjects(e);
+}
+
 #ifndef QT_NO_CURSOR
 
 /*!
@@ -8247,38 +8256,6 @@ QAccessible::Role QQuickItemPrivate::accessibleRole() const
 }
 #endif
 
-// helper code to let a visual parent mark its visual children for the garbage collector
-
-namespace QV4 {
-namespace Heap {
-struct QQuickItemWrapper : public QObjectWrapper {
-    QQuickItemWrapper(QQuickItem *item) : QObjectWrapper(item) {}
-};
-}
-}
-
-struct QQuickItemWrapper : public QV4::QObjectWrapper {
-    V4_OBJECT2(QQuickItemWrapper, QV4::QObjectWrapper)
-    static void markObjects(QV4::Heap::Base *that, QV4::ExecutionEngine *e);
-};
-
-DEFINE_OBJECT_VTABLE(QQuickItemWrapper);
-
-void QQuickItemWrapper::markObjects(QV4::Heap::Base *that, QV4::ExecutionEngine *e)
-{
-    QObjectWrapper::Data *This = static_cast<QObjectWrapper::Data *>(that);
-    if (QQuickItem *item = static_cast<QQuickItem*>(This->object.data())) {
-        foreach (QQuickItem *child, QQuickItemPrivate::get(item)->childItems)
-            QV4::QObjectWrapper::markWrapper(child, e);
-    }
-    QV4::QObjectWrapper::markObjects(that, e);
-}
-
-quint64 QQuickItemPrivate::_q_createJSWrapper(QV4::ExecutionEngine *engine)
-{
-    return (engine->memoryManager->allocObject<QQuickItemWrapper>(q_func()))->asReturnedValue();
-}
-
 QT_END_NAMESPACE
 
 #include <moc_qquickitem.cpp>
index c4ee48fdbdc3c954a3746b89eac825a86738bb58..c5c17615ee77b1834faac869c75f6374bf9f5ffb 100644 (file)
@@ -149,7 +149,6 @@ class Q_QUICK_EXPORT QQuickItem : public QObject, public QQmlParserStatus
 
     Q_CLASSINFO("DefaultProperty", "data")
     Q_CLASSINFO("qt_HasQmlAccessors", "true")
-    Q_CLASSINFO("qt_QmlJSWrapperFactoryMethod", "_q_createJSWrapper(QV4::ExecutionEngine*)")
 
 public:
     enum Flag {
@@ -445,7 +444,6 @@ protected:
 
 private:
     Q_PRIVATE_SLOT(d_func(), void _q_resourceObjectDeleted(QObject *))
-    Q_PRIVATE_SLOT(d_func(), quint64 _q_createJSWrapper(QV4::ExecutionEngine *))
 
     friend class QQuickWindow;
     friend class QQuickWindowPrivate;
index 8cda5f89c6fc612eefa85bfca4585953ed72d4db..fed3e88b6818e36f815c65c959c9633b2c149761 100644 (file)
@@ -302,7 +302,6 @@ public:
 
     void _q_resourceObjectDeleted(QObject *);
     void _q_windowChanged(QQuickWindow *w);
-    quint64 _q_createJSWrapper(QV4::ExecutionEngine *engine);
 
     enum ChangeType {
         Geometry = 0x01,
@@ -606,6 +605,9 @@ public:
     virtual void mirrorChange() {}
 
     void setHasCursorInChild(bool hasCursor);
+
+    // recursive helper to let a visual parent mark its visual children
+    void markObjects(QV4::ExecutionEngine *e);
 };
 
 /*
index f8973ebfbae0b03da33b2161cab3052bc9f9f6af..f4e400eafb76631c34493468aa9e7c98beca03f7 100644 (file)
 
 QT_BEGIN_NAMESPACE
 
+DEFINE_OBJECT_VTABLE(QV4::QQuickRootItemMarker);
+
+QV4::Heap::QQuickRootItemMarker *QV4::QQuickRootItemMarker::create(QQmlEngine *engine, QQuickWindow *window)
+{
+    QV4::ExecutionEngine *e = QQmlEnginePrivate::getV4Engine(engine);
+    return e->memoryManager->allocObject<QQuickRootItemMarker>(window);
+}
+
+void QV4::QQuickRootItemMarker::markObjects(QV4::Heap::Base *that, QV4::ExecutionEngine *e)
+{
+    QQuickItem *root = static_cast<QQuickRootItemMarker::Data *>(that)->window->contentItem();
+    if (root) {
+        QQuickItemPrivate *rootPrivate = QQuickItemPrivate::get(root);
+        rootPrivate->markObjects(e);
+    }
+
+    QV4::Object::markObjects(that, e);
+}
+
 void QQuickViewPrivate::init(QQmlEngine* e)
 {
     Q_Q(QQuickView);
@@ -69,10 +88,10 @@ void QQuickViewPrivate::init(QQmlEngine* e)
         engine.data()->setIncubationController(q->incubationController());
 
     {
-        // The content item has CppOwnership policy (set in QQuickWindow). Ensure the presence of a JS
-        // wrapper so that the garbage collector can see the policy.
         QV4::ExecutionEngine *v4 = QQmlEnginePrivate::getV4Engine(engine.data());
-        QV4::QObjectWrapper::wrap(v4, contentItem);
+        QV4::Scope scope(v4);
+        QV4::Scoped<QV4::QQuickRootItemMarker> v(scope, QV4::QQuickRootItemMarker::create(engine.data(), q));
+        rootItemMarker.set(v4, v);
     }
 }
 
index fd033daf2fbcd24a55be3851caceedb5e110b62b..1bbff0de0edd220555e148fb406fa46e1eaf47c5 100644 (file)
@@ -108,8 +108,37 @@ public:
     QQuickView::ResizeMode resizeMode;
     QSize initialSize;
     QElapsedTimer frameTimer;
+    QV4::PersistentValue rootItemMarker;
 };
 
+namespace QV4 {
+namespace Heap {
+
+struct QQuickRootItemMarker : Object {
+    inline QQuickRootItemMarker(QQuickWindow *window)
+        : window(window)
+    {
+    }
+
+    QQuickWindow *window;
+};
+
+}
+
+struct QQuickRootItemMarker : public Object
+{
+    V4_OBJECT2(QQuickRootItemMarker, Object)
+
+    static Heap::QQuickRootItemMarker *create(QQmlEngine *engine, QQuickWindow *window);
+
+    static void markObjects(QV4::Heap::Base *that, QV4::ExecutionEngine *e);
+
+};
+
+
+
+}
+
 QT_END_NAMESPACE
 
 #endif // QQUICKVIEW_P_H
index deb44ce34dac433089c90ddd8793689ca42f76cb..e3f62a71237c5d30b2428be3af7b7e59bdcfcbb3 100644 (file)
@@ -105,11 +105,12 @@ void QQuickWindowQmlImpl::classBegin()
         if (e && !e->incubationController())
             e->setIncubationController(incubationController());
     }
+    Q_ASSERT(e);
     {
-        // The content item has CppOwnership policy (set in QQuickWindow). Ensure the presence of a JS
-        // wrapper so that the garbage collector can see the policy.
         QV4::ExecutionEngine *v4 = QQmlEnginePrivate::getV4Engine(e);
-        QV4::QObjectWrapper::wrap(v4, d->contentItem);
+        QV4::Scope scope(v4);
+        QV4::ScopedObject v(scope, QV4::QQuickRootItemMarker::create(e, this));
+        d->rootItemMarker = v;
     }
 }
 
index 536bb40dccac95d2cc8940875dd82433990ca987..9fedfb21abad15b005201925bdf8529502bb69e3 100644 (file)
@@ -1771,56 +1771,56 @@ static void gc(QQmlEngine &engine)
 
 void tst_qquickitem::visualParentOwnership()
 {
-    QQmlEngine engine;
-    QQmlComponent component(&engine, testFileUrl("visualParentOwnership.qml"));
+    QQuickView view;
+    view.setSource(testFileUrl("visualParentOwnership.qml"));
 
-    QScopedPointer<QQuickItem> root(qobject_cast<QQuickItem*>(component.create()));
+    QQuickItem *root = qobject_cast<QQuickItem*>(view.rootObject());
     QVERIFY(root);
 
     QVariant newObject;
     {
-        QVERIFY(QMetaObject::invokeMethod(root.data(), "createItemWithoutParent", Q_RETURN_ARG(QVariant, newObject)));
+        QVERIFY(QMetaObject::invokeMethod(root, "createItemWithoutParent", Q_RETURN_ARG(QVariant, newObject)));
         QPointer<QQuickItem> newItem = qvariant_cast<QQuickItem*>(newObject);
         QVERIFY(!newItem.isNull());
 
         QVERIFY(!newItem->parent());
         QVERIFY(!newItem->parentItem());
 
-        newItem->setParentItem(root.data());
+        newItem->setParentItem(root);
 
-        gc(engine);
+        gc(*view.engine());
 
         QVERIFY(!newItem.isNull());
         newItem->setParentItem(0);
 
-        gc(engine);
+        gc(*view.engine());
         QVERIFY(newItem.isNull());
     }
     {
-        QVERIFY(QMetaObject::invokeMethod(root.data(), "createItemWithoutParent", Q_RETURN_ARG(QVariant, newObject)));
+        QVERIFY(QMetaObject::invokeMethod(root, "createItemWithoutParent", Q_RETURN_ARG(QVariant, newObject)));
         QPointer<QQuickItem> firstItem = qvariant_cast<QQuickItem*>(newObject);
         QVERIFY(!firstItem.isNull());
 
-        firstItem->setParentItem(root.data());
+        firstItem->setParentItem(root);
 
-        QVERIFY(QMetaObject::invokeMethod(root.data(), "createItemWithoutParent", Q_RETURN_ARG(QVariant, newObject)));
+        QVERIFY(QMetaObject::invokeMethod(root, "createItemWithoutParent", Q_RETURN_ARG(QVariant, newObject)));
         QPointer<QQuickItem> secondItem = qvariant_cast<QQuickItem*>(newObject);
         QVERIFY(!firstItem.isNull());
 
         secondItem->setParentItem(firstItem);
 
-        gc(engine);
+        gc(*view.engine());
 
         delete firstItem;
 
         root->setProperty("keepAliveProperty", newObject);
 
-        gc(engine);
+        gc(*view.engine());
         QVERIFY(!secondItem.isNull());
 
         root->setProperty("keepAliveProperty", QVariant());
 
-        gc(engine);
+        gc(*view.engine());
         QVERIFY(secondItem.isNull());
     }
 }