Skip to content

Commit

Permalink
Fix QObject V8 wrapping for extended types
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Aaron Kennedy authored and Qt by Nokia committed Dec 7, 2011
1 parent 01cb691 commit 1c3a4e6
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 2 deletions.
7 changes: 5 additions & 2 deletions src/declarative/qml/qdeclarativemetatype.cpp
Expand Up @@ -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;
Expand All @@ -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())
Expand Down
@@ -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;
}
}
Expand Up @@ -114,6 +114,7 @@ private slots:
void objectHasOwnProperty();
void selfDeletingBinding();
void extendedObjectPropertyLookup();
void extendedObjectPropertyLookup2();
void scriptErrors();
void functionErrors();
void propertyAssignmentErrors();
Expand Down Expand Up @@ -1360,6 +1361,21 @@ void tst_qdeclarativeecmascript::extendedObjectPropertyLookup()
delete object;
}

/*
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.
*/
Expand Down

0 comments on commit 1c3a4e6

Please sign in to comment.