From c3f5ea992a7e57ad23cc5bcdcdb3f1e8188993f6 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Wed, 8 May 2013 13:16:20 +0200 Subject: [PATCH] Move qqmlvmemetaobject over to use QV4::PersistentValue Change-Id: Ifdf57d6cb266a7b63fec9f1f85bda8070c44036f Reviewed-by: Simon Hausmann --- src/qml/qml/qqmlvmemetaobject.cpp | 37 ++++++++++++++++++++----------------- src/qml/qml/qqmlvmemetaobject_p.h | 4 +++- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/src/qml/qml/qqmlvmemetaobject.cpp b/src/qml/qml/qqmlvmemetaobject.cpp index 0f808db..69a7b1a 100644 --- a/src/qml/qml/qqmlvmemetaobject.cpp +++ b/src/qml/qml/qqmlvmemetaobject.cpp @@ -53,6 +53,8 @@ #include #include +#include + QT_BEGIN_NAMESPACE QQmlVMEVariantQObjectPtr::QQmlVMEVariantQObjectPtr(bool isVar) @@ -67,9 +69,10 @@ QQmlVMEVariantQObjectPtr::~QQmlVMEVariantQObjectPtr() void QQmlVMEVariantQObjectPtr::objectDestroyed(QObject *) { if (m_target && m_index >= 0) { - if (m_isVar && m_target->varPropertiesInitialized && !m_target->varProperties.IsEmpty()) { + if (m_isVar && m_target->varPropertiesInitialized && !m_target->varProperties.isEmpty()) { // Set the var property to NULL - m_target->varProperties->Set(m_index - m_target->firstVarPropertyIndex, QV4::Value::nullValue()); + QV4::ArrayObject *a = m_target->varProperties.value().asArrayObject(); + a->putIndexed(m_index - m_target->firstVarPropertyIndex, QV4::Value::nullValue()); } m_target->activate(m_target->object, m_target->methodOffset() + m_index, 0); @@ -604,9 +607,6 @@ QQmlVMEMetaObject::~QQmlVMEMetaObject() delete [] aliasEndpoints; delete [] v8methods; - if (metaData->varPropertyCount) - qPersistentDispose(varProperties); // if not weak, will not have been cleaned up by the callback. - qDeleteAll(varObjectGuards); } @@ -995,7 +995,7 @@ v8::Handle QQmlVMEMetaObject::readVarProperty(int id) Q_ASSERT(id >= firstVarPropertyIndex); if (ensureVarPropertiesAllocated()) - return varProperties->Get(id - firstVarPropertyIndex); + return varProperties.value().asObject()->getIndexed(id - firstVarPropertyIndex); return v8::Handle(); } @@ -1003,7 +1003,8 @@ QVariant QQmlVMEMetaObject::readPropertyAsVariant(int id) { if (id >= firstVarPropertyIndex) { if (ensureVarPropertiesAllocated()) - return QQmlEnginePrivate::get(ctxt->engine)->v8engine()->toVariant(varProperties->Get(id - firstVarPropertyIndex)->v4Value(), -1); + return QQmlEnginePrivate::get(ctxt->engine)->v8engine()->toVariant( + varProperties.value().asObject()->getIndexed(id - firstVarPropertyIndex), -1); return QVariant(); } else { if (data[id].dataType() == QMetaType::QObjectStar) { @@ -1022,7 +1023,7 @@ void QQmlVMEMetaObject::writeVarProperty(int id, v8::Handle value) // Importantly, if the current value is a scarce resource, we need to ensure that it // gets automatically released by the engine if no other references to it exist. - v8::Handle oldv = varProperties->Get(id - firstVarPropertyIndex); + v8::Handle oldv = varProperties.value().asObject()->getIndexed(id - firstVarPropertyIndex); if (oldv->IsObject()) { QV8VariantResource *r = v8_resource_cast(v8::Handle::Cast(oldv)); if (r) { @@ -1055,7 +1056,7 @@ void QQmlVMEMetaObject::writeVarProperty(int id, v8::Handle value) } // Write the value and emit change signal as appropriate. - varProperties->Set(id - firstVarPropertyIndex, value); + varProperties.value().asObject()->putIndexed(id - firstVarPropertyIndex, value->v4Value()); activate(object, methodOffset() + id, 0); } @@ -1067,7 +1068,7 @@ void QQmlVMEMetaObject::writeProperty(int id, const QVariant &value) // Importantly, if the current value is a scarce resource, we need to ensure that it // gets automatically released by the engine if no other references to it exist. - v8::Handle oldv = varProperties->Get(id - firstVarPropertyIndex); + v8::Handle oldv = varProperties.value().asObject()->getIndexed(id - firstVarPropertyIndex); if (oldv->IsObject()) { QV8VariantResource *r = v8_resource_cast(v8::Handle::Cast(oldv)); if (r) { @@ -1087,7 +1088,7 @@ void QQmlVMEMetaObject::writeProperty(int id, const QVariant &value) // Write the value and emit change signal as appropriate. QVariant currentValue = readPropertyAsVariant(id); - varProperties->Set(id - firstVarPropertyIndex, newv); + varProperties.value().asObject()->putIndexed(id - firstVarPropertyIndex, newv->v4Value()); if ((currentValue.userType() != value.userType() || currentValue != value)) activate(object, methodOffset() + id, 0); } else { @@ -1218,14 +1219,15 @@ bool QQmlVMEMetaObject::ensureVarPropertiesAllocated() // QObject ptr will not yet have been deleted (eg, waiting on deleteLater). // In this situation, the varProperties handle will be (and should remain) // empty. - return !varProperties.IsEmpty(); + return !varProperties.isEmpty(); } // see also: QV8GCCallback::garbageCollectorPrologueCallback() void QQmlVMEMetaObject::allocateVarPropertiesArray() { - varProperties = qPersistentNew(v8::Array::New(metaData->varPropertyCount)); - varProperties.MakeWeak(static_cast(this), VarPropertiesWeakReferenceCallback); + varProperties = v8::Array::New(metaData->varPropertyCount)->v4Value(); + // ### FIXME +// varProperties.MakeWeak(static_cast(this), VarPropertiesWeakReferenceCallback); varPropertiesInitialized = true; } @@ -1241,7 +1243,7 @@ void QQmlVMEMetaObject::VarPropertiesWeakReferenceCallback(v8::Persistent(parameter); Q_ASSERT(vmemo); qPersistentDispose(object); - vmemo->varProperties.Clear(); + vmemo->varProperties.clear(); } void QQmlVMEMetaObject::GcPrologueCallback(QV8GCCallback::Node *node) @@ -1266,9 +1268,10 @@ void QQmlVMEMetaObject::GcPrologueCallback(QV8GCCallback::Node *node) } // add references created by var properties - if (!vmemo->varPropertiesInitialized || vmemo->varProperties.IsEmpty()) + if (!vmemo->varPropertiesInitialized || vmemo->varProperties.isEmpty()) return; - ep->v8engine()->addRelationshipForGC(vmemo->object, vmemo->varProperties); + // ### FIXME + // ep->v8engine()->addRelationshipForGC(vmemo->object, vmemo->varProperties); } bool QQmlVMEMetaObject::aliasTarget(int index, QObject **target, int *coreIndex, int *valueTypeIndex) const diff --git a/src/qml/qml/qqmlvmemetaobject_p.h b/src/qml/qml/qqmlvmemetaobject_p.h index ea9ccf2..bf812d5 100644 --- a/src/qml/qml/qqmlvmemetaobject_p.h +++ b/src/qml/qml/qqmlvmemetaobject_p.h @@ -73,6 +73,8 @@ #include +#include + QT_BEGIN_NAMESPACE #define QML_ALIAS_FLAG_PTR 0x00000001 @@ -203,7 +205,7 @@ public: QQmlVMEVariant *data; QQmlVMEMetaObjectEndpoint *aliasEndpoints; - v8::Persistent varProperties; + QV4::PersistentValue varProperties; int firstVarPropertyIndex; bool varPropertiesInitialized; static void VarPropertiesWeakReferenceCallback(v8::Persistent object, void* parameter); -- 2.7.4