diff options
-rw-r--r-- | src/qml/jsruntime/qv4qobjectwrapper.cpp | 4 | ||||
-rw-r--r-- | src/qml/qml/qqmlvaluetypewrapper.cpp | 65 | ||||
-rw-r--r-- | src/qml/qml/qqmlvaluetypewrapper_p.h | 7 | ||||
-rw-r--r-- | src/qml/qml/v8/qv8engine.cpp | 4 |
4 files changed, 40 insertions, 40 deletions
diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp index b8d0c887fe..4b33ab31ff 100644 --- a/src/qml/jsruntime/qv4qobjectwrapper.cpp +++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp @@ -202,7 +202,7 @@ static QV4::ReturnedValue LoadProperty(QV8Engine *engine, QObject *object, if (QQmlValueTypeFactory::isValueType(v.userType())) { if (const QMetaObject *valueTypeMetaObject = QQmlValueTypeFactory::metaObjectForMetaType(v.userType())) - return QV4::QQmlValueTypeWrapper::create(engine, object, property.coreIndex, valueTypeMetaObject, v.userType()); // VariantReference value-type. + return QV4::QQmlValueTypeWrapper::create(v4, object, property.coreIndex, valueTypeMetaObject, v.userType()); // VariantReference value-type. } return engine->fromVariant(v); @@ -210,7 +210,7 @@ static QV4::ReturnedValue LoadProperty(QV8Engine *engine, QObject *object, Q_ASSERT(notifier == 0); if (const QMetaObject *valueTypeMetaObject = QQmlValueTypeFactory::metaObjectForMetaType(property.propType)) - return QV4::QQmlValueTypeWrapper::create(engine, object, property.coreIndex, valueTypeMetaObject, property.propType); + return QV4::QQmlValueTypeWrapper::create(v4, object, property.coreIndex, valueTypeMetaObject, property.propType); } else { Q_ASSERT(notifier == 0); diff --git a/src/qml/qml/qqmlvaluetypewrapper.cpp b/src/qml/qml/qqmlvaluetypewrapper.cpp index 5d065a785f..b4f0cde315 100644 --- a/src/qml/qml/qqmlvaluetypewrapper.cpp +++ b/src/qml/qml/qqmlvaluetypewrapper.cpp @@ -55,7 +55,7 @@ namespace Heap { struct QQmlValueTypeReference : QQmlValueTypeWrapper { - QQmlValueTypeReference(QV8Engine *engine); + QQmlValueTypeReference(ExecutionEngine *engine); QPointer<QObject> object; int property; }; @@ -77,14 +77,13 @@ DEFINE_OBJECT_VTABLE(QV4::QQmlValueTypeReference); using namespace QV4; -Heap::QQmlValueTypeWrapper::QQmlValueTypeWrapper(QV8Engine *engine) - : Heap::Object(QV8Engine::getV4(engine)) - , v8(engine) +Heap::QQmlValueTypeWrapper::QQmlValueTypeWrapper(ExecutionEngine *engine) + : Heap::Object(engine) { setVTable(QV4::QQmlValueTypeWrapper::staticVTable()); } -Heap::QQmlValueTypeReference::QQmlValueTypeReference(QV8Engine *engine) +Heap::QQmlValueTypeReference::QQmlValueTypeReference(ExecutionEngine *engine) : Heap::QQmlValueTypeWrapper(engine) { setVTable(QV4::QQmlValueTypeReference::staticVTable()); @@ -138,27 +137,25 @@ void QQmlValueTypeWrapper::initProto(ExecutionEngine *v4) v4->qmlExtensions()->valueTypeWrapperPrototype = o->d(); } -ReturnedValue QQmlValueTypeWrapper::create(QV8Engine *v8, QObject *object, int property, const QMetaObject *metaObject, int typeId) +ReturnedValue QQmlValueTypeWrapper::create(ExecutionEngine *engine, QObject *object, int property, const QMetaObject *metaObject, int typeId) { - ExecutionEngine *v4 = QV8Engine::getV4(v8); - Scope scope(v4); - initProto(v4); + Scope scope(engine); + initProto(engine); - Scoped<QQmlValueTypeReference> r(scope, v4->memoryManager->alloc<QQmlValueTypeReference>(v8)); - ScopedObject proto(scope, v4->qmlExtensions()->valueTypeWrapperPrototype); + Scoped<QQmlValueTypeReference> r(scope, engine->memoryManager->alloc<QQmlValueTypeReference>(engine)); + ScopedObject proto(scope, engine->qmlExtensions()->valueTypeWrapperPrototype); r->setPrototype(proto); r->d()->type.reset(new QQmlValueType(typeId, metaObject)); r->d()->object = object; r->d()->property = property; return r->asReturnedValue(); } -ReturnedValue QQmlValueTypeWrapper::create(QV8Engine *v8, const QVariant &value, const QMetaObject *metaObject, int typeId) +ReturnedValue QQmlValueTypeWrapper::create(ExecutionEngine *engine, const QVariant &value, const QMetaObject *metaObject, int typeId) { - ExecutionEngine *v4 = QV8Engine::getV4(v8); - Scope scope(v4); - initProto(v4); + Scope scope(engine); + initProto(engine); - Scoped<QQmlValueTypeWrapper> r(scope, v4->memoryManager->alloc<QQmlValueTypeWrapper>(v8)); - ScopedObject proto(scope, v4->qmlExtensions()->valueTypeWrapperPrototype); + Scoped<QQmlValueTypeWrapper> r(scope, engine->memoryManager->alloc<QQmlValueTypeWrapper>(engine)); + ScopedObject proto(scope, engine->qmlExtensions()->valueTypeWrapperPrototype); r->setPrototype(proto); r->d()->type.reset(new QQmlValueType(typeId, metaObject)); r->d()->type->setValue(value); return r->asReturnedValue(); @@ -203,8 +200,10 @@ PropertyAttributes QQmlValueTypeWrapper::query(const Managed *m, String *name) QQmlData *ddata = QQmlData::get(r->d()->type.data(), false); if (ddata && ddata->propertyCache) result = ddata->propertyCache->property(name, 0, 0); - else - result = QQmlPropertyCache::property(r->d()->v8->engine(), r->d()->type.data(), name, 0, local); + else { + QQmlEngine *engine = qobject_cast<QQmlEngine*>(r->engine()->v8Engine->publicEngine()); + result = QQmlPropertyCache::property(engine, r->d()->type.data(), name, 0, local); + } } return result ? Attr_Data : Attr_Invalid; } @@ -256,8 +255,10 @@ ReturnedValue QQmlValueTypeWrapper::get(Managed *m, String *name, bool *hasPrope QQmlData *ddata = QQmlData::get(r->d()->type.data(), false); if (ddata && ddata->propertyCache) result = ddata->propertyCache->property(name, 0, 0); - else - result = QQmlPropertyCache::property(r->d()->v8->engine(), r->d()->type.data(), name, 0, local); + else { + QQmlEngine *engine = qobject_cast<QQmlEngine*>(r->engine()->v8Engine->publicEngine()); + result = QQmlPropertyCache::property(engine, r->d()->type.data(), name, 0, local); + } } if (!result) @@ -278,19 +279,19 @@ ReturnedValue QQmlValueTypeWrapper::get(Managed *m, String *name, bool *hasPrope cpptype v; \ void *args[] = { &v, 0 }; \ QMetaObject::metacall(r->d()->type.data(), QMetaObject::ReadProperty, result->coreIndex, args); \ - return constructor(v); \ + return QV4::Encode(constructor(v)); \ } // These four types are the most common used by the value type wrappers - VALUE_TYPE_LOAD(QMetaType::QReal, qreal, QV4::Encode); - VALUE_TYPE_LOAD(QMetaType::Int, int, QV4::Encode); - VALUE_TYPE_LOAD(QMetaType::QString, QString, r->d()->v8->toString); - VALUE_TYPE_LOAD(QMetaType::Bool, bool, QV4::Encode); + VALUE_TYPE_LOAD(QMetaType::QReal, qreal, qreal); + VALUE_TYPE_LOAD(QMetaType::Int, int, int); + VALUE_TYPE_LOAD(QMetaType::QString, QString, v4->newString); + VALUE_TYPE_LOAD(QMetaType::Bool, bool, bool); QVariant v(result->propType, (void *)0); void *args[] = { v.data(), 0 }; QMetaObject::metacall(r->d()->type.data(), QMetaObject::ReadProperty, result->coreIndex, args); - return r->d()->v8->fromVariant(v); + return v4->v8Engine->fromVariant(v); #undef VALUE_TYPE_ACCESSOR } @@ -323,13 +324,13 @@ void QQmlValueTypeWrapper::put(Managed *m, String *name, const ValueRef value) if (f) { if (!f->bindingKeyFlag()) { // assigning a JS function to a non-var-property is not allowed. - QString error = QLatin1String("Cannot assign JavaScript function to value-type property"); - Scoped<String> e(scope, r->d()->v8->toString(error)); + QString error = QStringLiteral("Cannot assign JavaScript function to value-type property"); + Scoped<String> e(scope, v4->newString(error)); v4->throwError(e); return; } - QQmlContextData *context = r->d()->v8->callingContext(); + QQmlContextData *context = QmlContextWrapper::callingContext(v4); QQmlPropertyData cacheData; cacheData.setFlags(QQmlPropertyData::IsWritable | @@ -353,7 +354,7 @@ void QQmlValueTypeWrapper::put(Managed *m, String *name, const ValueRef value) oldBinding->destroy(); if (!f) { - QVariant v = r->d()->v8->toVariant(value, -1); + QVariant v = v4->v8Engine->toVariant(value, -1); if (p.isEnumType() && (QMetaType::Type)v.type() == QMetaType::Double) v = v.toInt(); @@ -373,7 +374,7 @@ void QQmlValueTypeWrapper::put(Managed *m, String *name, const ValueRef value) if (index == -1) return; - QVariant v = r->d()->v8->toVariant(value, -1); + QVariant v = v4->v8Engine->toVariant(value, -1); QMetaProperty p = r->d()->type->metaObject()->property(index); p.write(r->d()->type.data(), v); diff --git a/src/qml/qml/qqmlvaluetypewrapper_p.h b/src/qml/qml/qqmlvaluetypewrapper_p.h index 46f9f29304..b729997674 100644 --- a/src/qml/qml/qqmlvaluetypewrapper_p.h +++ b/src/qml/qml/qqmlvaluetypewrapper_p.h @@ -61,8 +61,7 @@ namespace QV4 { namespace Heap { struct QQmlValueTypeWrapper : Object { - QQmlValueTypeWrapper(QV8Engine *engine); - QV8Engine *v8; + QQmlValueTypeWrapper(ExecutionEngine *engine); mutable QScopedPointer<QQmlValueType> type; }; @@ -75,8 +74,8 @@ struct Q_QML_EXPORT QQmlValueTypeWrapper : Object public: - static ReturnedValue create(QV8Engine *v8, QObject *, int, const QMetaObject *metaObject, int typeId); - static ReturnedValue create(QV8Engine *v8, const QVariant &, const QMetaObject *metaObject, int typeId); + static ReturnedValue create(ExecutionEngine *engine, QObject *, int, const QMetaObject *metaObject, int typeId); + static ReturnedValue create(ExecutionEngine *engine, const QVariant &, const QMetaObject *metaObject, int typeId); QVariant toVariant() const; bool isEqual(const QVariant& value); diff --git a/src/qml/qml/v8/qv8engine.cpp b/src/qml/qml/v8/qv8engine.cpp index 2d36e51c8b..e779c090be 100644 --- a/src/qml/qml/v8/qv8engine.cpp +++ b/src/qml/qml/v8/qv8engine.cpp @@ -414,7 +414,7 @@ QV4::ReturnedValue QV8Engine::fromVariant(const QVariant &variant) } if (const QMetaObject *vtmo = QQmlValueTypeFactory::metaObjectForMetaType(type)) - return QV4::QQmlValueTypeWrapper::create(this, variant, vtmo, type); + return QV4::QQmlValueTypeWrapper::create(m_v4Engine, variant, vtmo, type); } else { QV4::Scope scope(m_v4Engine); if (type == qMetaTypeId<QQmlListReference>()) { @@ -455,7 +455,7 @@ QV4::ReturnedValue QV8Engine::fromVariant(const QVariant &variant) return retn.asReturnedValue(); if (const QMetaObject *vtmo = QQmlValueTypeFactory::metaObjectForMetaType(type)) - return QV4::QQmlValueTypeWrapper::create(this, variant, vtmo, type); + return QV4::QQmlValueTypeWrapper::create(m_v4Engine, variant, vtmo, type); } // XXX TODO: To be compatible, we still need to handle: |