diff options
Diffstat (limited to 'src/declarative/qml/qdeclarativeengine.cpp')
-rw-r--r-- | src/declarative/qml/qdeclarativeengine.cpp | 57 |
1 files changed, 34 insertions, 23 deletions
diff --git a/src/declarative/qml/qdeclarativeengine.cpp b/src/declarative/qml/qdeclarativeengine.cpp index c5afe92..96145fb 100644 --- a/src/declarative/qml/qdeclarativeengine.cpp +++ b/src/declarative/qml/qdeclarativeengine.cpp @@ -155,7 +155,7 @@ QDeclarativeEnginePrivate::QDeclarativeEnginePrivate(QDeclarativeEngine *e) : captureProperties(false), rootContext(0), currentExpression(0), isDebugging(false), contextClass(0), sharedContext(0), sharedScope(0), objectClass(0), valueTypeClass(0), globalClass(0), cleanup(0), erroredBindings(0), inProgressCreations(0), - scriptEngine(this), workerScriptEngine(0), componentAttacheds(0), inBeginCreate(false), + scriptEngine(this), workerScriptEngine(0), componentAttached(0), inBeginCreate(false), networkAccessManager(0), networkAccessManagerFactory(0), typeManager(e), uniqueId(1) { @@ -350,14 +350,23 @@ typedef QMap<QString, QString> StringStringMap; Q_GLOBAL_STATIC(StringStringMap, qmlEnginePluginsWithRegisteredTypes); // stores the uri -void QDeclarativeDeclarativeData::destroyed(QDeclarativeData *d, QObject *o) +void QDeclarativePrivate::qdeclarativeelement_destructor(QObject *o) { - static_cast<QDeclarativeDeclarativeData *>(d)->destroyed(o); + QObjectPrivate *p = QObjectPrivate::get(o); + Q_ASSERT(p->declarativeData); + QDeclarativeData *d = static_cast<QDeclarativeData*>(p->declarativeData); + if (d->ownContext) + d->context->destroy(); } -void QDeclarativeDeclarativeData::parentChanged(QDeclarativeData *d, QObject *o, QObject *p) +void QDeclarativeData::destroyed(QAbstractDeclarativeData *d, QObject *o) { - static_cast<QDeclarativeDeclarativeData *>(d)->parentChanged(o, p); + static_cast<QDeclarativeData *>(d)->destroyed(o); +} + +void QDeclarativeData::parentChanged(QAbstractDeclarativeData *d, QObject *o, QObject *p) +{ + static_cast<QDeclarativeData *>(d)->parentChanged(o, p); } void QDeclarativeEnginePrivate::init() @@ -367,7 +376,7 @@ void QDeclarativeEnginePrivate::init() qRegisterMetaType<QDeclarativeScriptString>("QDeclarativeScriptString"); qRegisterMetaType<QScriptValue>("QScriptValue"); - QDeclarativeDeclarativeData::init(); + QDeclarativeData::init(); contextClass = new QDeclarativeContextScriptClass(q); objectClass = new QDeclarativeObjectScriptClass(q); @@ -659,8 +668,8 @@ QDeclarativeContext *QDeclarativeEngine::contextForObject(const QObject *object) QObjectPrivate *priv = QObjectPrivate::get(const_cast<QObject *>(object)); - QDeclarativeDeclarativeData *data = - static_cast<QDeclarativeDeclarativeData *>(priv->declarativeData); + QDeclarativeData *data = + static_cast<QDeclarativeData *>(priv->declarativeData); if (!data) return 0; @@ -683,7 +692,7 @@ void QDeclarativeEngine::setContextForObject(QObject *object, QDeclarativeContex if (!object || !context) return; - QDeclarativeDeclarativeData *data = QDeclarativeDeclarativeData::get(object, true); + QDeclarativeData *data = QDeclarativeData::get(object, true); if (data->context) { qWarning("QDeclarativeEngine::setContextForObject(): Object already has a QDeclarativeContext"); return; @@ -734,7 +743,7 @@ void QDeclarativeEngine::setContextForObject(QObject *object, QDeclarativeContex */ void QDeclarativeEngine::setObjectOwnership(QObject *object, ObjectOwnership ownership) { - QDeclarativeDeclarativeData *ddata = QDeclarativeDeclarativeData::get(object, true); + QDeclarativeData *ddata = QDeclarativeData::get(object, true); if (!ddata) return; @@ -747,7 +756,7 @@ void QDeclarativeEngine::setObjectOwnership(QObject *object, ObjectOwnership own */ QDeclarativeEngine::ObjectOwnership QDeclarativeEngine::objectOwnership(QObject *object) { - QDeclarativeDeclarativeData *ddata = QDeclarativeDeclarativeData::get(object, false); + QDeclarativeData *ddata = QDeclarativeData::get(object, false); if (!ddata) return CppOwnership; else @@ -756,14 +765,14 @@ QDeclarativeEngine::ObjectOwnership QDeclarativeEngine::objectOwnership(QObject void qmlExecuteDeferred(QObject *object) { - QDeclarativeDeclarativeData *data = QDeclarativeDeclarativeData::get(object); + QDeclarativeData *data = QDeclarativeData::get(object); if (data && data->deferredComponent) { QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(data->context->engine); QDeclarativeComponentPrivate::ConstructionState state; - QDeclarativeComponentPrivate::beginDeferred(data->context, ep, object, &state); + QDeclarativeComponentPrivate::beginDeferred(ep, object, &state); data->deferredComponent->release(); data->deferredComponent = 0; @@ -789,7 +798,7 @@ QDeclarativeEngine *qmlEngine(const QObject *obj) QObject *qmlAttachedPropertiesObjectById(int id, const QObject *object, bool create) { - QDeclarativeDeclarativeData *data = QDeclarativeDeclarativeData::get(object); + QDeclarativeData *data = QDeclarativeData::get(object); if (!data) return 0; // Attached properties are only on objects created by QML @@ -824,7 +833,7 @@ QObject *qmlAttachedPropertiesObject(int *idCache, const QObject *object, return qmlAttachedPropertiesObjectById(*idCache, object, create); } -void QDeclarativeDeclarativeData::destroyed(QObject *object) +void QDeclarativeData::destroyed(QObject *object) { if (deferredComponent) deferredComponent->release(); @@ -851,7 +860,7 @@ void QDeclarativeDeclarativeData::destroyed(QObject *object) if (propertyCache) propertyCache->release(); - if (ownContext) + if (ownContext && context) context->destroy(); QDeclarativeGuard<QObject> *guard = guards; @@ -871,12 +880,12 @@ void QDeclarativeDeclarativeData::destroyed(QObject *object) delete this; } -void QDeclarativeDeclarativeData::parentChanged(QObject *, QObject *parent) +void QDeclarativeData::parentChanged(QObject *, QObject *parent) { if (!parent && scriptValue) { delete scriptValue; scriptValue = 0; } } -bool QDeclarativeDeclarativeData::hasBindingBit(int bit) const +bool QDeclarativeData::hasBindingBit(int bit) const { if (bindingBitsSize > bit) return bindingBits[bit / 32] & (1 << (bit % 32)); @@ -884,13 +893,13 @@ bool QDeclarativeDeclarativeData::hasBindingBit(int bit) const return false; } -void QDeclarativeDeclarativeData::clearBindingBit(int bit) +void QDeclarativeData::clearBindingBit(int bit) { if (bindingBitsSize > bit) bindingBits[bit / 32] &= ~(1 << (bit % 32)); } -void QDeclarativeDeclarativeData::setBindingBit(QObject *obj, int bit) +void QDeclarativeData::setBindingBit(QObject *obj, int bit) { if (bindingBitsSize <= bit) { int props = obj->metaObject()->propertyCount(); @@ -956,7 +965,7 @@ QScriptValue QDeclarativeEnginePrivate::createComponent(QScriptContext *ctxt, QS QUrl url = QUrl(context->resolvedUrl(QUrl(arg))); QDeclarativeComponent *c = new QDeclarativeComponent(activeEngine, url, activeEngine); QDeclarativeComponentPrivate::get(c)->creationContext = context; - QDeclarativeDeclarativeData::get(c, true)->setImplicitDestructible(); + QDeclarativeData::get(c, true)->setImplicitDestructible(); return activeEnginePriv->objectClass->newQObject(c, qMetaTypeId<QDeclarativeComponent*>()); } } @@ -1027,7 +1036,7 @@ QScriptValue QDeclarativeEnginePrivate::createQmlObject(QScriptContext *ctxt, QS if(gobj && gparent) gobj->setParentItem(gparent); - QDeclarativeDeclarativeData::get(obj, true)->setImplicitDestructible(); + QDeclarativeData::get(obj, true)->setImplicitDestructible(); return activeEnginePriv->objectClass->newQObject(obj, QMetaType::QObjectStar); } @@ -1356,7 +1365,9 @@ QScriptValue QDeclarativeEnginePrivate::scriptValueFromVariant(const QVariant &v rv.setProperty(ii, objectClass->newQObject(object)); } return rv; - } + } else if (QDeclarativeValueType *vt = valueTypes[val.userType()]) { + return valueTypeClass->newObject(val, vt); + } bool objOk; QObject *obj = QDeclarativeMetaType::toQObject(val, &objOk); |