Fix QObject V8 wrapping for extended types
authorAaron Kennedy <aaron.kennedy@nokia.com>
Wed, 7 Dec 2011 14:20:01 +0000 (14:20 +0000)
committerQt by Nokia <qt-info@nokia.com>
Wed, 7 Dec 2011 14:22:37 +0000 (15:22 +0100)
The meta object for extended types must be marked as dynamic, to prevent
their properties from being marked as IsDirect.

Task-number: QTBUG-22997
Change-Id: I825f94f072cb46981706221a1044c9e2feeedcc2
Reviewed-by: Simon Hausmann <simon.hausmann@nokia.com>
Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
src/declarative/qml/qdeclarativemetatype.cpp
tests/auto/declarative/qdeclarativeecmascript/data/extendedObjectPropertyLookup2.qml [new file with mode: 0644]
tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp

index c175d72..ac89eb9 100644 (file)
@@ -429,8 +429,10 @@ void QDeclarativeTypePrivate::init() const
     // XXX - very inefficient
     const QMetaObject *mo = m_baseMetaObject;
     if (m_extFunc) {
-        QMetaObject *mmo = new QMetaObject;
-        *mmo = *m_extMetaObject;
+        QMetaObjectBuilder builder;
+        clone(builder, m_extMetaObject, m_extMetaObject, m_extMetaObject);
+        builder.setFlags(QMetaObjectBuilder::DynamicMetaObject);
+        QMetaObject *mmo = builder.toMetaObject();
         mmo->d.superdata = mo;
         QDeclarativeProxyMetaObject::ProxyData data = { mmo, m_extFunc, 0, 0 };
         m_metaObjects << data;
@@ -443,6 +445,7 @@ void QDeclarativeTypePrivate::init() const
             if (t->d->m_extFunc) {
                 QMetaObjectBuilder builder;
                 clone(builder, t->d->m_extMetaObject, t->d->m_baseMetaObject, m_baseMetaObject);
+                builder.setFlags(QMetaObjectBuilder::DynamicMetaObject);
                 QMetaObject *mmo = builder.toMetaObject();
                 mmo->d.superdata = m_baseMetaObject;
                 if (!m_metaObjects.isEmpty())
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/extendedObjectPropertyLookup2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/extendedObjectPropertyLookup2.qml
new file mode 100644 (file)
index 0000000..e4af335
--- /dev/null
@@ -0,0 +1,14 @@
+import Qt.test 1.0
+import QtQuick 2.0
+
+QtObject {
+    id: root
+    property MyExtendedObject a;
+    a: MyExtendedObject {
+        id: obj
+        extendedProperty: 42;
+    }
+    function getValue() {
+        return obj.extendedProperty;
+    }
+}
index 5e62ec6..31d4feb 100644 (file)
@@ -114,6 +114,7 @@ private slots:
     void objectHasOwnProperty();
     void selfDeletingBinding();
     void extendedObjectPropertyLookup();
+    void extendedObjectPropertyLookup2();
     void scriptErrors();
     void functionErrors();
     void propertyAssignmentErrors();
@@ -1361,6 +1362,21 @@ void tst_qdeclarativeecmascript::extendedObjectPropertyLookup()
 }
 
 /*
+Test that extended object properties can be accessed correctly.
+*/
+void tst_qdeclarativeecmascript::extendedObjectPropertyLookup2()
+{
+    QDeclarativeComponent component(&engine, TEST_FILE("extendedObjectPropertyLookup2.qml"));
+    QObject *object = component.create();
+    QVERIFY(object != 0);
+
+    QVariant returnValue;
+    QVERIFY(QMetaObject::invokeMethod(object, "getValue", Q_RETURN_ARG(QVariant, returnValue)));
+    QCOMPARE(returnValue.toInt(), 42);
+
+    delete object;
+}
+/*
 Test file/lineNumbers for binding/Script errors.
 */
 void tst_qdeclarativeecmascript::scriptErrors()