diff options
author | Liang Qi <liang.qi@qt.io> | 2016-10-01 22:27:26 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2016-10-01 22:27:26 +0200 |
commit | ead7aea128d81118886721585058b45f037f5613 (patch) | |
tree | d04f8bce4221d7aa40b6e4ef64a28c193a12fa07 /src/qml/qml | |
parent | 7e742bff27491b5ecd8713540940683264c240a2 (diff) | |
parent | 5f4299eb597b89df20189a5c5a6235287e54b636 (diff) |
Merge remote-tracking branch 'origin/5.8' into dev
Conflicts:
src/qml/jsruntime/qv4qobjectwrapper.cpp
Change-Id: I1a125b2334532ec5de4af39c0d6628890f4d0587
Diffstat (limited to 'src/qml/qml')
-rw-r--r-- | src/qml/qml/qqmlcomponent.cpp | 6 | ||||
-rw-r--r-- | src/qml/qml/qqmlcontextwrapper.cpp | 3 | ||||
-rw-r--r-- | src/qml/qml/qqmlcontextwrapper_p.h | 2 | ||||
-rw-r--r-- | src/qml/qml/qqmllistwrapper.cpp | 2 | ||||
-rw-r--r-- | src/qml/qml/qqmllistwrapper_p.h | 2 | ||||
-rw-r--r-- | src/qml/qml/qqmltypeloader.cpp | 7 | ||||
-rw-r--r-- | src/qml/qml/qqmltypewrapper.cpp | 2 | ||||
-rw-r--r-- | src/qml/qml/qqmltypewrapper_p.h | 2 | ||||
-rw-r--r-- | src/qml/qml/qqmlvaluetypewrapper.cpp | 5 | ||||
-rw-r--r-- | src/qml/qml/qqmlvmemetaobject.cpp | 6 | ||||
-rw-r--r-- | src/qml/qml/v8/qqmlbuiltinfunctions.cpp | 2 |
11 files changed, 28 insertions, 11 deletions
diff --git a/src/qml/qml/qqmlcomponent.cpp b/src/qml/qml/qqmlcomponent.cpp index 41f804f0ae..6eda23c4c3 100644 --- a/src/qml/qml/qqmlcomponent.cpp +++ b/src/qml/qml/qqmlcomponent.cpp @@ -1059,8 +1059,9 @@ namespace Heap { struct QmlIncubatorObject : Object { QmlIncubatorObject(QQmlIncubator::IncubationMode = QQmlIncubator::Asynchronous); + ~QmlIncubatorObject() { parent.destroy(); } QScopedPointer<QQmlComponentIncubator> incubator; - QPointer<QObject> parent; + QQmlQPointer<QObject> parent; QV4::Value valuemap; QV4::Value statusChanged; Pointer<Heap::QmlContext> qmlContext; @@ -1486,8 +1487,9 @@ QQmlComponentExtension::~QQmlComponentExtension() QV4::Heap::QmlIncubatorObject::QmlIncubatorObject(QQmlIncubator::IncubationMode m) : valuemap(QV4::Primitive::undefinedValue()) , statusChanged(QV4::Primitive::undefinedValue()) - , qmlContext(0) { + parent.init(); + qmlContext = nullptr; incubator.reset(new QQmlComponentIncubator(this, m)); } diff --git a/src/qml/qml/qqmlcontextwrapper.cpp b/src/qml/qml/qqmlcontextwrapper.cpp index 2d0ebad764..13d708bc17 100644 --- a/src/qml/qml/qqmlcontextwrapper.cpp +++ b/src/qml/qml/qqmlcontextwrapper.cpp @@ -66,14 +66,15 @@ Heap::QmlContextWrapper::QmlContextWrapper(QQmlContextData *context, QObject *sc , ownsContext(ownsContext) , isNullWrapper(false) , context(context) - , scopeObject(scopeObject) { + this->scopeObject.init(scopeObject); } Heap::QmlContextWrapper::~QmlContextWrapper() { if (context && ownsContext) context->destroy(); + scopeObject.destroy(); } ReturnedValue QmlContextWrapper::qmlScope(ExecutionEngine *v4, QQmlContextData *ctxt, QObject *scope) diff --git a/src/qml/qml/qqmlcontextwrapper_p.h b/src/qml/qml/qqmlcontextwrapper_p.h index ca7fcf1d75..2b8c16f274 100644 --- a/src/qml/qml/qqmlcontextwrapper_p.h +++ b/src/qml/qml/qqmlcontextwrapper_p.h @@ -71,7 +71,7 @@ struct QmlContextWrapper : Object { bool isNullWrapper; QQmlGuardedContextData context; - QPointer<QObject> scopeObject; + QQmlQPointer<QObject> scopeObject; }; } diff --git a/src/qml/qml/qqmllistwrapper.cpp b/src/qml/qml/qqmllistwrapper.cpp index 5c35866274..425a720867 100644 --- a/src/qml/qml/qqmllistwrapper.cpp +++ b/src/qml/qml/qqmllistwrapper.cpp @@ -54,6 +54,7 @@ DEFINE_OBJECT_VTABLE(QmlListWrapper); Heap::QmlListWrapper::QmlListWrapper() { + object.init(); QV4::Scope scope(internalClass->engine); QV4::ScopedObject o(scope, this); o->setArrayType(Heap::ArrayData::Custom); @@ -61,6 +62,7 @@ Heap::QmlListWrapper::QmlListWrapper() Heap::QmlListWrapper::~QmlListWrapper() { + object.destroy(); } ReturnedValue QmlListWrapper::create(ExecutionEngine *engine, QObject *object, int propId, int propType) diff --git a/src/qml/qml/qqmllistwrapper_p.h b/src/qml/qml/qqmllistwrapper_p.h index 26e1e5faaf..1107b957c9 100644 --- a/src/qml/qml/qqmllistwrapper_p.h +++ b/src/qml/qml/qqmllistwrapper_p.h @@ -68,7 +68,7 @@ namespace Heap { struct QmlListWrapper : Object { QmlListWrapper(); ~QmlListWrapper(); - QPointer<QObject> object; + QQmlQPointer<QObject> object; QQmlListProperty<QObject> property; int propertyType; }; diff --git a/src/qml/qml/qqmltypeloader.cpp b/src/qml/qml/qqmltypeloader.cpp index d4dc668bdc..7730233a93 100644 --- a/src/qml/qml/qqmltypeloader.cpp +++ b/src/qml/qml/qqmltypeloader.cpp @@ -1967,10 +1967,13 @@ void QQmlTypeLoader::trimCache() QList<TypeCache::Iterator> unneededTypes; for (TypeCache::Iterator iter = m_typeCache.begin(), end = m_typeCache.end(); iter != end; ++iter) { QQmlTypeData *typeData = iter.value(); + + const bool hasError = !typeData->m_compiledData && !typeData->m_errors.isEmpty(); + const bool isNotReferenced = typeData->isComplete() && typeData->m_compiledData + && typeData->m_compiledData->count() == 1; // typeData->m_compiledData may be set early on in the proccess of loading a file, so it's important // to check the general loading status of the typeData before making any other decisions. - if (typeData->isComplete() && typeData->m_compiledData && typeData->count() == 1 - && typeData->m_compiledData->count() == 1) { + if (typeData->count() == 1 && (hasError || isNotReferenced)) { // There are no live objects of this type unneededTypes.append(iter); } diff --git a/src/qml/qml/qqmltypewrapper.cpp b/src/qml/qml/qqmltypewrapper.cpp index 7892555f08..28c2588117 100644 --- a/src/qml/qml/qqmltypewrapper.cpp +++ b/src/qml/qml/qqmltypewrapper.cpp @@ -58,12 +58,14 @@ DEFINE_OBJECT_VTABLE(QmlTypeWrapper); Heap::QmlTypeWrapper::QmlTypeWrapper() : mode(IncludeEnums) { + object.init(); } Heap::QmlTypeWrapper::~QmlTypeWrapper() { if (typeNamespace) typeNamespace->release(); + object.destroy(); } bool QmlTypeWrapper::isSingleton() const diff --git a/src/qml/qml/qqmltypewrapper_p.h b/src/qml/qml/qqmltypewrapper_p.h index 8216526cb5..7c5105b184 100644 --- a/src/qml/qml/qqmltypewrapper_p.h +++ b/src/qml/qml/qqmltypewrapper_p.h @@ -74,7 +74,7 @@ struct QmlTypeWrapper : Object { QmlTypeWrapper(); ~QmlTypeWrapper(); TypeNameMode mode; - QPointer<QObject> object; + QQmlQPointer<QObject> object; QQmlType *type; QQmlTypeNameCache *typeNamespace; diff --git a/src/qml/qml/qqmlvaluetypewrapper.cpp b/src/qml/qml/qqmlvaluetypewrapper.cpp index 2566ab06b5..6b308374e6 100644 --- a/src/qml/qml/qqmlvaluetypewrapper.cpp +++ b/src/qml/qml/qqmlvaluetypewrapper.cpp @@ -63,8 +63,9 @@ namespace Heap { struct QQmlValueTypeReference : QQmlValueTypeWrapper { - QQmlValueTypeReference() {} - QPointer<QObject> object; + QQmlValueTypeReference() { object.init(); } + ~QQmlValueTypeReference() { object.destroy(); } + QQmlQPointer<QObject> object; int property; }; diff --git a/src/qml/qml/qqmlvmemetaobject.cpp b/src/qml/qml/qqmlvmemetaobject.cpp index c8281f02c0..4f13b44fc0 100644 --- a/src/qml/qml/qqmlvmemetaobject.cpp +++ b/src/qml/qml/qqmlvmemetaobject.cpp @@ -608,6 +608,9 @@ QRectF QQmlVMEMetaObject::readPropertyAsRectF(int id) return v->d()->data.value<QRectF>(); } +#if defined(Q_OS_WINRT) && defined(_M_ARM) +#pragma optimize("", off) +#endif int QQmlVMEMetaObject::metaCall(QObject *o, QMetaObject::Call c, int _id, void **a) { Q_ASSERT(o == object); @@ -969,6 +972,9 @@ int QQmlVMEMetaObject::metaCall(QObject *o, QMetaObject::Call c, int _id, void * else return object->qt_metacall(c, _id, a); } +#if defined(Q_OS_WINRT) && defined(_M_ARM) +#pragma optimize("", on) +#endif QV4::ReturnedValue QQmlVMEMetaObject::method(int index) { diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp index 5d70b17ece..222b61ae49 100644 --- a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp +++ b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp @@ -1304,8 +1304,8 @@ ReturnedValue QtObject::method_locale(CallContext *ctx) Heap::QQmlBindingFunction::QQmlBindingFunction(const QV4::FunctionObject *originalFunction) : QV4::Heap::FunctionObject(originalFunction->scope(), originalFunction->name()) - , originalFunction(originalFunction->d()) { + this->originalFunction = originalFunction->d(); } void QQmlBindingFunction::initBindingLocation() |