diff options
Diffstat (limited to 'src/qml/qml')
-rw-r--r-- | src/qml/qml/qqmlvaluetype.cpp | 3 | ||||
-rw-r--r-- | src/qml/qml/qqmlvaluetypewrapper.cpp | 13 | ||||
-rw-r--r-- | src/qml/qml/qqmlvaluetypewrapper_p.h | 1 | ||||
-rw-r--r-- | src/qml/qml/v8/qv8engine.cpp | 18 |
4 files changed, 29 insertions, 6 deletions
diff --git a/src/qml/qml/qqmlvaluetype.cpp b/src/qml/qml/qqmlvaluetype.cpp index e22e0f8fdc..e901a9c0d7 100644 --- a/src/qml/qml/qqmlvaluetype.cpp +++ b/src/qml/qml/qqmlvaluetype.cpp @@ -107,6 +107,9 @@ const QMetaObject *QQmlValueTypeFactoryImpl::metaObjectForMetaType(int t) break; } + QMetaType metaType(t); + if (metaType.flags() & QMetaType::IsGadget) + return metaType.metaObject(); return 0; } diff --git a/src/qml/qml/qqmlvaluetypewrapper.cpp b/src/qml/qml/qqmlvaluetypewrapper.cpp index 8ed1169ec7..00b206f0dc 100644 --- a/src/qml/qml/qqmlvaluetypewrapper.cpp +++ b/src/qml/qml/qqmlvaluetypewrapper.cpp @@ -133,7 +133,7 @@ bool QQmlValueTypeReference::readReferenceValue() const if (QQmlValueTypeFactory::isValueType(variantReferenceType)) { QQmlPropertyCache *cache = 0; if (const QMetaObject *mo = QQmlValueTypeFactory::metaObjectForMetaType(variantReferenceType)) - cache = QQmlEnginePrivate::get(engine())->cache(mo); + cache = QJSEnginePrivate::get(engine())->cache(mo); if (d()->gadgetPtr) QMetaType::destroy(d()->metaType, d()->gadgetPtr); d()->gadgetPtr = 0; @@ -177,7 +177,7 @@ ReturnedValue QQmlValueTypeWrapper::create(ExecutionEngine *engine, QObject *obj ScopedObject proto(scope, engine->qmlExtensions()->valueTypeWrapperPrototype); r->setPrototype(proto); r->d()->object = object; r->d()->property = property; - r->d()->propertyCache = QQmlEnginePrivate::get(engine)->cache(metaObject); + r->d()->propertyCache = QJSEnginePrivate::get(engine)->cache(metaObject); r->d()->metaType = typeId; r->d()->gadgetPtr = QMetaType::create(r->d()->metaType); return r->asReturnedValue(); @@ -191,7 +191,7 @@ ReturnedValue QQmlValueTypeWrapper::create(ExecutionEngine *engine, const QVaria Scoped<QQmlValueTypeWrapper> r(scope, engine->memoryManager->alloc<QQmlValueTypeWrapper>(engine)); ScopedObject proto(scope, engine->qmlExtensions()->valueTypeWrapperPrototype); r->setPrototype(proto); - r->d()->propertyCache = QQmlEnginePrivate::get(engine)->cache(metaObject); + r->d()->propertyCache = QJSEnginePrivate::get(engine)->cache(metaObject); r->d()->metaType = typeId; r->d()->gadgetPtr = QMetaType::create(r->d()->metaType); r->d()->setValue(value); @@ -206,6 +206,13 @@ QVariant QQmlValueTypeWrapper::toVariant() const return d()->toVariant(); } +void QQmlValueTypeWrapper::toGadget(void *data) const +{ + int typeId = d()->metaType; + QMetaType::destruct(typeId, data); + QMetaType::construct(typeId, data, d()->gadget()); +} + void QQmlValueTypeWrapper::destroy(Heap::Base *that) { Heap::QQmlValueTypeWrapper *w = static_cast<Heap::QQmlValueTypeWrapper *>(that); diff --git a/src/qml/qml/qqmlvaluetypewrapper_p.h b/src/qml/qml/qqmlvaluetypewrapper_p.h index ad883266bd..2d0fbcbf52 100644 --- a/src/qml/qml/qqmlvaluetypewrapper_p.h +++ b/src/qml/qml/qqmlvaluetypewrapper_p.h @@ -84,6 +84,7 @@ public: static ReturnedValue create(ExecutionEngine *engine, const QVariant &, const QMetaObject *metaObject, int typeId); QVariant toVariant() const; + void toGadget(void *data) const; bool isEqual(const QVariant& value); static ReturnedValue get(Managed *m, String *name, bool *hasProperty); diff --git a/src/qml/qml/v8/qv8engine.cpp b/src/qml/qml/v8/qv8engine.cpp index cf66c5c2f3..0a309c2775 100644 --- a/src/qml/qml/v8/qv8engine.cpp +++ b/src/qml/qml/v8/qv8engine.cpp @@ -700,10 +700,14 @@ QV4::ReturnedValue QV8Engine::metaTypeToJS(int type, const void *data) QByteArray typeName = QMetaType::typeName(type); if (typeName.endsWith('*') && !*reinterpret_cast<void* const *>(data)) { return QV4::Encode::null(); - } else { - // Fall back to wrapping in a QVariant. - return QV4::Encode(m_v4Engine->newVariantObject(QVariant(type, data))); } + QMetaType mt(type); + if (mt.flags() & QMetaType::IsGadget) { + Q_ASSERT(mt.metaObject()); + return QV4::QQmlValueTypeWrapper::create(m_v4Engine, QVariant(type, data), mt.metaObject(), type); + } + // Fall back to wrapping in a QVariant. + return QV4::Encode(m_v4Engine->newVariantObject(QVariant(type, data))); } } Q_UNREACHABLE(); @@ -835,6 +839,14 @@ bool QV8Engine::metaTypeFromJS(const QV4::ValueRef value, int type, void *data) ; } + { + QV4::Scoped<QV4::QQmlValueTypeWrapper> vtw(scope, value); + if (vtw && vtw->d()->metaType == type) { + vtw->toGadget(data); + return true; + } + } + #if 0 if (isQtVariant(value)) { const QVariant &var = variantValue(value); |