diff options
author | Lars Knoll <lars.knoll@digia.com> | 2013-05-08 13:16:20 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2013-05-08 15:25:14 +0200 |
commit | c3f5ea992a7e57ad23cc5bcdcdb3f1e8188993f6 (patch) | |
tree | 7e764c3432af887e02d9dd0b3c86b292ec3a9775 /src/qml/qml/qqmlvmemetaobject.cpp | |
parent | fe5869292055a3ff94cd90b8a9d2816d7b874fe3 (diff) |
Move qqmlvmemetaobject over to use QV4::PersistentValue
Change-Id: Ifdf57d6cb266a7b63fec9f1f85bda8070c44036f
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/qml/qqmlvmemetaobject.cpp')
-rw-r--r-- | src/qml/qml/qqmlvmemetaobject.cpp | 37 |
1 files changed, 20 insertions, 17 deletions
diff --git a/src/qml/qml/qqmlvmemetaobject.cpp b/src/qml/qml/qqmlvmemetaobject.cpp index 0f808db9a5..69a7b1a0d9 100644 --- a/src/qml/qml/qqmlvmemetaobject.cpp +++ b/src/qml/qml/qqmlvmemetaobject.cpp @@ -53,6 +53,8 @@ #include <private/qv8variantresource_p.h> #include <private/qqmlglobal_p.h> +#include <private/qv4object_p.h> + 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<v8::Value> 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<v8::Value>(); } @@ -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<v8::Value> 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<v8::Value> oldv = varProperties->Get(id - firstVarPropertyIndex); + v8::Handle<v8::Value> oldv = varProperties.value().asObject()->getIndexed(id - firstVarPropertyIndex); if (oldv->IsObject()) { QV8VariantResource *r = v8_resource_cast<QV8VariantResource>(v8::Handle<v8::Object>::Cast(oldv)); if (r) { @@ -1055,7 +1056,7 @@ void QQmlVMEMetaObject::writeVarProperty(int id, v8::Handle<v8::Value> 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<v8::Value> oldv = varProperties->Get(id - firstVarPropertyIndex); + v8::Handle<v8::Value> oldv = varProperties.value().asObject()->getIndexed(id - firstVarPropertyIndex); if (oldv->IsObject()) { QV8VariantResource *r = v8_resource_cast<QV8VariantResource>(v8::Handle<v8::Object>::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<void*>(this), VarPropertiesWeakReferenceCallback); + varProperties = v8::Array::New(metaData->varPropertyCount)->v4Value(); + // ### FIXME +// varProperties.MakeWeak(static_cast<void*>(this), VarPropertiesWeakReferenceCallback); varPropertiesInitialized = true; } @@ -1241,7 +1243,7 @@ void QQmlVMEMetaObject::VarPropertiesWeakReferenceCallback(v8::Persistent<v8::Va QQmlVMEMetaObject *vmemo = static_cast<QQmlVMEMetaObject*>(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 |